Oracle PL/SQL 可以使用动态过程名称吗?

use*_*288 0 sql oracle plsql dynamic-sql

我试图通过循环传递我想要调用的过程的名称,因为我需要连续调用 3 个类似的过程。

让我们打电话给他们:

  1. 进程_A
  2. 进程_B
  3. 进程_C

它们每个都有 1 个输入变量和 2 个输出变量。

关于我可以改变什么来让它工作的任何想法?

FOR l_counter in 1..3
LOOP
    SELECT PROC_NAME into V_PROC FROM PROC_LIST WHERE PROC_ID = l_counter;

    EXECUTE IMMEDIATE 'PROC_DB.' || V_PROC || '(1,V_STEP_ERROR_CODE,V_STEP_MSG)';
    COMMIT;
END LOOP;
Run Code Online (Sandbox Code Playgroud)

第 5 行当前失败。(立即执行)带有:“无效的 SQL 语句”

Lit*_*oot 5

您“忘记”包含BEGIN- END。您正在调用一个过程,这就是 PL/SQL。

例如:我的表包含几个过程,它们看起来都一样——它们只是显示它们的名称。

SQL> select * from proc_list;

   PROC_ID PR
---------- --
         1 p1
         2 p2
         3 p3

SQL> create procedure p1 as begin dbms_output.put_Line('p1'); end;
  2  /

Procedure created.
Run Code Online (Sandbox Code Playgroud)

这是您应该做的事情(注意第 8 行):

SQL> declare
  2    v_proc proc_list.proc_name%type;
  3  begin
  4    for l_counter in 1 .. 3 loop
  5      select proc_name into v_proc from proc_List
  6      where proc_id = l_counter;
  7
  8      execute immediate 'begin ' || v_proc ||'; end;';
  9    end loop;
 10  end;
 11  /
p1
p2
p3

PL/SQL procedure successfully completed.
Run Code Online (Sandbox Code Playgroud)