Oracle 在for循环中调用存储过程
我在SQLDeveloper中创建并存储了一个过程。我可以打电话给它,它正在按预期工作 但是,如果我尝试在一组表上的for循环中使用它,则会出现错误: ORA-06512:在第10行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
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;
/