我需要一个存储过程解析输入,并根据结果调用另一个存储过程。结果需要返回一个游标。
我的过程是这样的:
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是存储过程时,为什么要尝试将其作为函数调用?
答案 0 :(得分:2)
如果客户端仅调用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。