暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

How to use the oracle REF CURSOR

原创 eygle 2009-03-09
714
原文地址: http://www.psoug.org/reference/ref_cursors.html











Oracle Ref Cursors
Version 10.2



















































Strongly Typed
Note: A REF CURSOR that specifies a specific return type.
Package HeaderCREATE 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 BodyCREATE 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 Demoset 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 ProcedureCREATE 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 ProcedureCREATE 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 Demoset serveroutput on


exec parent(1)

exec parent(17)

Passing Ref Cursors
Ref Cursor Passing DemoCREATE 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;

/










「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论