苦苦挣扎着使用Oracle动态SQL

时间:2014-09-04 14:27:27

标签: sql oracle plsql oracle-sqldeveloper dynamic-sql

我正在开发一个需要非常自动化的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;

感谢您的指导!

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;

错误消息:

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

1 个答案:

答案 0 :(得分:5)

您的查询很好,但使用DynamicSQL时,您不允许在语句结束时使用分号。更改第Sqlexec:= Sqlexec || 'PARTITION ('||Basket_Partition_To_Process||'); ';行  在声明末尾不包括分号:Sqlexec:= Sqlexec || 'PARTITION ('||Basket_Partition_To_Process||')';