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) 转换 DATE、TIMESTAMP、TIMESTAMP 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 - “缺少右括号