You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ORA-00907:视图脚本缺失右括号排查及语法检测工具咨询

问题:Oracle视图创建脚本触发ORA-00907缺失右括号错误,求排查及高效语法检测工具

编写的CREATE OR REPLACE VIEW脚本触发ORA-00907错误,提示缺失右括号。自行调试数小时,尝试过在线SQL检查工具仍未定位问题,恳请帮忙排查错误位置,同时咨询是否有更高效的在线语法错误检测网站。出错脚本如下:

CREATE OR REPLACE VIEW MY_VIEW_SCRIPT AS
SELECT * FROM
(
    SELECT 
        EFFECTIVE_DT,
        SOURCE_CD,
        VIEW_CD,
        SDEX_TRAN_CODE TRANSACTION_CD,
        'missing' TRANSACTION_DESC,
        'missing' TRANSACTION_CATEGORY_TXT,
        'Y' TRANSACTION_CODE_ACTIVE_IND,
        Trunc(SYSDATE) TRANSACTION_CODE_START_DT,
        NULL TRANSACTION_REVERSAL_CD,
        NULL PRINCIPLE_MULTIPLICATION_NBR,
        NULL INCOME_MULTIPLICATION_NBR,
        NULL SHARES_MULTIPLICATION_NBR,
        NULL COST_MULTIPLICATION_NBR,
        'INVEST1' ACCOUNTING_SYSTEM_CD
    FROM TRD_FPCMS_TRANS_FULL_01_STG
    WHERE SDEX_TRAN_CODE IS NOT NULL
    AND SOURCE_CD != 'INSTIO'
    UNION
    SELECT 
        EFFECTIVE_DT,
        SOURCE_CD,
        VIEW_CD,
        SDEX_TRAN_CODE TRANSACTION_CD,
        'missing' TRANSACTION_DESC,
        'missing' TRANSACTION_CATEGORY_TXT,
        'Y' TRANSACTION_CODE_ACTIVE_IND,
        Trunc(SYSDATE) TRANSACTION_CODE_START_DT,
        NULL TRANSACTION_REVERSAL_CD,
        NULL PRINCIPLE_MULTIPLICATION_NBR,
        NULL INCOME_MULTIPLICATION_NBR,
        NULL SHARES_MULTIPLICATION_NBR,
        NULL COST_MULTIPLICATION_NBR,
        'INVEST1' ACCOUNTING_SYSTEM_CD
    FROM TRD_FPCMS_TRANS_FULL_01_STG
    WHERE SDEX_TRAN_CODE IS NOT NULL
) stg
WHERE NOT EXISTS (
    SELECT 1
    FROM accounting_transaction_code tgt
    WHERE tgt.TRANSACTION_CD = stg.TRANSACTION_CD)
UNION
SELECT 
    businessdt effective_dt,
    holding_source_cd source_cd,
    holding_view_cd view_cd,
    txn.transaction_cd,
    txn.tran_desc transaction_desc,
    'missing' transaction_category_txt,
    'Y' transaction_code_active_ind,
    TRUNC(sysdate) transaction_code_start_dt,
    NULL transaction_reversal_cd,
    NULL principle_multiplication_nbr,
    NULL income_multiplication_nbr,
    NULL shares_multiplication_nbr,
    NULL cost_multiplication_nbr,
    'GENEVA' ACCOUNTING_SYSTEM_CD
FROM transactions_gva_kfk_stg tks, (
    SELECT DISTINCT
        CASE WHEN LEAD(transaction_cd) OVER (ORDER BY transaction_cd) = transaction_cd
            THEN  substr(transaction_cd,1,6)||substr(sys_guid(),6,6)
            ELSE transaction_cd  END transaction_cd,
            tran_desc
    FROM (
        SELECT 
            CASE WHEN (
                SELECT COUNT(1) 
                FROM accounting_transaction_code 
                WHERE transaction_cd =  UPPER(substr(trxcd,1,12))
            ) = 0
            THEN  UPPER(substr(trxcd,1,12))
            WHEN (
                SELECT COUNT(1) 
                FROM accounting_transaction_code 
                WHERE transaction_cd =  UPPER(substr(trxcd,1,6)||substr(trxcd,-6))
            ) = 0
            THEN  UPPER(substr(trxcd,1,6)||substr(trxcd,-6))
            ELSE substr(trxcd,1,6)||substr(sys_guid(),6,6)
            END transaction_cd,  tran_desc
        FROM (
            SELECT DISTINCT 
                gva.trxcd tran_desc, 
                regexp_replace(UPPER(trxcd),'[^A-Z0-9]') trxcd
                FROM transactions_gva_kfk_stg gva
                             WHERE NOT EXISTS
                             (SELECT 1
                             FROM accounting_transaction_code tgt
                             WHERE tgt.transaction_desc = gva.trxcd)
                             ) ORDER BY transaction_cd)) txn
 WHERE txn.tran_desc = tks.trxcd
   AND  NOT EXISTS
     (SELECT 1
     FROM accounting_transaction_code tgt
     WHERE tgt.transaction_desc = tks.trxcd);
错误位置排查

仔细检查脚本后,发现问题出在倒数第二层子查询的ORDER BY子句:
Oracle语法规定,当子查询作为FROM子句的数据源时,不能直接在子查询末尾添加ORDER BY(除非搭配ROWNUM限制行数,或用于窗口函数的排序场景)。你在倒数第二层的子查询末尾添加了ORDER BY transaction_cd,导致语法解析失败,触发ORA-00907错误。

错误代码片段:

FROM (
    SELECT DISTINCT 
        gva.trxcd tran_desc, 
        regexp_replace(UPPER(trxcd),'[^A-Z0-9]') trxcd
        FROM transactions_gva_kfk_stg gva
                     WHERE NOT EXISTS
                     (SELECT 1
                     FROM accounting_transaction_code tgt
                     WHERE tgt.transaction_desc = gva.trxcd)
                     ) ORDER BY transaction_cd -- 此句为错误根源

解决方法:直接删除该ORDER BY transaction_cd,若需要排序逻辑,将其移至外层查询中执行。

高效SQL语法检测工具推荐
  • Oracle官方SQL Developer:自带精准的Oracle语法校验功能,能直接定位语法错误位置,支持脚本执行测试,适配Oracle专属语法。
  • PL/SQL Developer:针对Oracle PL/SQL的专业开发工具,实时语法检查,错误提示清晰,还可提供代码优化建议。
  • DataGrip:支持多数据库语法检测,对Oracle语法兼容性好,能快速识别括号不匹配、关键字误用等常见问题。

内容的提问来源于stack exchange,提问作者ncisco3200

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 10:55:50