错误消息 = ORA-00909:参数数量无效

Posted

技术标签:

【中文标题】错误消息 = ORA-00909:参数数量无效【英文标题】:Error Msg = ORA-00909: invalid number of arguments 【发布时间】:2022-01-02 00:34:18 【问题描述】:

SELECT CASE 
         WHEN TO_DATE(TO_CHAR(TO_DATE(Aggregation.REPORTING_POSITION_DATE,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS') > TO_DATE('2021-06-30 00:00:00','YYYY-MM-DD HH24:MI:SS') THEN 'FALSE' 
         ELSE 'TRUE' 
         WHEN TO_DATE(TO_CHAR(TO_DATE(Aggregation.REPORTING_POSITION_DATE,'MM/DD/YYYY HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS') > TO_DATE('2021-06-30 00:00:00','YYYY-MM-DD HH24:MI:SS') THEN 'FALSE' 
         ELSE 'TRUE' 
       END 
FROM HKLRR_UAT_USER.aggr_707884

【问题讨论】:

可读性是一项功能。请研究@Littlefoot 的答案,不仅因为它为错误提供了正确的解决方案,而且因为它显示了如何布局代码以便于阅读。你未来的同事——甚至你未来的自己——会感谢你学习如何使用大小写、缩进和其他布局技术来使你的代码更具可读性。 【参考方案1】:

如果你真的这样写查询,难怪你会出错。那是不可读的。

虽然,当正确格式化并修复错误时(它是错位的WHEN),它似乎正在返回一些东西。为了测试它,我创建了一个虚拟 CTE 并删除了 AggregationHKLRR_UAT_USER,因为我没有这些用户。

SQL> WITH
  2     aggr_707884
  3     AS
  4        (SELECT '2021-09-11 12:22:33' reporting_position_date FROM DUAL)
  5  SELECT CASE
  6            WHEN TO_DATE (
  7                    TO_CHAR (
  8                       TO_DATE (REPORTING_POSITION_DATE,
  9                                'YYYY-MM-DD HH24:MI:SS'),
 10                       'YYYY-MM-DD HH24:MI:SS'),
 11                    'YYYY-MM-DD HH24:MI:SS') >
 12                 TO_DATE ('2021-06-30 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
 13            THEN
 14               'FALSE'
 15            WHEN TO_DATE (
 16                    TO_CHAR (
 17                       TO_DATE (REPORTING_POSITION_DATE,
 18                                'MM/DD/YYYY HH24:MI:SS'),
 19                       'YYYY-MM-DD HH24:MI:SS'),
 20                    'YYYY-MM-DD HH24:MI:SS') >
 21                 TO_DATE ('2021-06-30 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
 22            THEN
 23               'FALSE'
 24            ELSE
 25               'TRUE'
 26         END result
 27    FROM aggr_707884
 28  /

RESUL
-----
FALSE

SQL>

不知道你为什么要嵌套那么多TO_DATE/TO_CHAR函数;代码可以缩短为

SQL> WITH
  2     aggr_707884
  3     AS
  4        (SELECT '2021-09-11 12:22:33' reporting_position_date FROM DUAL)
  5  SELECT CASE
  6            WHEN TO_DATE (REPORTING_POSITION_DATE, 'YYYY-MM-DD HH24:MI:SS') >
  7                 TO_DATE ('2021-06-30 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
  8            THEN
  9               'FALSE'
 10            WHEN TO_DATE (REPORTING_POSITION_DATE, 'MM/DD/YYYY HH24:MI:SS') >
 11                 TO_DATE ('2021-06-30 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
 12            THEN
 13               'FALSE'
 14            ELSE
 15               'TRUE'
 16         END result
 17    FROM aggr_707884
 18  /

RESUL
-----
FALSE

SQL>

最后,您似乎在重复WHEN 条件(因此删除其中一个)并假设reporting_position_date 列的数据类型是DATE(应该是;不要将日期值存储为字符串),它变得如此简单

SQL> WITH aggr_707884 AS (SELECT SYSDATE reporting_position_date FROM DUAL)
  2  SELECT CASE
  3            WHEN REPORTING_POSITION_DATE > DATE '2021-06-30' THEN 'FALSE'
  4            ELSE 'TRUE'
  5         END result
  6    FROM aggr_707884;

RESUL
-----
FALSE

SQL>

【讨论】:

嗨,Littlefoot,它工作正常。你做到了

以上是关于错误消息 = ORA-00909:参数数量无效的主要内容,如果未能解决你的问题,请参考以下文章

SqlExceptionHelper 142: ORA-00909: 参数个数无效

SqlExceptionHelper 142: ORA-00909: 参数个数无效

Oracle sql 中的大写

ORA -00909 //sql 语句被忽略 ...过程创建时出现编译错误

PDO 更新错误无效参数号:绑定变量的数量与令牌的数量不匹配

教义错误“无效的参数号:绑定变量的数量与标记的数量不匹配”