2

我被动态 sql 和引号绊倒了。当我 dbms_output sql_stmt 时,它输出有效/工作代码。应该如何编写 sql_stmt := 行以便我可以动态执行它?我也尝试过“:1 using”绑定变量语法,但没有运气。

这段代码的重点是收集表子集的统计信息。

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;

我从立即执行 sql_stmt 得到的错误;行是:ORA-00900:无效的 SQL 语句 ORA-06512:在第 8 行

4

2 回答 2

8

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;
于 2013-06-05T18:05:45.070 回答
2

利用

sql_stmt := 'BEGIN dbms_stats.gather_table_stats (''SCOTT'','''
    || rec.table_name || '''); END;';

反而。

于 2013-06-05T18:10:10.947 回答