右括号缺失 ora-00907

Posted

技术标签:

【中文标题】右括号缺失 ora-00907【英文标题】:right parenthesis missing ora-00907 【发布时间】:2012-06-09 04:56:34 【问题描述】:
SELECT * FROM (
    SELECT
    ORG_ROADMARK,
    COUNT(DISTINCT EQUIP_INITIAL||EQUIP_NUM||move_dtm) AS Billing_Count
    FROM CMD_BILLING_INFO
    WHERE move_dtm BETWEEN' 01-FEB-12' AND '29-FEB-12'
    AND (
        (MOVE_TYPE_CD ='ICR' AND EQUIP_STATUS_CD IN ('L','W'))
        OR
        ( MOVE_TYPE_CD ='RLO' AND EQUIP_STATUS_CD ='L' )
        OR
        ( MOVE_TYPE_CD ='RMT' AND EQUIP_STATUS_CD ='W' )
    ) GROUPBY ORG_ROADMARK
) ORDERBY ORG_ROADMARK

上面的 sql 缺少右括号错误。使用这个 sql 我能够得到当月的结果,并尝试修改它以逐月获得过去 24 个月的结果,请有任何建议。

【问题讨论】:

请您格式化您的代码,以便人们阅读。相信我先这样做,然后看看你是否能找到丢失的) 【参考方案1】:

    GROUP BY 子句中的 GROUPBYORDER BY 子句中的 ORDERBY 之间需要一个空格。

    虽然它不会导致语法错误,但您几乎可以肯定不要在BETWEEN 旁边使用单引号。我强烈建议您也不要依赖隐式转换,因为具有不同 NLS 设置的人可能想要运行此代码。

    WHERE move_dtm BETWEEN to_date( '01-FEB-2012', 'DD-MON-YYYY' ) 
                   AND to_date( '29-FEB-2012', 'DD-MON-YYYY' )
    

    WHERE move_dtm BETWEEN date '2012-02-01' AND date '2012-02-29'
    

【讨论】:

亲爱的贾斯汀, 非常感谢您的支持,现在我想分解这份报告以逐月显示。目前,我能够获得任何给定日期的总计数,现在我正在尝试对任何给定日期进行月份计数。非常感谢您的建议。【参考方案2】:

ORA-00907 异常有两个原因。

首先,平庸地,有一个左括号 - ( - 没有伙伴右括号 - )。这些可能很难手动诊断,尤其是在大型 SQL 语句中,但如果您有一个不错的 IDE 并带有括号匹配功能,那就很容易了。

第二个原因是包含括号的 SQL 语句中的语法错误。如果我们输入错误的关键字,Oracle 会将其视为对象名称。这可能会导致它抛出许多错误,例如 ORA-00905、ORA-00936 和the 00900 to 01499 range 中的许多其他错误。 ORA-00907 就是其中之一。同样,一个体面的 IDE 在这里会有所帮助:语法突出显示可以帮助我们识别拼写错误,因为它不能突出显示我们拼错的关键字。

在您的特定情况下,您将GROUP BY 压缩成一个单词可能是罪魁祸首。您还需要修复ORDER BY

【讨论】:

【参考方案3】:

问题似乎是放错地方引用BETWEEN'

BETWEEN' 01-FEB-12' AND '29-FEB-12'

【讨论】:

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

ORA-00907: 缺失右括号问题整理解决

右括号缺失 ora-00907

ORA-00907:缺失右括号

java.sql.SQLSyntaxErrorException: ORA-00907: 缺失右括号

ORA-00907: 缺失右括号问题或com.alibaba.druid.sql.parser.ParserException: TODO :IDENTIFIER的原因

oracle 数据库显示缺失右括号