如何重写oracle SQL语句以符合ansi-98并转换为DB2格式
Posted
技术标签:
【中文标题】如何重写oracle SQL语句以符合ansi-98并转换为DB2格式【英文标题】:How to re-write oracle SQL statement to comply ansi-98 and convert to DB2 format 【发布时间】:2019-06-23 21:12:19 【问题描述】:如何将这个旧的 oracle SQL 语句转换为 DB2 ANSI 98 编译:
SELECT
O.OBJECT_NAME AS OBJECT_NAME,
ATT.ATTRIBUTE_NAME AS ATTRIBUTE_NAME,
(CASE WHEN R.RULE_NAME = 'LAST_UPDATE' THEN 1
WHEN R.RULE_NAME = 'SOURCE_SUPREMACY' THEN 2
ELSE 3 END)
ID_RULE,
RD.SRC_CODE,
RD.WEIGTH
FROM
XOBJRULE ORL,
XOBJECT O,
XATTRIBUTE ATT,
XRULE R,
XOBJRULEDET RD,
CDSOURCEIDENTTP S
WHERE
ORL.ID_OBJECT = O.ID_OBJECT(+) AND
ORL.ID_ATTRIBUTE = ATT.ID_ATTRIBUTE(+) AND
ORL.ID_RULE = R.ID_RULE AND
R.ID_RULE = RD.ID_RULE(+) AND
RD.SRC_CODE = S.SOURCE_IDENT_TP_CD(+) AND
ORL.PERSON_ORGANIZATION IN (1,3)
ORDER BY 1,2,5 ASC
此 SQL 语句是从 Java 调试中提取的。我怎么能把它转换成 DB2 格式而不显着改变符号,这样我就不需要检查 Java 代码逻辑了?
【问题讨论】:
如果您在调试器中捕获 SQL,我猜您正在使用某种 Java 持久性框架,例如 Hibernate。如果是这种情况,它应该透明地处理数据库中的更改。至少这是谣言... :-) 【参考方案1】:查询使用 Oracle 自己的外连接语法(+)
。对于 DB2,您需要将所有连接转换为 ANSI SQL 92 显式连接语法:LEFT OUTER JOIN。
...
FROM
XOBJRULE ORL
left outer join XOBJECT O on ORL.ID_OBJECT = O.ID_OBJECT
left outer join XATTRIBUTE ATT on ORL.ID_ATTRIBUTE = ATT.ID_ATTRIBUTE
inner join XRULE R on ORL.ID_RULE = R.ID_RULE
left outer join XOBJRULEDET RD on R.ID_RULE = RD.ID_RULE
left outer join CDSOURCEIDENTTP S on RD.SRC_CODE = S.SOURCE_IDENT_TP_CD
WHERE ORL.PERSON_ORGANIZATION IN (1,3)
【讨论】:
进行上述更改并运行应用程序但仍然收到错误:com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL 错误:SQLCODE=-204,SQLSTATE=42704,SQLERRMC=DB2ADMIN。左,驱动器=3.67.27 . 它有效。抱歉,我忘记从“XOBJRULE ORL”中删除“,”以上是关于如何重写oracle SQL语句以符合ansi-98并转换为DB2格式的主要内容,如果未能解决你的问题,请参考以下文章
Oracle 数据库 - sql语句筛选出符合查询条件的第一条结果实例演示,sql查询结果只显示指定行数的数据方法
如何以输出生成“创建表语句”的方式格式化 Oracle SQL 查询?
Maximo/Oracle SQL 语句从连接表中返回不需要的数据
Oracle DB 12.2(12cR2)的一个新特性:硬解析失败的SQL语句(需要符合一定条件)打印到alert_sid.log中.