You need to enable JavaScript to run this app. 在Synapse Notebook中执行SQL查询报ORA-00907缺失右括号错误求助
优惠活动
大模型
产品
解决方案
定价
更多

在Synapse Notebook中执行SQL查询报ORA-00907缺失右括号错误求助

报错根因定位

ORA-00907是Oracle侧返回的语法解析错误,结合Synapse Notebook的执行场景,排除SQL逻辑本身的基础语法问题后,触发原因集中在三类:

  • 字符串转义/传输异常:你使用普通单引号包裹多行SQL,Python转义、Synapse配套的Oracle JDBC驱动对换行/制表符的解析存在兼容性问题,导致SQL传到Oracle时括号结构被意外破坏;或是复制代码时带入了隐藏全角括号、不可见格式字符,Oracle无法识别全角括号,判定为缺失右括号。
  • 语法兼容隐患:部分旧版Oracle对未加表别名的字段、多层嵌套括号的解析存在已知bug,或是你在JDBC执行时保留了SQL末尾的分号,部分驱动会将分号后的空内容误报为括号不匹配。
  • 驱动版本问题:旧版Oracle JDBC驱动对多行SQL的解析存在缺陷,会误报括号类语法错误。
可行修正方案

1. 修正SQL字符串定义与语法兼容

将原普通单引号包裹的多行字符串替换为Python三引号,补充字段表别名、移除冗余嵌套括号、删除SQL末尾分号,从根源消除大部分兼容问题:

qu = '''SELECT DS.TABLESPACE_NAME AS SCHEMA_NAME,
             DS.SEGMENT_NAME AS TABLE_NAME,
             ROUND(SUM(DS.BYTES) / 1024 / 1024) AS MB
        FROM DBA_SEGMENTS DS
       WHERE DS.SEGMENT_NAME IN (SELECT TABLE_NAME FROM DBA_TABLES)
       GROUP BY DS.TABLESPACE_NAME, DS.SEGMENT_NAME'''
  • 三引号可避免Python多行字符串的转义干扰,确保SQL原样传输到Oracle
  • 给SEGMENT_NAME补充DS.表别名前缀,消除字段歧义,适配旧版Oracle的解析逻辑
  • 将原嵌套除以(1024 * 1024)拆分为连续除以两个1024,减少不必要的嵌套括号,降低解析出错概率
  • 删除SQL末尾分号,适配JDBC执行规则(Oracle JDBC无需分号作为语句分隔符)

2. 跨端验证排查隐藏字符问题

将修正后的SQL直接复制到本地Oracle客户端(如DBeaver、PL/SQL Developer)执行:

  • 如果客户端执行正常,说明是Synapse环境传输层的隐藏字符问题,可在Synapse Notebook中手动重新输入SQL,避免直接复制原有代码带入的格式字符
  • 如果客户端同样报错,可将IN子查询改写为EXISTS关联,进一步兼容旧版Oracle的子查询解析逻辑:
qu = '''SELECT DS.TABLESPACE_NAME AS SCHEMA_NAME,
             DS.SEGMENT_NAME AS TABLE_NAME,
             ROUND(SUM(DS.BYTES) / 1024 / 1024) AS MB
        FROM DBA_SEGMENTS DS
       WHERE EXISTS (SELECT 1 FROM DBA_TABLES T WHERE T.TABLE_NAME = DS.SEGMENT_NAME)
       GROUP BY DS.TABLESPACE_NAME, DS.SEGMENT_NAME'''

3. 驱动版本优化

如果前两步修正后仍报错,可升级Synapse Notebook中配置的Oracle JDBC驱动到19c及以上稳定版本,旧版驱动对多行SQL的解析存在已知缺陷,会误报括号类语法错误。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 10:45:08