Sybase带READPAST的左连接查询迁移Oracle的语法转换咨询
Sybase查询迁移Oracle READPAST语法适配方案
核心替换规则
READPAST适配:Sybase中READPAST的作用是查询时跳过被其他事务加排他锁的行,既不等待锁释放也不抛出锁异常。Oracle 11g及以上版本等价逻辑可以通过SKIP LOCKED实现,二者行为完全对齐。如果业务仅要求查询不被锁阻塞、不需要跳过锁行,Oracle默认读提交隔离级别下的一致性读天然支持该特性,无需额外加参数。- 函数适配:Sybase的
ISNULL函数等价替换为Oracle的NVL函数。
适配后完整语句(完全对齐原READPAST逻辑)
SELECT CC.COURS_CLIENT_ID , CC.TYPE_CLIENT , NVL( RT1.CODE , RV.CODE) AS CODE FROM TB_CLIENT CC LEFT JOIN TB_TRANSCO RT1 ON CC.INST_ID = RT1.CONTRAT_ID AND RT1.TRANSCO_ID = 111 LEFT JOIN TB_VAL RV ON CC.INST_ID = RV.VAL_ID AND RV.TRANSCO_ID = 111 LEFT JOIN TB_CONT RC ON RC.CONTRIB_ID = CC.CONTRIB_ID WHERE CC.TRT_ID = 123 AND CC.STATUT = 'STD' FOR UPDATE SKIP LOCKED ORDER BY CC.COURS_CLIENT_ID,RT1.CRE_DT
轻量适配方案(无锁跳过需求时使用)
如果业务不需要跳过被锁定的行,仅要求查询不阻塞,直接删除所有READPAST关键字、替换ISNULL即可,性能更优:
SELECT CC.COURS_CLIENT_ID , CC.TYPE_CLIENT , NVL( RT1.CODE , RV.CODE) AS CODE FROM TB_CLIENT CC LEFT JOIN TB_TRANSCO RT1 ON CC.INST_ID = RT1.CONTRAT_ID AND RT1.TRANSCO_ID = 111 LEFT JOIN TB_VAL RV ON CC.INST_ID = RV.VAL_ID AND RV.TRANSCO_ID = 111 LEFT JOIN TB_CONT RC ON RC.CONTRIB_ID = CC.CONTRIB_ID WHERE CC.TRT_ID = 123 AND CC.STATUT = 'STD' ORDER BY CC.COURS_CLIENT_ID,RT1.CRE_DT
内容的提问来源于stack exchange,提问作者Goncalo Bernardo
相关产品推荐
相关产品推荐

