【问题标题】:Migrating to Oracle迁移到 Oracle
【发布时间】:2010-03-12 05:45:38
【问题描述】:

我们正在使用 Java EE 应用程序,并且我们现在正在使用 Informix DB。我们的代码通过以下查询访问 DB “从测试中选择前 10 个 *” 现在据我所知,Oracle 不支持“前 10 *”类语句。我们有 1000 多个这样的查询。我们应该手动更改它还是可以进行一些手动定制?

【问题讨论】:

    标签: java oracle migration database


    【解决方案1】:

    这是一个很好的理由,要么尽可能只使用标准 SQL,要么将这些依赖项隔离到存储过程中(是的,我知道在这种特定情况下这对你没有帮助,我只是想我会提到供以后参考)。

    我怀疑您必须单独更改每个,尽管在源代码中简单搜索“select”或“first”将是一个好的开始。

    然后您可以决定如何更改它们,因为您可能还希望它在 Informix 上工作。

    就其价值而言,我认为您与 Oracle 的效果相同

    select * from ( select * from mytable ) where rownum <= 10
    

    我会将动态构建查询(基于模板)的工作转移到另一层,该层可以根据您配置的数据库返回不同的查询。然后,当您还想支持 DB2(例如)时,只需更改该层即可。

    例如,调用如下:

    gimmeRowLimitedSqlQuery ("* from test",10);
    

    这会给你:

    select first 10 * from test
    select * from test where rownum <= 10
    

    我还应该提到,虽然我意识到您的查询只是一个示例,但如果您不指定 order by 所以,SQL 可以按 any 顺序返回行

    select first 10 * from test
    

    意义不大,尤其是如果您可能在不同的 DBMS 中运行它。

    【讨论】:

    • 在使用 rownum 时需要小心——它应该几乎总是在外部查询中使用,例如。 select * from (...) where rownum &lt;= 10
    • 正如@paxdiablo 所暗示的那样,您需要在内部选择中使用 ORDER BY 才能获得任何合理的信息。
    【解决方案2】:

    您可以为 JDBC 驱动程序编写一个扩展来即时修改查询,但这可能有点过头了,因此仔细搜索和替换源代码以修改所有查询会更合适。

    【讨论】:

      【解决方案3】:

      Oracle 有ROWNUM 的概念来限制结果。您必须为此更新您的查询。

      【讨论】:

        【解决方案4】:

        TOP-n 和分页查询比仅使用 ROWNUM 稍微复杂一些。例如,您可能会惊讶于在同一查询中使用 ROWNUM 和 ORDER BY 时没有得到预期的结果。

        查看http://www.oracle.com/technology/oramag/oracle/07-jan/o17asktom.html 了解有关 Oracle 中此类查询的更多信息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-13
          • 2011-08-25
          • 2016-08-22
          • 2013-09-04
          • 1970-01-01
          • 1970-01-01
          • 2022-10-19
          • 2015-04-17
          相关资源
          最近更新 更多