【问题标题】:Struggling with Oracle dynamic SQL与 Oracle 动态 SQL 作斗争
【发布时间】:2014-10-29 08:32:45
【问题描述】:

我正在开发一个需要非常自动化的 Oracle 过程,因此我使用的是动态 SQL。我是使用动态 SQL 的新手。

我正在使用 varchar2 变量来构建需要执行的 SQL。我使用了一个 dbms_output 来捕获正在生成的 SQL,它执行得很好:

创建篮子交换表的 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 Enterprise Edition Release 11.2.0.3.0 - 64bit Production

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 语言 参考手册。

【问题讨论】:

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


    【解决方案1】:

    您的查询很好,但使用 DynamicSQL 时,您不能在语句末尾使用分号。换行Sqlexec:= Sqlexec || 'PARTITION ('||Basket_Partition_To_Process||'); '; 不包括语句末尾的分号:Sqlexec:= Sqlexec || 'PARTITION ('||Basket_Partition_To_Process||')';

    【讨论】:

    • 太棒了,就是这样。非常感谢
    猜你喜欢
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 2021-03-20
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    相关资源
    最近更新 更多