zoukankan      html  css  js  c++  java
  • 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;
    /

  • 相关阅读:
    如何基于日志,同步实现数据的一致性和实时抽取?
    实例解说AngularJS在自动化测试中的应用
    漏洞管理平台『洞察』部署指南
    UAVStack的慢SQL数据库监控功能及其实现
    淡说Linux 的发展史
    一张图告诉你E-R图怎么画
    一张图告诉你UML图怎么画❀
    最简单,最明了,看了就会的VScode和C++的配置!(Visual Studio Code)
    用Eclipse开发项目,你不能不知道的快捷键
    什么年代了,你还不会用油猴刷网课!
  • 原文地址:https://www.cnblogs.com/wbzhao/p/2421136.html
Copyright © 2011-2022 走看看