...函数开始... var dd sys_refcursor;begin getResult(dd);----你返回的结果集合,返回给游标dd ...... for i in dd loop ... end;....函数结束 如果是java...... csmt.registerOutParameter(8,OracleTypes.CURSOR); ........ rs = ((ResultSet) csmt.getObject(8)); .... while(rs.next()){....} ....
有可能我没有说清楚,我说详细点。 A存储过程有两个参数,一个是in,一个是out,out输出为sys_refcursor类型。输出的结果是一个类似表的结果集,有多个字段。目前我通过B存储过程去调用A存储过程,但不知道该怎么读取调用后结果集里每个列里的字段信息。 在网上找了下针对sys_refcursor信息,只发现了针对表的,说是先对表建个游标cur,然后再定义一个TMPCURSOR%ROWTYPE变量var,然后再fetch将cur into var;最后用DBMS_OUTPUT.PUT_LINE(var.字段)这样就能读出来。3楼给的SQL代码好像不行啊。
SQL> CREATE TABLE emp_new AS SELECT * FROM emp WHERE 1=2;表已创建。SQL> select * from emp_new;未选定行SQL> CREATE OR REPLACE PROCEDURE proc_test1 2 (pi_deptno IN emp.deptno%TYPE, 3 po_emp OUT SYS_REFCURSOR) 4 IS 5 6 BEGIN 7 OPEN po_emp FOR SELECT * FROM emp WHERE deptno=pi_deptno; 8 END proc_test1; 9 /过程已创建。SQL> CREATE OR REPLACE PROCEDURE proc_test2 2 IS 3 emp_rec emp%ROWTYPE; 4 c_emp SYS_REFCURSOR; 5 BEGIN 6 proc_test1(10,c_emp); 7 LOOP 8 FETCH c_emp INTO emp_rec; 9 EXIT WHEN c_emp%NOTFOUND; 10 INSERT INTO emp_new VALUES (emp_rec.empno,emp_rec.ename,emp_rec.job, 11 emp_rec.mgr,emp_rec.hiredate,emp_rec.sal,emp_rec.comm,emp_rec.dept no); 12 END LOOP; 13 14 COMMIT; 15 16 END proc_test2; 17 /过程已创建。SQL> show error 没有错误。 SQL> select * from emp_new;未选定行SQL> exec proc_test2;PL/SQL 过程已成功完成。SQL> select * from emp_new; EMPNO ENAME JOB MGR HIREDATE SAL COMM ---------- ---------- --------- ---------- -------------- ---------- ---------- DEPTNO ---------- 7782 CLARK MANAGER 7839 09-6月 -81 2450 10 7839 KING PRESIDENT 17-11月-81 5000 10 7934 MILLER CLERK 7782 23-1月 -82 1300 10 SQL>
insert into ... select ...select部分即你的sys_refcursor返回结果集。
OPEN-FOR(打开游标变量,与多行查询连接起来) FETCH(从结果集中取行数据),close(关闭游标变量)
...函数开始...
var dd sys_refcursor;begin
getResult(dd);----你返回的结果集合,返回给游标dd
......
for i in dd loop
...
end;....函数结束
如果是java......
csmt.registerOutParameter(8,OracleTypes.CURSOR);
........
rs = ((ResultSet) csmt.getObject(8));
....
while(rs.next()){....}
....
A存储过程有两个参数,一个是in,一个是out,out输出为sys_refcursor类型。输出的结果是一个类似表的结果集,有多个字段。目前我通过B存储过程去调用A存储过程,但不知道该怎么读取调用后结果集里每个列里的字段信息。
在网上找了下针对sys_refcursor信息,只发现了针对表的,说是先对表建个游标cur,然后再定义一个TMPCURSOR%ROWTYPE变量var,然后再fetch将cur into var;最后用DBMS_OUTPUT.PUT_LINE(var.字段)这样就能读出来。3楼给的SQL代码好像不行啊。
2 (pi_deptno IN emp.deptno%TYPE,
3 po_emp OUT SYS_REFCURSOR)
4 IS
5
6 BEGIN
7 OPEN po_emp FOR SELECT * FROM emp WHERE deptno=pi_deptno;
8 END proc_test1;
9 /过程已创建。SQL> CREATE OR REPLACE PROCEDURE proc_test2
2 IS
3 emp_rec emp%ROWTYPE;
4 c_emp SYS_REFCURSOR;
5 BEGIN
6 proc_test1(10,c_emp);
7 LOOP
8 FETCH c_emp INTO emp_rec;
9 EXIT WHEN c_emp%NOTFOUND;
10 INSERT INTO emp_new VALUES (emp_rec.empno,emp_rec.ename,emp_rec.job,
11 emp_rec.mgr,emp_rec.hiredate,emp_rec.sal,emp_rec.comm,emp_rec.dept
no);
12 END LOOP;
13
14 COMMIT;
15
16 END proc_test2;
17 /过程已创建。SQL> show error
没有错误。
SQL> select * from emp_new;未选定行SQL> exec proc_test2;PL/SQL 过程已成功完成。SQL> select * from emp_new; EMPNO ENAME JOB MGR HIREDATE SAL COMM
---------- ---------- --------- ---------- -------------- ---------- ----------
DEPTNO
----------
7782 CLARK MANAGER 7839 09-6月 -81 2450
10 7839 KING PRESIDENT 17-11月-81 5000
10 7934 MILLER CLERK 7782 23-1月 -82 1300
10
SQL>
m_cur sys_refcursor;
M_DEV_SUBTYPE VARCHAR2(20) ;
M_RESOURCE_INSTANCE_CODE VARCHAR2(50) ;
M_SALES_RESOURCE_NAME VARCHAR2(250) ;
M_STORAGE_NAME VARCHAR2(100) ;
M_CURR_STATE VARCHAR2(60) ;
M_DC_DEVICE_SCODE VARCHAR2(20) ;
M_NC_SALES_RESOURCE_ID VARCHAR2(50) ;
M_SALES_RESOURCE_ID NUMBER(9) ;
M_STORAGE_CODE VARCHAR2(21) ;
M_DN_NO VARCHAR2(20) ;
M_LAN_NAME VARCHAR2(40) ;BEGIN m_device_code :='FA4B9E52';
zczx_bss_wjz.get_device_inf(m_device_code,m_cur); loop
fetch m_cur into M_DEV_SUBTYPE,
M_RESOURCE_INSTANCE_CODE,
M_SALES_RESOURCE_NAME,
M_STORAGE_NAME,
M_CURR_STATE,
M_DC_DEVICE_SCODE,
M_NC_SALES_RESOURCE_ID,
M_SALES_RESOURCE_ID,
M_STORAGE_CODE,
M_DN_NO,
M_LAN_NAME;dbms_output.put_line(to_char(M_RESOURCE_INSTANCE_CODE));
dbms_output.put_line(to_char(M_SALES_RESOURCE_NAME));
dbms_output.put_line(to_char(M_STORAGE_CODE));
dbms_output.put_line(to_char(M_CURR_STATE));
dbms_output.put_line(to_char(M_RESOURCE_INSTANCE_CODE));
dbms_output.put_line(to_char(M_DC_DEVICE_SCODE));
dbms_output.put_line(to_char(M_SALES_RESOURCE_ID));
dbms_output.put_line(to_char(M_DN_NO));
dbms_output.put_line(to_char(M_LAN_NAME));
exit when m_cur%notfound;
end loop;
虽然笨了点,但也达到了目的啊。呵呵!
谢谢楼上的结贴。