Oracle PL/SQL 可以使用动态过程名称吗?
Possible for Oracle PL/SQL to use dynamic procedure name?
我正在尝试将我要调用的过程的名称传递给循环,因为我需要连续调用 3 个类似的过程。
让我们称呼他们:
- Proc_A
- Proc_B
- 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 行当前失败。 (The Execute Immediate) with: "invalid SQL statement"
您“忘记”包含 BEGIN
-END
。您正在调用一个过程,那就是 PL/SQL.
例如:我的 table 包含几个程序,它们看起来都一样 - 它们只是显示它们的名称。
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.
我正在尝试将我要调用的过程的名称传递给循环,因为我需要连续调用 3 个类似的过程。
让我们称呼他们:
- Proc_A
- Proc_B
- 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 行当前失败。 (The Execute Immediate) with: "invalid SQL statement"
您“忘记”包含 BEGIN
-END
。您正在调用一个过程,那就是 PL/SQL.
例如:我的 table 包含几个程序,它们看起来都一样 - 它们只是显示它们的名称。
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.