zoukankan      html  css  js  c++  java
  • Oracle ref cursor和sys_refcursor

    1. 自定义 ref cursor 和 sys_refcursor; 
    2. sys_refcursor 做为参数传递结果集; 
    3. ref cursor 做为参数传递结果集;

    1. 自定义 ref cursor 和 sys_refcursor:

      declare
    
      type df_ref is ref cursor; --定义 ref cursor
    
      rf df_ref; --声明 rf 是df_ref
    
      ename varchar2(30);
    
     begin
    
      open rf for 'select ename from emp';
    
      loop
    
       fetch rf into ename;
    
       dbms_output.put_line(ename);
    
      exit when rf%notfound;
    
     end loop;
    
     close rf; 
    
    end;
    
    /
    

    sys_refcursor 不需要声明可以直接使用:

     declare
    
     reft sys_refcursor;
    
      begin
    
       open reft for 'select * from emp';
    
      close  reft;  
    
     end;


    sqlplus 中可以使用refcursor:

    OPS$SYWU@sydb%11GR2>variable r refcursor;
    
    OPS$SYWU@sydb%11GR2>exec open :r for 'select * from emp';
    
    
    
    PL/SQL procedure successfully completed.
    
    
    
    Elapsed: 00:00:00.00
    
    OPS$SYWU@sydb%11GR2>print :r;
    
    
    
         EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
    
    ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
    
          7369 SMITH      CLERK           7902 17-DEC-80        800                    20
    
          7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
    
          7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
    
          7566 JONES      MANAGER         7839 02-APR-81       2975                    20
    
          7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
    
          7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
    
          7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
    
          7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
    
          7839 KING       PRESIDENT            17-NOV-81       5000                    10
    
          7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
    
          7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20
    
    
    
         EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
    
    ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
    
          7900 JAMES      CLERK           7698 03-DEC-81        950                    30
    
          7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
    
          7934 MILLER     CLERK           7782 23-JAN-82       1300                    10
    
    
    
    14 rows selected.

    2. sys_refcursor 做为参数传递结果集:

     create or replace procedure pro_getEmp(ref_rs out sys_refcursor)
    
     is
    
      begin
    
      open ref_rs for 'select ename,empno from emp';
    
      ---不能在这里关闭
    
     end;
    
    /

    调用结果集:

    declare
    
    refc sys_refcursor;
    
    ename varchar2(30);
    
    empno number;
    
    begin
    
     pro_getEmp(ref_rs=>refc);
    
     loop
    
        fetch refc into ename,empno;
    
      dbms_output.put_line(ename||''||empno);
    
     exit when refc%notfound;
    
     end loop;
    
    end;
    
    / 
    

    3. ref cursor 做为参数传递结果集: 
       在包头定义 ref cursor:

    create or replace package pk_cur 
    
      as 
    
      type df_cursor is ref cursor;
    
      
    
      function fun_emp return df_cursor;
    
     end;
    
    /
    
     
    
     create or replace package body pk_cur
    
      is
    
      
    
       function fun_emp return df_cursor
    
         is
    
    	fn_cursor df_cursor;
    
         begin
    
           open fn_cursor for 'select * from emp';
    
         return fn_cursor;
    
       end;
    
    end;
    
    /
    
       
    
    OPS$SYWU@sydb%11GR2>  select pk_cur.fun_emp from dual;
    
    
    
    FUN_EMP
    
    --------------------
    
    CURSOR STATEMENT : 1
    
    
    
    CURSOR STATEMENT : 1
    
    
    
         EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
    
    ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
    
          7369 SMITH      CLERK           7902 17-DEC-80        800                    20
    
          7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
    
          7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
    
          7566 JONES      MANAGER         7839 02-APR-81       2975                    20
    
          7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
    
          7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
    
          7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
    
          7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
    
          7839 KING       PRESIDENT            17-NOV-81       5000                    10
    
          7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
    
          7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20
    
    
    
         EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
    
    ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
    
          7900 JAMES      CLERK           7698 03-DEC-81        950                    30
    
          7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
    
          7934 MILLER     CLERK           7782 23-JAN-82       1300                    10
    
    
    
    14 rows selected. 




    来源:https://www.cnblogs.com/lanston/p/3993936.html
  • 相关阅读:
    LeetCode "Jump Game"
    LeetCode "Pow(x,n)"
    LeetCode "Reverse Linked List II"
    LeetCode "Unique Binary Search Trees II"
    LeetCode "Combination Sum II"
    LeetCode "Divide Two Integers"
    LeetCode "First Missing Positive"
    LeetCode "Clone Graph"
    LeetCode "Decode Ways"
    LeetCode "Combinations"
  • 原文地址:https://www.cnblogs.com/kongxc/p/9225806.html
Copyright © 2011-2022 走看看