带引号的动态sql并立即执行

时间:2013-06-05 17:48:23

标签: oracle plsql oracle10g

我使用动态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行

2 个答案:

答案 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;';

代替。