PZN*_*ill 2 plsql stored-procedures oracle11g oracle-sqldeveloper
FOR rec IN ( SELECT Procedure_Name
FROM DATAMART_PROCESS_STEPS
ORDER BY Procedure_Order )
LOOP
EXECUTE rec;
END LOOP;
Run Code Online (Sandbox Code Playgroud)
我有一个过程管理表中的一系列过程DATAMART_PROCESS_STEPS,并且我需要动态运行该表中的每个过程。Oracle SQL Developer 不喜欢我执行过程的方式;它会抛出语法错误。完成这项任务的正确方法是什么?
EXECUTE 'BEGIN ' || rec || '; END';
Run Code Online (Sandbox Code Playgroud)
在阅读有关存储过程的教程后,我也尝试过此操作,但它存在单引号问题。帮助。如果您需要更多详细信息或代码,请询问。
先感谢您。
该execute命令是 SQL*Plus/SQL Developer 匿名 PL/SQL 块的简写。它在其他 PL/SQL 中无效,包括在您的主过程中。
PL/SQL 中的动态调用使用不相关的execute immediate语句,并且如语法图所示,immediate 关键字不是可选的。
正如您已经意识到的那样,本例中的动态 SQL 语句需要是围绕游标提供的过程名称的匿名 PL/SQL 块。END但是你的第二个版本在你连接到字符串之后缺少一个分号;并且您直接引用rec而不是该记录类型中的列,即使用光标选择的列的名称。
所以你的循环需要做:
FOR rec IN ( SELECT Procedure_Name
FROM DATAMART_PROCESS_STEPS
ORDER BY Procedure_Order )
LOOP
EXECUTE IMMEDIATE 'BEGIN ' || rec.procedure_name || '; END;';
END LOOP;
Run Code Online (Sandbox Code Playgroud)