使用动态 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 时出错的主要内容,如果未能解决你的问题,请参考以下文章