CREATE OR Replace Procedure p_temp_procedure
(
    cur_arg out Sys_Refcursor    
)
Isbegin
    open cur_arg for select * from emp;
End p_temp_procedure;
 
 
 --调用该过程
 
 declare
    cur_calling sys_refcursor;
begin
    p_temp_procedure(cur_calling);  
    for rec_next in cur_calling loop
    Null;
    end loop;
end;
-------------------------这样的错误
PLS-00221: 'CUR_CALLING' 不是过程或尚未定义

解决方案 »

  1.   

    CREATE OR REPLACE PROCEDURE p_temp_procedure(cur_arg OUT SYS_REFCURSOR) IS
    BEGIN
      OPEN cur_arg FOR
        SELECT * FROM emp;
    END p_temp_procedure;
    /
    DECLARE
      cur_calling SYS_REFCURSOR;
      r_emp       emp%ROWTYPE;
    BEGIN
      p_temp_procedure(cur_calling);
      --动态游标不要使用for循环,因为open类动游标已经打开
      --for循环再打开回出错
      LOOP
        FETCH cur_calling
          INTO r_emp;
        EXIT WHEN cur_calling%NOTFOUND;
        dbms_output.put_line(r_emp.ename);
      END LOOP;
      CLOSE cur_calling;
    END;
    /
      

  2.   

    --另外,你还可以在sqlplus下直接打印游标
    SQL> var cur refcursor;
    SQL> exec p_temp_procedure(:cur);PL/SQL 过程已成功完成。SQL> print :cur;     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
          7369 SMITH      CLERK           7902 17-12月-80            800                    20
          7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30
          7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30
          7566 JONES      MANAGER         7839 02-4月 -81           2975                    20
          7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30
          7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30
          7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10
          7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20
          7839 KING       PRESIDENT            17-11月-81           5000                    10
          7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30
          7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
          7900 JAMES      CLERK           7698 03-12月-81            950                    30
          7902 FORD       ANALYST         7566 03-12月-81           3000                    20
          7934 MILLER     CLERK           7782 23-1月 -82           1300                    10已选择14行。SQL> 
      

  3.   

    SQL PLUS 下 写:var cur refcursorexec p_temp_procedure(:cur)print cur
      

  4.   

    declare
      cur_calling sys_refcursor;
      emp_rec emp%rowtype;
    begin
      p_temp_procedure(cur_calling);   
      
      loop
      fetch cur_calling into emp_rec ;
      exit when cur_calling%notfound;
      dbms_output.put_line(emp_rec.empno||' '||emp_rec.ename||' '||....);
      end loop;
      close cur_calling;
    end;