使用动态SQL时出错

时间:2017-12-07 10:35:37

标签: sql oracle plsql dynamic-sql

当我尝试执行此语句时,我收到错误

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值我通过其他查询获取作为我的过程的一部分。如果我在这里做错了,请建议。

1 个答案:

答案 0 :(得分:1)

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

如果MAX_DATET符合ANSI格式yyyy-mm-dd,则更容易。那么你所需要的就是:

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

否则,您需要对to_date()电话进行编码并提供相应的掩码。

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