在for循环中调用Oracle过程

时间:2019-02-20 12:51:46

标签: oracle plsql

我已经在SQLDeveloper中创建并存储了一个过程。我可以称之为它,并且它按预期运行。 但是,如果我尝试在一组表的for循环中使用它,则会出现错误:

  

ORA-06512:第10行

     
      
  1. 00000-“无效的SQL语句”
  2.   

这是步骤:

create or replace PROCEDURE ADD_PARAMETERS 
(
  TBL_NAME IN VARCHAR2 
) AS 
BEGIN

  EXECUTE IMMEDIATE 'ALTER TABLE '||TBL_NAME||' ADD(FB_AREA_HA Float)';

  EXECUTE IMMEDIATE 'UPDATE '||TBL_NAME||' SET FB_AREA_HA = FB_AREA/10000';
END ADD_PARAMETERS;

这里是带有过程的for循环

SET SERVEROUT ON
DECLARE

sql_stmnt VARCHAR2(400);

BEGIN
    FOR x in (SELECT * FROM all_tables WHERE table_name LIKE 'BBX_%')
    LOOP
        sql_stmnt := 'EXECUTE ADD_PARAMETERS('''||x.TABLE_NAME||''')';
        DBMS_OUTPUT.PUT_LINE(sql_stmnt||';');
        EXECUTE IMMEDIATE sql_stmnt;
    END LOOP;
END;

此错误的原因是什么?我可以肯定它不是第10行...

1 个答案:

答案 0 :(得分:3)

EXECUTE不是SQL命令。这是匿名块的SQL * Plus(及其他)客户端简写。动态语句是在SQL上下文中执行的,而不是在客户端中执行的,因此无法识别-从而导致错误(错误实际上是来自代码块的第10行,因为EXECUTE IMMEDIATE发生在该行)。 / p>

您可以等同于扩展该速记:

sql_stmnt := 'BEGIN ADD_PARAMETERS('''||x.TABLE_NAME||'''); END;';

但是您不需要动态SQL调用过程 ,您可以执行以下操作:

BEGIN
    FOR x in (SELECT * FROM all_tables WHERE table_name LIKE 'BBX_%')
    LOOP
        ADD_PARAMETERS(x.TABLE_NAME);
    END LOOP;
END;
/