2013-06-05 53 views
2

我得到絆倒使用動態SQL和報價。當我dbms_output sql_stmt時,它輸出有效/有效的代碼。應該如何編寫sql_stmt:=行以便我可以動態執行它?我嘗試了「:1使用」綁定變量語法以及沒有運氣。動態SQL與報價和立即執行

此代碼的要點是收集表的子集的統計信息。

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

回答

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

使用

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

代替。