我正在开发一个需要非常自动化的Oracle过程,因此我正在使用动态SQL。我是新手使用动态SQL。
我正在使用varchar2变量来构建需要执行的SQL。我已经使用dbms_output捕获正在生成的SQL,并且执行正常:
创建Basket Swap表的SQL = CREATE TABLE INBOUND.BASKET_CTAS_SWP COMPRESS FOR QUERY HIGH as SELECT * FROM INBOUND.BASKET_FCT PARTITION(SYS_1234);
但是,当我使用它执行该过程时,它会生成以下错误
Execute MyProcedure;
感谢您的指导!
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;
错误消息:
从命令行中的第1行开始出错 - 执行Process_Wic_Snap_Partition 错误报告 - ORA-00911:无效字符 ORA-06512:在“MY_SCHEMA.MY_PROCEDURE”,第102行 ORA-06512:第1行 00911. 00000 - “无效字符” *原因:标识符可能不以除以外的任何ASCII字符开头 字母和数字。第一个之后也允许$#_ 字符。双引号括起来的标识符可能包含 除了双引号之外的任何字符。替代报价 (q'#...#')不能使用空格,制表符或回车符 分隔符。对于所有其他上下文,请参阅SQL语言 参考手册。
答案 0 :(得分:5)
您的查询很好,但使用DynamicSQL时,您不允许在语句结束时使用分号。更改第Sqlexec:= Sqlexec || 'PARTITION ('||Basket_Partition_To_Process||'); ';
行
在声明末尾不包括分号:Sqlexec:= Sqlexec || 'PARTITION ('||Basket_Partition_To_Process||')';