【问题标题】:Possible for Oracle PL/SQL to use dynamic procedure name?Oracle PL/SQL 可以使用动态过程名称吗?
【发布时间】:2021-05-06 01:55:27
【问题描述】:

我正在尝试将要调用的过程的名称传递给循环,因为我需要连续调用 3 个类似的过程。

让我们给他们打电话:

  1. Proc_A
  2. Proc_B
  3. Proc_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;

第 5 行当前失败。 (立即执行) with: "invalid SQL statement"

【问题讨论】:

  • 什么是“不工作”?
  • 在执行立即部分尝试运行过程失败。
  • 看这里如何调用一个过程。你需要一个匿名块和一个 using 子句:stackoverflow.com/questions/30977692/….

标签: sql oracle plsql dynamic-sql


【解决方案1】:

您“忘记”包含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.

这是你应该做的(注意第 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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    相关资源
    最近更新 更多