苦苦挣扎着使用Oracle动态SQL

Ste*_*eve 3 sql oracle plsql dynamic-sql oracle-sqldeveloper

我正在研究一个需要非常自动化的Oracle过程,所以我使用的是动态SQL.我是新手使用动态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;
Run Code Online (Sandbox Code Playgroud)

谢谢你的任何指导!

oracle版本:Oracle Database 11g企业版版本11.2.0.3.0 - 64位生产

IDE:Oracle SQL Developer版本4.0.2.15 Build 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;
Run Code Online (Sandbox Code Playgroud)

错误信息:

从第1行开始出错:命令执行 - 执行Process_Wic_Snap_Partition错误报告 - ORA-00911:无效字符ORA-06512:位于"MY_SCHEMA.MY_PROCEDURE",第102行ORA-06512:第1行00911. 00000 - "无效字符"*原因:标识符不能以字母和数字以外的任何ASCII字符开头.第一个字符后也允许$#_.双引号括起来的标识符可以包含除doublequote之外的任何字符.替代引号(q'#...#')不能使用空格,制表符或回车符作为分隔符.对于所有其他上下文,请参阅SQL语言参考手册.

gve*_*nzl 5

您的查询很好,但使用DynamicSQL时,您不允许在语句结尾处使用分号.将该行更改Sqlexec:= Sqlexec || 'PARTITION ('||Basket_Partition_To_Process||'); '; 为不在语句末尾包含分号:Sqlexec:= Sqlexec || 'PARTITION ('||Basket_Partition_To_Process||')';