【发布时间】:2016-01-26 01:11:23
【问题描述】:
我有一个这样的包裹:
CREATE OR REPLACE PACKAGE PKG_EXAMPLE
IS
PROCEDURE SP_EXAMPLE_1 (inVal IN VARCHAR2, outCur OUT SYS_REFCURSOR);
PROCEDURE SP_EXAMPLE_2 (inVal IN VARCHAR2, outCur OUT SYS_REFCURSOR);
PROCEDURE SP_EXAMPLE_N (inVal IN VARCHAR2, outCur OUT SYS_REFCURSOR);
PROCEDURE SP_NON_CURSOR_EXAMPLE (inVal IN VARCHAR2, outVal OUT VARCHAR2);
END PKG_EXAMPLE;
CREATE OR REPLACE PACKAGE BODY PKG_EXAMPLE
AS
--for brevity, only showing one relevant procedure
PROCEDURE SP_EXAMPLE_N (inVal IN VARCHAR2, outCur OUT SYS_REFCURSOR)
IS
BEGIN
OPEN outCur FOR SELECT something FROM somewhere WHERE value = inVal;
END SP_EXAMPLE_N;
END PKG_EXAMPLE;
在运行时,我正在循环浏览一些记录,并且我想在这个包中动态调用过程(只有带有outCur OUT SYS_REFCURSOR 光标输出的过程)。出于演示的目的,我加入了SP_NON_CURSOR_EXAMPLE,以表明我可以这样称呼它:
DECLARE
outVal VARCHAR2(100);
BEGIN
FOR rec IN (SELECT 'SP_NON_CURSOR_EXAMPLE' as spName, inData FROM table_name) LOOP
EXECUTE IMMEDIATE 'CALL PKG_EXAMPLE.' || rec.spName || '(''' || rec.inData || ''', :myResult)'
USING OUT outVal;
END LOOP;
END;
这行得通。但是对于具有outCur OUT SYS_REFCURSOR 游标输出的过程,我该怎么做呢?我实际上并不需要游标结果或关心它们是什么,我只想知道游标是否返回 > 0 结果。我想要这样的东西:
DECLARE
crs SYS_REFCURSOR;
cnt NUMBER;
BEGIN
FOR rec IN (SELECT spName, inData FROM table_name) LOOP
EXECUTE IMMEDIATE 'CALL PKG_EXAMPLE.' || rec.spName|| '(''' || rec.inData|| ''', :myResult)'
USING OUT crs;
cnt := crs%ROWCOUNT; -- this is what I need
END LOOP;
END;
但%ROWCOUNT 始终为零。我相信我必须 FETCH 游标才能检查它是否返回结果,但我不知道游标将返回哪些列或类型,所以我不确定我可以获取什么。
【问题讨论】: