ORA-00907: 缺少右括号 -- 奇怪

Posted

技术标签:

【中文标题】ORA-00907: 缺少右括号 -- 奇怪【英文标题】:ORA-00907: missing right parenthesis -- Strange 【发布时间】:2017-06-15 05:58:39 【问题描述】:

我收到错误“ORA-00907:缺少右括号”,但我检查过所有括号都在那里,所以我很难过。

使用 Select 语句时出现此错误。请帮忙。我还需要使用 Between to_date 来获取两个特定日期之间的数据。

select

 DT.ARRIVAL||','||
 DT.LOCATION_CODE||','|| nvl (decode (
                                 DT.OWNER_FLAG, 'R', 'B', 'M', 'B',
                              DT.OWNER_FLAG), 'B') OWNER_FLAG,
 DT.RECEIPT||','||
 PP.BILL_NUMBER||','||
 DT.TRANSPORT_MODE||','||
 substr (TRANSPORT_NAME,1,20)
               , TRANSPORT_TYPE||','||
 PP.PRODUCT||','||
 AP.PRODUCT_NAME||','||
 AP.PRODUCT_QTY||','||
 AP.PRODUCT_QTY_Units||','||
 DT.INSPECTOR||','||
 AP.PRODUCT_NO||','||
 AP.PRODUCT_FLAG||','||
 PP.BILL_STATUS
 from BILL_PARCEL PP,
 PRODUCT DT,
 SUPPORT AP,
 TRANSPORT V
 where PP.BILL_NUMBER = DT.BILL_NUMBER
 and  PP.BILL_NUMBER = AP.BILL_NUMBER
 and DT.BILL_NUMBER = AP.BILL_NUMBER
 and AP.YEAR = DT.YEAR
 and PP.YEAR = DT.YEAR
 and PP.PRODUCT_NAME= AP.PRODUCT_NAME
 and PP.YEAR = 2017 and DT.YEAR = 2017 and AP.YEAR=2017
 and nvl(AP.BILL_STATUS,'0') not in ('D','I','R')
 and V.TRANSPORT_ID = DT.VESS_ID
 and   TRANSPORT_MODE != 'X'
 and (  (DT.ARRIVAL        between 
 to_date(to_char(&C_FROM_DATE,'DD-MON-YY'),'DD-MON-RR')
                       and     
 to_date(to_char(&C_TO_DATE,'DD-MON-YY'),'DD-MON-RR')
 and nvl(AP.BILL_STATUS,'0') in ('U','S')
        )
 or ( TRANSFER_END between 
 to_date(to_char(&C_FROM_DATE,'DD-MON-YY') ,'DD-MON-RR')
                       and     
 to_date(to_char(&C_TO_DATE,'DD-MON-YY'),'DD-MON-RR')
 and nvl(AP.BILL_STATUS,'0') in ('P','C','A')
        )
      )
 order by decode (AP.BILL_STATUS, 'U', DT.ARRIVAL
                              ,'S', DT.ARRIVAL
                                  , TRANSFER_DATE)
,decode (TRANSPORT_MODE,'B','1','T','2','P','3',TRANSPORT_MODE);

【问题讨论】:

在以下位置出现错误:和 ( ( DT.ARRIVAL between * ERROR at line 33: ORA-00907: missing right parenthesis 【参考方案1】:

改变这一行,

to_date(to_char(&C_TO_DATE,'DD-MON-YY'),'DD-MON-RR') 

to_date(to_char(&C_TO_DATE,'DD-MON-YY'),'DD-MON-RR') ))
                                                 --  ^

你真的缺少右括号。

【讨论】:

这是错误的。 ( (DT.ARRIVAL between 开头的匹配括号是 order by 子句之前的两个括号。 我在两个地方使用 to_date(to_char(&C_TO_DATE,'DD-MON-YY'),'DD-MON-RR') 我需要在两个地方更改它还是只在一个地方? @APC 请建议我需要进行更改的确切行。提前致谢【参考方案2】:

我认为问题可能出在替换变量上。在 SQL*Plus 中,我们需要将日期输入视为字符串。所以你需要引用变量,像这样:

to_date(to_char('&C_FROM_DATE','DD-MON-YY') ,'DD-MON-RR') 

这当然意味着您不需要to_char(),所以就这样:

to_date('&C_FROM_DATE','DD-MON-RR') 

顺便说一句,在撰写本文时是 2017,所以您真的真的真的不应该使用 RR 掩码。让自己摆脱两位数的年份,否则你会inevitably introduce corrupt data into your tables。使用:

to_date('&C_FROM_DATE','DD-MON-YYYY') 

Oracle 仍然允许您输入两位数的年份(世纪默认为当前年份),但至少意图是明确的。

【讨论】:

顺便说一句,在撰写本文时是 2017 年,所以您真的真的真的不应该使用 RR 面具。让自己摆脱两位数的年份,否则您将不可避免地在表中引入损坏的数据---->您的意思是说,我也应该从查询中删除 'DD-MON-RR') 掩码??如果我错了,请纠正我.....【参考方案3】:

Oracle 说:TO_CHAR (datetime) 转换 DATETIMESTAMPTIMESTAMP WITH TIME ZONE 或 TIMESTAMP WITH LOCAL TIME ZONE 数据类型为 VARCHAR2 数据类型的值。无论如何,正如@APC 所说,您不需要 to_char(...) 功能。如果您编写类似TO_DATE(TO_CHAR(sysdate, 'MM/DD/YYYY'), 'MM/DD/YYYY') 的内容是正确的,并且您的代码中不需要额外的 pharentesis,这里有一个示例:select TO_DATE(TO_CHAR(sysdate, 'MM/DD/YYYY'), 'MM/DD/YYYY') from dual;。我想建议您,当您遇到诸如 右咽缺失,尝试多次检查您正在编写的查询和表达式,在您编写时执行查询,而不仅仅是在最后。

【讨论】:

以上是关于ORA-00907: 缺少右括号 -- 奇怪的主要内容,如果未能解决你的问题,请参考以下文章

SQL 错误:ORA-00907:缺少右括号 00907。00000 -“缺少右括号”

错误报告 - ORA-00907: 缺少右括号 00907. 00000 - “缺少右括号

ORA-00907: 缺少右括号 00907. 00000 - “缺少右括号” *原因:*操作:行错误:44 列:30

ORA-00907: 缺少右括号

错误:ORA-00907:oracle 缺少右括号

请帮助解决“ORA-00907:缺少右括号”错误