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

