2014-09-04 63 views
2

我正在研究需要非常自動化的Oracle過程,因此我使用的是動態SQL。我是使用動態SQL的新手。與Oracle動態SQL拼搏

我正在使用varchar2變量來構建需要執行的SQL。我使用dbms_output來捕獲正在生成的SQL,並且它執行得很好:

sql創建Basket Swap table = CREATE TABLE INBOUND.BASKET_CTAS_SWP COMPRESS FOR QUERY HIGH AS SELECT * FROM INBOUND.BASKET_FCT PARTITION(SYS_1234) ;

然而,當我執行使用此程序,它會生成以下

Execute MyProcedure; 

錯誤謝謝你的任何指導!

Oracle版本:Oracle數據庫11g企業版發佈11.2.0.3.0 - 64位生產

IDE:Oracle SQL Developer中版本4.0.2.15構建15.21

代碼:

note: all variables set at beginning of procedure... 
Sqlexec:= 'CREATE TABLE ' || Basket_Swap_Schema || '.' || Basket_Swap_Table_Name || ' '; 
Sqlexec:= Sqlexec || 'COMPRESS FOR QUERY HIGH '; 
Sqlexec:= Sqlexec || 'AS SELECT * FROM ' || Basket_Source_Schema_Name || '.' || Basket_Source_Table_Name || ' '; 
Sqlexec:= Sqlexec || 'PARTITION ('||Basket_Partition_To_Process||'); '; 

Dbms_Output.Put_Line('sql to create Basket Swap table = ' || Sqlexec); 

Execute Immediate Sqlexec; 

錯誤消息:

錯誤從行開始:1在命令中 - 執行Process_Wic_Snap_Partition 錯誤報告 - ORA-00911:無效字符 ORA-06512:在 「MY_SCHEMA.MY_PROCEDURE」,線路102 ORA-06512:在line 1 00911. 00000 - 「無效字符」 *原因:標識符字母和數字以外的任何ASCII字符都不能以 以外的字符開頭。 $#_也是在第一個 之後的字符。由雙引號括起來的標識符可能包含 除雙引號以外的任何字符。替代引號 (q'#...#')不能使用空格,製表符或回車作爲 分隔符。有關所有其他上下文,請參閱SQL語言參考手冊 。

回答

5

您的查詢很好,但對於DynamicSQL,您不允許在聲明結尾處使用分號。將行Sqlexec:= Sqlexec || 'PARTITION ('||Basket_Partition_To_Process||'); '; 更改爲在語句結尾處不包含分號:Sqlexec:= Sqlexec || 'PARTITION ('||Basket_Partition_To_Process||')';

+0

令人驚歎,就是這樣。非常感謝 – Steve 2014-09-04 14:55:57