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. 
    
    
  • 相关阅读:
    【转】strlen和mb_strlen区别(php获得中英文混合字符长度)
    PHP字符串替换的相关方法介绍
    php表单转换textarea换行符的方法
    vue生命周期及其作用
    elemenui点击单行触发样式,选中或不选中复选框
    flutter 介绍和环境搭建
    flutter组件
    tora消息机制(事件监听,触发,取消)
    Promise功能与应用
    CCF CSP 20018031 跳一跳
  • 原文地址:https://www.cnblogs.com/lanston/p/3993936.html
Copyright © 2011-2022 走看看