【发布时间】:2010-03-12 05:45:38
【问题描述】:
我们正在使用 Java EE 应用程序,并且我们现在正在使用 Informix DB。我们的代码通过以下查询访问 DB “从测试中选择前 10 个 *” 现在据我所知,Oracle 不支持“前 10 *”类语句。我们有 1000 多个这样的查询。我们应该手动更改它还是可以进行一些手动定制?
【问题讨论】:
标签: java oracle migration database
我们正在使用 Java EE 应用程序,并且我们现在正在使用 Informix DB。我们的代码通过以下查询访问 DB “从测试中选择前 10 个 *” 现在据我所知,Oracle 不支持“前 10 *”类语句。我们有 1000 多个这样的查询。我们应该手动更改它还是可以进行一些手动定制?
【问题讨论】:
标签: java oracle migration database
这是一个很好的理由,要么尽可能只使用标准 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 中运行它。
【讨论】:
select * from (...) where rownum <= 10
您可以为 JDBC 驱动程序编写一个扩展来即时修改查询,但这可能有点过头了,因此仔细搜索和替换源代码以修改所有查询会更合适。
【讨论】:
Oracle 有ROWNUM 的概念来限制结果。您必须为此更新您的查询。
【讨论】:
TOP-n 和分页查询比仅使用 ROWNUM 稍微复杂一些。例如,您可能会惊讶于在同一查询中使用 ROWNUM 和 ORDER BY 时没有得到预期的结果。
查看http://www.oracle.com/technology/oramag/oracle/07-jan/o17asktom.html 了解有关 Oracle 中此类查询的更多信息。
【讨论】: