我们正在使用Java EE应用程序,现在我们正在使用Informix DB。我们的代码使用类似的查询来访问数据库 “从测试中选择前10 *” 据我所知,Oracle不支持“前10 *”类型的语句。我们有超过1000个这样的查询。我们应该手动更改这个还是可以进行一些手动定制?
答案 0 :(得分:2)
这是一个很好的理由,要么尽可能只使用标准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可以以任何顺序返回行,所以
select first 10 * from test
没有意义,尤其是,如果你可能在不同的DBMS中运行它。
答案 1 :(得分:1)
您可以编写一个JDBC驱动程序的扩展来动态修改查询,但这可能是一种过度杀伤,因此仔细搜索并替换源代码以修改所有查询会更合适。
答案 2 :(得分:0)
Oracle有ROWNUM的概念来限制结果。您必须更新您的查询。
答案 3 :(得分:0)
TOP-n和分页查询比使用ROWNUM稍微复杂一点。例如,在同一查询中使用带有ORDER BY的ROWNUM时,您可能会惊讶地发现没有得到预期的结果。
检查http://www.oracle.com/technology/oramag/oracle/07-jan/o17asktom.html以获取有关Oracle中这类查询的更多信息。