Oracle 存储采购调用另一个存储采购并返回游标



我需要有一个存储过程分析输入,并根据结果调用另一个存储过程。 结果需要返回游标。

我的程序是这样的:

CREATE OR REPLACE PROCEDURE TestProceuder1 (userData VARCHAR2) IS
cl SYS_REFCURSOR;
BEGIN
--Amazing Logic
OPEN c1 FOR SELECT 'results' AS Results FROM dual;
dbms_sql.return_result(c1);
END;

然后主要做这样的事情:

CREATE OR REPLACE PROCEDURE MainProcedure (userData VARCHAR2) IS
c1 SYS_REFCURSOR;
BEGIN
--Amazing logic picking the correct procedure
OPEN c1 FOR TestProceuder1(userData);    
dbms_sql.return_result(c1);
END;

但是,这将返回错误

PLS-00222:此作用域中不存在名称为"TESTPROCEUDER1"的函数

当 TestProceuder1 是存储过程时,为什么它试图将其作为函数调用?

如果客户端只会调用 MainProcedure,并且不会直接调用拆分过程,那么对这些过程的处理可以使用标准的 PL/SQL 机制而不是dbms_sql.return_result

CREATE OR REPLACE PROCEDURE TestProcedure1 (userData VARCHAR2, c1 OUT SYS_REFCURSOR) IS
BEGIN
--Amazing Logic
OPEN c1 FOR SELECT 'results' AS Results FROM dual;
END;
/

或者您可以使用函数而不是 OUT 参数:

CREATE OR REPLACE FUNCTION TestFunction1 (userData VARCHAR2)
RETURN SYS_REFCURSOR IS
c1 SYS_REFCURSOR;
BEGIN
--Amazing Logic
OPEN c1 FOR SELECT 'results' AS Results FROM dual;
RETURN c1;
END;
/

然后主过程调用这些,只有它需要使用结果机制:

CREATE OR REPLACE PROCEDURE MainProcedure (userData VARCHAR2) IS
c1 SYS_REFCURSOR;
BEGIN
--Amazing logic picking the correct procedure
TestProcedure1(userData, c1);
dbms_sql.return_result(c1);
-- or function
c1 := TestFunction1(userData);
dbms_sql.return_result(c1);
END;
/

数据库<>小提琴


将所有过程放入一个包中,只公开主过程可能是有意义的; db<>fiddle。

最新更新