• Oracle ref cursor 参考


    包括强类型、若类型、传递 ref cursor 参数等。

    Oracle Ref Cursors
    Version 10.2
     
    Strongly Typed
    Note: A REF CURSOR that specifies a specific return type.
    Package Header CREATE OR REPLACE PACKAGE strongly_typed IS

    TYPE return_cur IS REF CURSOR RETURN all_tables%ROWTYPE;
    PROCEDURE child(p_return_rec OUT return_cur);
    PROCEDURE parent(p_NumRecs PLS_INTEGER);

    END strongly_typed;
    /
    Package Body CREATE OR REPLACE PACKAGE BODY strongly_typed IS
    PROCEDURE child(p_return_rec OUT return_cur) IS

    BEGIN
    OPEN p_return_rec FOR
    SELECT * FROM all_tables;
    END child;
    --==================================================
    PROCEDURE parent (p_NumRecs PLS_INTEGER) IS
    p_retcur return_cur;
    at_rec all_tables%ROWTYPE;
    BEGIN
    child(p_retcur);

    FOR i IN 1 .. p_NumRecs
    LOOP
    FETCH p_retcur
    INTO at_rec;

    dbms_output.put_line(at_rec.table_name ||
    ' - ' || at_rec.tablespace_name ||
    ' - ' || TO_CHAR(at_rec.initial_extent) ||
    ' - ' || TO_CHAR(at_rec.next_extent));
    END LOOP;
    END parent;
     
    END strongly_typed;
    /
    To Run The Demo set serveroutput on

    exec strongly_typed.parent(1)
    exec strongly_typed.parent(8)
     
    Weakly Typed
    Note: A REF CURSOR that does not specify the return type such as SYS_REFCURSOR.
    Child Procedure CREATE OR REPLACE PROCEDURE child (
    p_NumRecs IN PLS_INTEGER,
    p_return_cur OUT SYS_REFCURSOR)
    IS

    BEGIN
    OPEN p_return_cur FOR
    'SELECT * FROM all_tables WHERE rownum <= ' || p_NumRecs ;
    END child;
    /
    Parent Procedure CREATE OR REPLACE PROCEDURE parent (pNumRecs VARCHAR2) IS
    p_retcur SYS_REFCURSOR;
    at_rec all_tables%ROWTYPE;
    BEGIN
    child(pNumRecs, p_retcur);

    FOR i IN 1 .. pNumRecs
    LOOP

    FETCH p_retcur
    INTO at_rec;

    dbms_output.put_line(at_rec.table_name ||
    ' - ' || at_rec.tablespace_name ||
    ' - ' || TO_CHAR(at_rec.initial_extent) ||
    ' - ' || TO_CHAR(at_rec.next_extent));
    END LOOP;
    END parent;
    /
    To Run The Demo set serveroutput on

    exec parent(1)
    exec parent(17)
     
    Passing Ref Cursors
    Ref Cursor Passing Demo CREATE TABLE employees (
    empid NUMBER(5),
    empname VARCHAR2(30));

    INSERT INTO employees (empid, empname) VALUES (1, 'Dan Morgan');
    INSERT INTO employees (empid, empname) VALUES (2, 'Jack Cline');
    INSERT INTO employees (empid, empname) VALUES (3, 'Caleb Small');
    COMMIT;
    CREATE OR REPLACE PROCEDURE pass_ref_cur(p_cursor SYS_REFCURSOR) IS

    TYPE array_t IS TABLE OF VARCHAR2(4000)
    INDEX BY BINARY_INTEGER;

    rec_array array_t;

    BEGIN
    FETCH p_cursor BULK COLLECT INTO rec_array;

    FOR i IN rec_array.FIRST .. rec_array.LAST
    LOOP
    dbms_output.put_line(rec_array(i));
    END LOOP;
    END pass_ref_cur;
    /

    set serveroutput on

    DECLARE
    rec_array SYS_REFCURSOR;
    BEGIN
    OPEN rec_array FOR
    'SELECT empname FROM employees';

    pass_ref_cur(rec_array);
    CLOSE rec_array;
    END;
    /

  • 相关阅读:
    十一.状态设计模式
    十. 享元设计模式
    Orcale(一)概念
    java类加载器
    spring中的事务管理机制
    spring中的annotation注解类配置
    countDownLatch和Semaphore用于多线程
    布隆过滤器
    mybatis-genator自动生成的mapper中模糊查询使用方法
    java中的异常
  • 原文地址:https://www.cnblogs.com/wbzhao/p/2421136.html
Copyright © 2020-2023  润新知