1

我收到了一个大型 Oracle9i 方案,我应该将其转换为 Oracle11g。不幸的是,它在函数、过程和包中使用了大量逻辑上无效的sql语句“按级别排序兄弟”,Oracle9i没有拒绝,但在Oracle11g中会导致解析器错误。

我想要实现的是最简单的方法来替换无效语句,而无需手动修补程序包和过程,或者在我手动修复所有此类错误之前,在生产服务器上以某种方式禁用此错误的解析器行为一段时间。

可以以某种“自动”方式完成吗?

提前致谢!

PS 好的,这是查询本身的示例。请注意,查询没有语法错误。区别在于 Oracle9i 和 Oracle11g 及更高版本在检查逻辑正确性的验证规则时的行为方式。

select version, ord, level as lvl from
(
 select a.key, a.parent_key, a.version, a.ord from b_rds_elem a where a.dict_key = 306350
)
connect by prior key = parent_key
start with parent_key is null
order siblings by level, ord

此查询将由 Oracle 9i 及更低版本执行,并且将在高于 9i 的情况下抛出错误 ORA-00976。按级别排序兄弟姐妹是没有意义的,因为在分层查询中,默认情况下所有节点都已经按级别排序。因此,9i 对这种愚蠢的查询更加自由,但 11g 则不然。

4

1 回答 1

0

In general, you do not order by level, that would muck it up. Just order by the attributes - it orders the SIBILINGS preserving the levels. Order by level would not make sense with "siblings". In 11G, it is validated and you get an error, but in 9i this gets unnoticed and destroys the levels for siblings.

于 2013-11-11T09:38:39.207 回答