oracle不太熟悉,似乎是这样CREATE OR REPLACE PROCEDURE TEST AS BEGIN select * from xxx END;
我当初就是这么写得,可总是报错,说SELECT语句缺乏INTO字句!真是晕死了!
CREATE OR REPLACE PROCEDURE PRO_RETURN_RS( out_rs out sys_refcursor ) AS BEGIN open out_rs for SELECT * FROM xxx; END;CallableStatement call = cn.prepareCall("{call pro_return_rs(?)}"); call.registerOutParameter(1, OracleTypes.CURSOR); call.execute(); ResultSet rs = (ResultSet) call.getObject(1);
java中使用如楼上各位的 但是 oracle 数据库端定义 要在 packages 和 package bodies 里面建立存储 packages : create or replace package report is type ref_cur is ref cursor; procedure getCur (cur out report.ref_cur); end report;package bodies : create or replace package body report is procedure getCur (cur out report.ref_cur) is begin open cur for select * from yourtable; end; end report;java 调用:objConnection.prepareCall(" BEGIN report.getCur(?); END; ");
CREATE OR REPLACE PACKAGE pk_utils AS TYPE rc IS REF CURSOR; PROCEDURE querybysql (p_sql_text IN VARCHAR2, p_cursor OUT rc); END pk_utils; /CREATE OR REPLACE PACKAGE BODY pk_utils AS PROCEDURE querybysql (p_sql_text IN VARCHAR2, p_cursor OUT rc) IS BEGIN OPEN p_cursor FOR p_sql_text; END; END pk_utils; /Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn = DriverManager.getConnection( "dbc:oracle:thin:@127.0.0.1:1521:testdb", "test", "test"); CallableStatement cs = conn.prepareCall("{call pk_utils.querybysql(?,?)}"); cs.setString(1, "SELECT USER_CODE, USER_NAME FROM USERINFO WHERE ROWNUM<10");// 输入参数 cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);// 输出参数 cs.execute(); ResultSet rs = (ResultSet) cs.getObject(2); while (rs.next()) { System.out.println(rs.getString(1)); } 测试通过
String sql="select first_name from s_emp";
PreparedStatement ps=con.prepareStatement(sql);
ResultSet rs=ps.exexuteQuery();
ResultSet rs=ps.executeQuer();
CallableStatement cs = connection.prepareCall("{call myprocin(?)}");
cs.setString(1, "a string");
ResultSet rs = cs.executeQuery();
} catch (SQLException e) {
}
我就想查询一张表,将其中的记录放到ResultSet中,想使用存储过程。
但不知道怎么搞!
这是你在数据库里面定义的存储过程名字呀
CREATE PROCEDURE myprocin
@str varchar(50)
AS
--你的业务逻辑
...
--你要返回的结果集
select * from xxx
GO
就是在查询方面想得到一个ResultSet对象,却总是不行。
都郁闷了,哪位能给我详细的讲讲么?
都晕死了,你说我要INTO字句干嘛呀!
CREATE PROCEDURE myprocin
@str varchar(50)
AS
--你的业务逻辑
...
--你要返回的结果集
select * from xxx
GO
是SQLServer的语法,不是Oracle的吧?
Class.forName("oracle.jdbc.driver.Oracle.Driver");
Connection conn=DriverManager.getConnection("jdbc:oracle:@localhost:1521:XE","sccot","tiger");
Statement stmt=conn.createStatement();
ResultSet rs=stm.executeQuery(sql);
大虾们:多多指点一下小弟啦!
能给个例子么?
oracle的存储过程和sqlserver的存储过程java都是那么调用,你说的是数据库的存储过程怎么写谁知道你的是怎么写的,你把存储过程的代码贴出来啊,谁知道你说的什么INTO是从哪里来的
这个要求本身就是有问题的。数据处理可以完全在Oracle上直接实现(通过存储过程封装),存储过程执行结束后返回给JAVA环境的就是一个简单的值就可以了,然后在用JAVA程序来控制业务的跳转。没有必要让存储过程返回的内容再用JAVA封装成ResultSet对象呀!
这个需要本身就是很很奇怪的!
我知道JAVA调用存储过程都是一样的,其实问题出在那个ORACLE存储过程我不知道该怎么写。
AS
BEGIN
select * from xxx
END;
out_rs out sys_refcursor
)
AS
BEGIN
open out_rs for
SELECT * FROM xxx;
END;CallableStatement call = cn.prepareCall("{call pro_return_rs(?)}");
call.registerOutParameter(1, OracleTypes.CURSOR);
call.execute();
ResultSet rs = (ResultSet) call.getObject(1);
但是 oracle 数据库端定义 要在
packages 和 package bodies 里面建立存储
packages :
create or replace package report is
type ref_cur is ref cursor;
procedure getCur (cur out report.ref_cur);
end report;package bodies :
create or replace package body report is
procedure getCur (cur out report.ref_cur) is
begin
open cur for
select * from yourtable;
end;
end report;java 调用:objConnection.prepareCall(" BEGIN report.getCur(?); END; ");
我在Oracle方面还是个菜鸟,对你上面的代码还有两点不够明白:
一是为什么游标是输出型的参数。
二是我在JAVA中调用时难道还要定义一个游标???要真是这样,我该怎么定义这个游标?
(我的问题是不是很可笑啊?呵呵,没办法,真的不懂)
AS
TYPE rc IS REF CURSOR; PROCEDURE querybysql (p_sql_text IN VARCHAR2, p_cursor OUT rc);
END pk_utils;
/CREATE OR REPLACE PACKAGE BODY pk_utils
AS
PROCEDURE querybysql (p_sql_text IN VARCHAR2, p_cursor OUT rc)
IS
BEGIN
OPEN p_cursor FOR p_sql_text;
END;
END pk_utils;
/Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection( "dbc:oracle:thin:@127.0.0.1:1521:testdb", "test", "test");
CallableStatement cs = conn.prepareCall("{call pk_utils.querybysql(?,?)}");
cs.setString(1, "SELECT USER_CODE, USER_NAME FROM USERINFO WHERE ROWNUM<10");// 输入参数
cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);// 输出参数
cs.execute();
ResultSet rs = (ResultSet) cs.getObject(2);
while (rs.next()) {
System.out.println(rs.getString(1));
}
测试通过
我在Oracle方面还是个菜鸟,对你上面的代码还有两点不够明白:
一是为什么游标是输出型的参数。
--- 需要返回一个数据行的集合的话,方式之一就是 给游标定义一个游标类型的返回参数。
二是我在JAVA中调用时难道还要定义一个游标???要真是这样,我该怎么定义这个游标?
(我的问题是不是很可笑啊?呵呵,没办法,真的不懂)
--- java 里面不需要 用游标类型接收, 用 DataSet 类型接受就可以。
下面是我的java source CallableStatement objCallableStatement
= objConnection.prepareCall(" BEGIN report.getCur(?); END; ");
objCallableStatement.registerOutParameter(1,OracleTypes.CURSOR);
objCallableStatement.execute();
ResultSet objResultSet = (ResultSet)objCallableStatement.getObject(1);