首批通过分布式安全可靠测评,为关键业务系统打造
业务 SQL 子查询包含相同的列名,PS 执行报错 field list ambiguously defined
更新时间:2026-05-26 09:46
问题现象
业务 SQL 子查询包含相同的列名,PS 执行报错 field list ambiguously defined 示例如下所示:
select T.* from (select to_date(?, 'YYYY-MM-DD' hh24:mi:ss), to_date(?, 'YYYY-MM-DD' hh24:mi:ss) from dual) T
关键诊断信息
触发条件
SQL 子查询包含相同的列名;PS 执行。
问题原因
Oracle PS 模式下存在相同列名也会报错,但是 Oracle 对 ? 生成列名的方式跟 OceanBase 不一样。
Oracle:
select ?, ? from dual;select_item 的列名是:1, :2。OceanBase:
select ?, ? from dual;params: 1, 1 OceanBase 是用实际的值生成列名,所以列名是1, 1。
问题的风险及影响
SQL 子查询包含相同的列名,执行报错 field list ambiguously defined。
影响租户
影响 OceanBase 数据库中的 Oracle 租户,对于 SYS 租户和 MySQL 租户无影响。
影响版本
V3.2.3 GA(oceanbase-3.2.3.0-20220418212020)及之后版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库 V3.2.3 BP6 Hotfix1(oceanbase-3.2.3.3-106010052022120116)、V3.2.3 BP6 Hotfix2(oceanbase-3.2.3.3-106020042022120915)、V3.2.3 BP6 Hotfix3(oceanbase-3.2.3.3-106030012022121311)、V3.2.3 BP6 Hotfix4(oceanbase-3.2.3.3-106040022022122222)、V3.2.3 BP6 Hotfix5(oceanbase-3.2.3.3-106050012023051617)、V3.2.3 BP7(oceanbase-3.2.3.3-107000092023011911)。
规避方式
子查询中存在相同列名,应该分别给列取别名。
给子查询中相同列取不同的别名可以绕过。