Oracle存储过程调用另一个存储过程并返回游标

时间:2020-06-25 21:27:45

标签: oracle stored-procedures

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

我的过程是这样的:

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是存储过程时,为什么要尝试将其作为函数调用?

1 个答案:

答案 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


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