如何在H2中模拟Oracle ROWNUM

时间:2018-12-26 03:56:50

标签: oracle spring-boot spring-data-jpa h2

我正在使用H2数据库进行测试,但是在生产中我正在使用Oracle。我正在尝试使用以下查询。

ERROR 1449 (HY000): The user specified as a definer ('mysql.infoschema'@'localhost') does not exist

具有以下配置

SELECT ROWNUM as id, name, state FROM info;

但是我得到public class DatabaseConfiguration { private final static DriverManagerDataSource dataSource = initializeDataSource(); @Bean @Profile("test") public DataSource dataSource() { return dataSource; } private static DriverManagerDataSource initializeDataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("org.h2.Driver"); dataSource.setUrl("jdbc:h2:mem:db;DB_CLOSE_DELAY=-1;MODE=Oracle;"); dataSource.setUsername("sa"); dataSource.setPassword("sa"); return dataSource; } } 。 H2是否支持ROWNUM?

3 个答案:

答案 0 :(得分:1)

否,H2不支持语法ROWNUM。它提供了ROWNUM() 功能,可用于实现相同的目的,但是在语法或行为上都不相同。

  

我正在使用H2数据库进行测试,但是在生产中,我正在使用Oracle。

您问题的最佳答案是请勿使用其他RDBMS进行开发。使用Oracle进行开发的可能选项的非详尽列表,但并不详尽:

  • 在本地使用Oracle Express。它的功能还不完整(例如,它没有完整的Oracle Spatial。),但是如果您的使用仅限于可用功能,则可能就足够了。另外,看来Windows安装目前仅提供11g,这意味着您需要一台VM来承载18。
  • 设置Amazon RDS实例仅用于开发。在美国地区,最便宜的实例每年不到$ 350,并且如果您认真考虑将内存数据库作为替代品,则可以使用这些便宜的实例做得很好。几乎可以肯定,这比您每天工作8小时的报酬少。与处理两个不同的RDBMS所花费的时间相比(甚至由于限制而使用Express),这可能是值得的。您的公司甚至可以通过在晚上或其他时间离线使数据库脱机而节省一些费用。
  • 在现有的Oracle服务器上询问单独的数据库和实例,并将其专用于开发。这将需要确保有足够的可用硬件,并确保对处理和磁盘空间进行硬性限制,以防止其消耗过多的资源。
  • 存在 某种形式的许可开发人员安排,但显然是really weird

或者,如果项目仍处于早期阶段,则考虑切换到更好地支持开发的其他RDBMS。 MS SQL Server的Express版本在这方面绝对不错,而PostgreSQL和MySQL甚至更好,因为它们随处都是免费的。与Oracle相比,更容易找到免费的文档和有关这些数据库的帮助。

无论如何,找到一种在开发和生产中实际使用相同数据库技术的方法。开发人员时间可能是您公司最昂贵的资源之一,并且建立/维护永远不会生产的H2数据库并不是对这种资源(或QA资源或任何人的时间和精力)的良好利用。

如果您的问题不完整,并且您实际上将H2用于开发以外的其他用途,请设置代码以对每个RDBMS使用单独的查询。每个RDBMS都有自己的SQL方言。尝试对不同的RDBMS使用相同的查询是一个巨大的错误。即使这两种语法都可以使用,它们也将具有不同的可用功能,并且除了最简单的查询以外,其他所有功能的性能特征都不太可能相同。使用单独的查询。

答案 1 :(得分:0)

ROWID一样,ROWNUM仅针对Oracle。

但是您可以使用以下方法实现相同的结果:

SELECT rownum(), name, state FROM info

rownum()是系统功能H2。 See it here

答案 2 :(得分:0)

在h2版本1.4.200中,ROWNUM开箱即用。