我已经创建了一个sql查询,在该查询中,我将一个参数传递给下面共享的部分
BETWEEN
NVL(TO_CHAR(:DATE1, 'DD-MON-YYYY'), DATETIME)
AND
NVL(TO_CHAR(:DATE2, 'DD-MON-YYYY'), DATETIME)
当我使用数据类型运行这个查询时,它工作得很好,但是当我使用VARCHAR2
参数运行这个查询时,它会出现以下错误:
错误执行(9: 25):ORA-01722:无效编号
当我以null运行此查询时,该查询将显示所有记录。实际上,我需要使用一个STRING
参数来运行这个查询,而不是使用DATE
数据,所以当我在toad中将该参数传递给相同的查询时,即使在null
值中,它也能很好地工作。
以下是我的完整查询:
SELECT rownum,ACCOUNT_NO,CUSTOMER_NAME,CARD_NO, SOURCE, ATM_ID, ISSUER_BANK_NAME,ASE.STATUS_DESC, CARD_TYPE, CARD_RESP,
DATETIME,BR_INPUT_DATE BR_ACTIVITY
FROM ATM_RCCM, ATM_STATUS_ERRORS ASE
where ASE.STATUS_DESC = NVL(:PT, ASE.STATUS_DESC)
AND BR_TRACKING_STATUS = ASE.STATUS_CODE
AND CARD_TYPE = NVL(:CT, CARD_TYPE)
AND DATETIME
BETWEEN
NVL(TO_CHAR(:DATE1, 'DD-MON-YYYY'), DATETIME)
AND
NVL(TO_CHAR(:DATE2, 'DD-MON-YYYY'), DATETIME)
还请注意,DATETIME
列具有默认的VARCHAR2
数据类型。
发布于 2016-10-07 12:05:39
初等亲爱的华生: TO_CHAR将日期转换为varchar2。如果你给它错误的数据类型,你为什么希望它能工作呢?当您给它一个varchar2输入时,它将尝试首先将它转换为日期,而不是抛出编译错误。不过,它将使用会话的NLS_DATE_FORMAT,而不是TO_CHAR中的格式模型。因此,在您的情况下,它不能,它抛出一个运行时错误。
无论如何,比较是错误的;很明显,您想要比较日期,而不是字符串。那么,为什么要先将日期转换为字符串,然后进行比较呢?在字符串比较中,2012年1月12日是在1993年3月9日之前.
你是想用TO_DATE而不是TO_CHAR吗?试试看会发生什么!只需确保您也使用适当的格式模型将日期时间包装在TO_DATE中。
发布于 2016-10-07 12:05:15
它必须是一个问题,你要输入的参数。可能您的:DATE1 1或:DATE1 2格式不正确,或者您可能在CT或PT中具有alpha字符。
https://stackoverflow.com/questions/39922823
复制相似问题