Stored procedures 如何动态调用存储过程?

Stored procedures 如何动态调用存储过程?,stored-procedures,plsql,oracle11g,oracle-sqldeveloper,Stored Procedures,Plsql,Oracle11g,Oracle Sqldeveloper,我有一个过程来管理表DATAMART\u PROCESS\u STEPS中的一系列过程,我需要动态运行该表中的每个过程。Oracle SQL开发人员不喜欢我执行过程的方式;它抛出语法错误。完成这项任务的正确方法是什么 FOR rec IN ( SELECT Procedure_Name FROM DATAMART_PROCESS_STEPS ORDER BY Procedure_Order ) LOOP EXECUTE r

我有一个过程来管理表
DATAMART\u PROCESS\u STEPS
中的一系列过程,我需要动态运行该表中的每个过程。Oracle SQL开发人员不喜欢我执行过程的方式;它抛出语法错误。完成这项任务的正确方法是什么

FOR rec IN ( SELECT Procedure_Name 
                 FROM DATAMART_PROCESS_STEPS
                 ORDER BY Procedure_Order )
LOOP
  EXECUTE rec;
END LOOP;
在阅读了有关存储过程的教程后,我也尝试过这个方法,但它有单引号的问题。救命啊。如果您需要更多的细节或代码,请直接询问

提前感谢。

这是SQL*Plus/SQL Developer对匿名PL/SQL块的缩写。它在其他PL/SQL中无效,包括在主过程中

PL/SQL中的动态调用使用不相关的,正如语法图所示,immediate关键字不是可选的

本例中的动态SQL语句需要是围绕游标提供的过程名的匿名PL/SQL块,正如您已经意识到的那样。但是您的第二个版本在连接到字符串的
结尾后缺少分号;您直接引用的是
rec
,而不是该记录类型中的列,即使用光标正在选择的列的名称

因此,您的循环需要执行以下操作:

EXECUTE 'BEGIN ' || rec || '; END';
SQL*Plus/SQL Developer是匿名PL/SQL块的缩写。它在其他PL/SQL中无效,包括在主过程中

PL/SQL中的动态调用使用不相关的,正如语法图所示,immediate关键字不是可选的

本例中的动态SQL语句需要是围绕游标提供的过程名的匿名PL/SQL块,正如您已经意识到的那样。但是您的第二个版本在连接到字符串的
结尾后缺少分号;您直接引用的是
rec
,而不是该记录类型中的列,即使用光标正在选择的列的名称

因此,您的循环需要执行以下操作:

EXECUTE 'BEGIN ' || rec || '; END';

甲骨文抛出了什么错误?将错误复制到剪贴板,然后执行一次修改。查看错误原因并尝试提供的解决方案。如果您没有找到解决方案,那么@student感谢您的建议,但我已经按照您的建议做了;“expect…ect时遇到符号rec”。它认为我应该:=取而代之。网络搜索没有帮助。你试过使用EXECUTE IMMEDIATE吗?@PZNevill我觉得你的语法是正确的。
rec
是否包含单引号?@PZNevill-是SQL*Plus/SQL开发人员对匿名PL/SQL块的缩写。它在其他PL/SQL中无效。PL/SQL中的动态调用使用,这与普通的
execute
无关,并且正如语法图所示,
立即调用
不是可选的。Oracle抛出了什么错误?将错误复制到剪贴板,然后执行一次修改。查看错误原因并尝试提供的解决方案。如果您没有找到解决方案,那么@student感谢您的建议,但我已经按照您的建议做了;“expect…ect时遇到符号rec”。它认为我应该:=取而代之。网络搜索没有帮助。你试过使用EXECUTE IMMEDIATE吗?@PZNevill我觉得你的语法是正确的。
rec
是否包含单引号?@PZNevill-是SQL*Plus/SQL开发人员对匿名PL/SQL块的缩写。它在其他PL/SQL中无效。PL/SQL中的动态调用使用,这与普通的
execute
无关,正如语法图所示,
立即调用
不是可选的。