我使用动态sql和引号绊倒了。当我dbms_output sql_stmt时,它输出有效/工作代码。应该如何编写sql_stmt:=行以便我可以动态执行它?我试过“:1使用”绑定变量语法,但没有运气。
此代码的要点是收集表子集的统计信息。
set serveroutput on
--create this test table for working example.
--create table test3 as select table_name from user_tables where rownum <= 5;
declare
sql_stmt varchar2(500);
begin
for rec in (select table_name from test3)
loop
sql_stmt := 'exec dbms_stats.gather_table_stats (''SCOTT'',''' || rec.table_name || ''')';
dbms_output.put_line(sql_stmt);
execute immediate sql_stmt; -- <---Error is here---
end loop;
end;
我从execute immediate sql_stmt获得的错误;线是: ORA-00900:无效的SQL语句 ORA-06512:第8行
答案 0 :(得分:7)
EXEC是一个SQL * Plus命令。如果您坚持使用动态SQL,则可能需要在匿名块中包含对DBMS_STATS.GATHER_TABLE_STATS的调用。
但是,您应该能够直接调用该过程,如下所示:
declare
sql_stmt varchar2(500);
begin
for rec in (select table_name from test3)
loop
dbms_stats.gather_table_stats ('SCOTT',rec.table_name);
end loop;
end;
答案 1 :(得分:1)
使用
sql_stmt := 'BEGIN dbms_stats.gather_table_stats (''SCOTT'','''
|| rec.table_name || '''); END;';
代替。