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
相关产品推荐
相关产品推荐

