如何重写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格式的主要内容,如果未能解决你的问题,请参考以下文章

sql查询语句如何能把不符合条件的数据也一并查出来

Oracle 数据库 - sql语句筛选出符合查询条件的第一条结果实例演示,sql查询结果只显示指定行数的数据方法

如何以输出生成“创建表语句”的方式格式化 Oracle SQL 查询?

Maximo/Oracle SQL 语句从连接表中返回不需要的数据

Oracle DB 12.2(12cR2)的一个新特性:硬解析失败的SQL语句(需要符合一定条件)打印到alert_sid.log中.

oracle如何执行多条create 语句