Oracle 在for循环中调用存储过程

Oracle 在for循环中调用存储过程,oracle,plsql,Oracle,Plsql,我在SQLDeveloper中创建并存储了一个过程。我可以打电话给它,它正在按预期工作 但是,如果我尝试在一组表上的for循环中使用它,则会出现错误: ORA-06512:在第10行 00000-“无效的SQL语句” 程序如下: create or replace PROCEDURE ADD_PARAMETERS ( TBL_NAME IN VARCHAR2 ) AS BEGIN EXECUTE IMMEDIATE 'ALTER TABLE '||TBL_NAME||' AD

我在SQLDeveloper中创建并存储了一个过程。我可以打电话给它,它正在按预期工作

但是,如果我尝试在一组表上的for循环中使用它,则会出现错误:

ORA-06512:在第10行

  • 00000-“无效的SQL语句”
  • 程序如下:

    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;
    
    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;
    
    这里是for循环和过程:

    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;
    
    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行。

    不是SQL命令。它是SQL*Plus(以及其他)客户端对匿名块的简写。动态语句是在SQL上下文中执行的,而不是在客户机中执行的,因此无法识别它——因此出现了错误(这确实来自于块的第10行,因为执行立即执行时发生了
    executeimmediate

    你可以做相当于扩展速记的工作:

    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;
    /