我已经在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;
这里是带有过程的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行...
答案 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;
/