使用动态 SQL 时出错

Posted

技术标签:

【中文标题】使用动态 SQL 时出错【英文标题】:Getting error while using dynamic SQL 【发布时间】:2017-12-07 10:35:36 【问题描述】:

我在尝试执行此语句时遇到错误

EXECUTE IMMEDIATE
               (   'CREATE TABLE DP.SD_NEW_TEST TABLESPACE DP_TS_TX_DATA INITRANS   10
                          PARTITION  BY RANGE (SALES_DATE)(
                          PARTITION  '''
                || Partition_name
                || ''' VALUES LESS THAN '''
                || MAX_DATET
                || ''' LOGGING
                        NOCOMPRESS 
                        TABLESPACE DP_TS_TX_DATA INITRANS   10) AS SELECT * FROM DP.SALES_DATA WHERE 1=2'

这里 Partition_name,MAX_DATET 值作为我的过程的一部分,我通过其他查询获取。如果我在这里做错了什么,请提出建议。

【问题讨论】:

“一个错误”?有没有比这更具体的机会? 把你生成的SQL放到一个变量中,用dbms_output.put_line输出。此输出将帮助您了解您错在哪里 【参考方案1】:

我猜MAX_DATET 的值没有以可接受的方式格式化。基本上,您需要将日期作为字符串提供并进行适当的数据转换。

如果 MAX_DATET 符合 ANSI 格式 yyyy-mm-dd 会更容易。那么你只需要:

            || ''' VALUES LESS THAN date '''
            || MAX_DATET
            || ''' LOGGING

否则,您需要编写 to_date() 调用并提供适当的掩码。


动态 SQL 很难,因为它会将编译错误转化为运行时错误。正如评论者所说,这里的明智做法是将语句组装在一个变量中,该变量可以通过 DBMS_OUTPUT 显示。当我们可以看到失败的代码时,调试总是更容易。

【讨论】:

以上是关于使用动态 SQL 时出错的主要内容,如果未能解决你的问题,请参考以下文章

动态SQL

在 sql server 中,使用整数变量构建动态 sql

使用数据集更新数据库时出错

执行存储过程以删除表时出错

使用指针,动态分配,结构时出错

尝试为 Azure 使用 Ansible 动态清单插件时出错