Oracle 存储采购调用另一个存储采购并返回游标
Oracle stored procured calling another stored procured and returning a cursor
我需要一个存储过程解析输入并根据结果调用另一个存储过程。结果需要return一个游标。
我的程序是这样的:
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;
然而,这return是
的一个错误
PLS-00222: no function with name 'TESTPROCEUDER1' exists in this scope
当 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.
我需要一个存储过程解析输入并根据结果调用另一个存储过程。结果需要return一个游标。
我的程序是这样的:
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;
然而,这return是
的一个错误PLS-00222: no function with name 'TESTPROCEUDER1' exists in this scope
当 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.