我正在使用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?
答案 0 :(得分:1)
否,H2不支持语法ROWNUM
。它提供了ROWNUM()
功能,可用于实现相同的目的,但是在语法或行为上都不相同。
我正在使用H2数据库进行测试,但是在生产中,我正在使用Oracle。
您问题的最佳答案是请勿使用其他RDBMS进行开发。使用Oracle进行开发的可能选项的非详尽列表,但并不详尽:
或者,如果项目仍处于早期阶段,则考虑切换到更好地支持开发的其他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开箱即用。