如何动态调用存储过程?

时间:2016-01-06 14:44:55

标签: stored-procedures plsql oracle11g oracle-sqldeveloper

public class TableColorRenderer extends JLabel implements TableCellRenderer
{
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
    {
        return this;
    }

我有一个程序来管理表FOR rec IN ( SELECT Procedure_Name FROM DATAMART_PROCESS_STEPS ORDER BY Procedure_Order ) LOOP EXECUTE rec; END LOOP; 中的一系列过程,我需要动态地运行该表中的每个过程。 Oracle SQL Developer不喜欢我执行程序的方式;它会引发语法错误。实现这项任务的正确方法是什么?

DATAMART_PROCESS_STEPS

在阅读了有关存储过程的教程之后,我也尝试了这个,但它有单引号的问题。救命。如果您需要更多细节或代码,请询问。

提前谢谢。

1 个答案:

答案 0 :(得分:4)

execute command是匿名PL / SQL块的SQL * Plus / SQL Developer简写。它在其他PL / SQL中无效,包括在主程序中。

PL / SQL中的动态调用使用不相关的execute immediate statement,并且语法图显示立即关键字不是可选的。

execute immediate syntax diagram

在这种情况下,动态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;