【发布时间】:2013-07-28 23:47:20
【问题描述】:
让我们创建两个测试程序:
CREATE OR REPLACE PROCEDURE Aaaa_Test1(
pDog SYS_REFCURSOR
) IS
TYPE tDogRec is record (objid varchar2(7), lim number, debt number);
TYPE tDog IS TABLE OF tDogRec;
vDog tDog;
BEGIN
IF pDog%ISOPEN THEN
FETCH pDog BULK COLLECT INTO vDog;
IF vDog.count >= 1 THEN
FOR i IN vDog.First..vDog.Last LOOP
Dbms_Output.Put_Line('Aaaa_Test1 = '||vDog(i).Objid);
END LOOP;
END IF;
END IF;
END; -- Aaaa_Test1 Procedure
/
CREATE OR REPLACE PROCEDURE Aaaa_Test2(
pDog SYS_REFCURSOR
) IS
TYPE tDogRec is record (objid varchar2(7), lim number, debt number);
TYPE tDog IS TABLE OF tDogRec;
vDog tDog;
BEGIN
IF pDog%ISOPEN THEN
FETCH pDog BULK COLLECT INTO vDog;
IF vDog.count >= 1 THEN
FOR i IN vDog.First..vDog.Last LOOP
Dbms_Output.Put_Line('Aaaa_Test2 = '||vDog(i).Objid);
END LOOP;
END IF;
END IF;
END; -- Aaaa_Test2 Procedure
那么让我们尝试打开游标并按顺序将其传递给这些程序:
DECLARE
Vcdogcur SYS_REFCURSOR;
BEGIN
OPEN Vcdogcur FOR
select '6518535' objid, 10000 lim,0 debt
from dual
union all
select '6518536', 0,500
from dual
union all
select '5656058', 0,899
from dual
union all
select '2180965', 5000,0
from dual
union all
select '2462902', 0,100
from dual;
Aaaa_Test1(Vcdogcur);
Aaaa_Test2(Vcdogcur);
CLOSE Vcdogcur;
END;
如您所见,我不能在第二个过程中使用已经获取的游标,因为 ORACLE 游标是向前和只读的。有什么方法可以帮助解决这个任务?
我不能简单地将这些程序合二为一。需要将它们的逻辑彼此分开。
【问题讨论】:
-
您为什么想要/需要这样做?
-
@FrankSchmitt 因为真正的查询非常大,我不想在这些过程中单独重复它。也许我需要考虑临时表..
-
如果基本查询相同,为什么不在一个程序中实现逻辑,它会消除肤色?
-
@Harshit 因为我们对具有完全不同分配的过程使用单独的逻辑。
-
@Okloks 那么您可能可以将查询作为字符串传递给程序,然后在程序本身中为它打开游标。
标签: oracle plsql oracle11g cursor