使用Execute Immediate动态游标

create or replace procedure get_cur(v_cur in sys_refcursor)   
    as    
    v_rec user_objects%rowtype;    
    begin    
     fetch v_cur into v_rec;    
     dbms_output.put_line(v_rec.object_name);    
    end;    
create or replace procedure     
  call_proc_ref_cursor as    
  v_cur sys_refcursor;    
begin    
  open v_cur for    
    select * from user_objects;     
  execute immediate 'begin get_cur(:1);end;'    
    USING v_cur;    
  close v_cur;    
end;

平常动态游标的调用

CREATE OR REPLACE PACKAGE pkg_test   
AS    
PROCEDURE p1;    
PROCEDURE p2(p_cur SYS_REFCURSOR);    
END pkg_test;    
/    
CREATE OR REPLACE PACKAGE BODY pkg_test    
AS    
PROCEDURE p1    
AS    
  lv_cur SYS_REFCURSOR;    
BEGIN    
  OPEN lv_cur FOR SELECT * FROM T;    
  p2(lv_cur);    
  CLOSE lv_cur;    
END;    
PROCEDURE p2(p_cur SYS_REFCURSOR)    
AS    
  lv_row t%ROWTYPE;    
BEGIN    
  LOOP    
     FETCH p_cur INTO lv_row;    
     EXIT WHEN p_cur%NOTFOUND;    
     DBMS_OUTPUT.PUT_LINE(lv_row.id);    
  END LOOP;    
END;    
END pkg_test;    
/