有一个存储A过程其输入一个值,返回一个sys_refcursor的结果集
现在我想读取sys_refcursor的结果集,并插入到一个表里。不知道该怎么读取。请教下高手

解决方案 »

  1.   

    你想通过该存储过程插入,还是通过外部程序如JAVA插入?如果通过存储过程,则可直接
    insert into ... select ...select部分即你的sys_refcursor返回结果集。
      

  2.   

    和操作游标一样的操作啊,但是首先你得接收存储过程返回的游标,定义一个变量接收,然后
    OPEN-FOR(打开游标变量,与多行查询连接起来) FETCH(从结果集中取行数据),close(关闭游标变量)
      

  3.   


    ...函数开始...
    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()){....}
    ....
      

  4.   

    有可能我没有说清楚,我说详细点。
    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代码好像不行啊。
      

  5.   

    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>
      

  6.   

    省事点,直接这样写:INSERT INTO emp_new VALUES emp_rec;
      

  7.   

    我自己也找到了种方法CREATE OR REPLACE PROCEDURE PROC_CUST_TOTALASm_device_code varchar2(100);
    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;
    虽然笨了点,但也达到了目的啊。呵呵!
    谢谢楼上的结贴。