SQLException pg_get_serial_sequence NOT FOUND

Posted

技术标签:

【中文标题】SQLException pg_get_serial_sequence NOT FOUND【英文标题】: 【发布时间】:2020-01-23 09:46:37 【问题描述】:

我正在尝试使用 H2 进行 JUnit 测试,并且我的 APP 已配置为与 PostgreSQL 和 ACL 的 Spring Boot 一起使用。

所以我必须在应用程序中添加接下来的两行:

`mutableAclService.setClassIdentityQuery("select currval(pg_get_serial_sequence('acl_class', 'id'))");
mutableAclService.setSidIdentityQuery("select currval(pg_get_serial_sequence('acl_sid', 'id'))");`

创建 AclService。

我在 application.properties 中有配置 (spring.datasource.url=jdbc:h2:~/test_db;MODE=PostgreSQL)

但它总是返回我:

org.springframework.jdbc.UncategorizedSQLException: StatementCallback; SQL 的未分类 SQLException [选择 currval(pg_get_serial_sequence('acl_sid', 'id'))]; SQL 状态 [90022]; 错误代码 [90022];未找到函数“PG_GET_SERIAL_SEQUENCE”; SQL 语句:选择 currval(pg_get_serial_sequence('acl_sid', 'id')) [90022-197];嵌套异常是 org.h2.jdbc.JdbcSQLException: 未找到函数“PG_GET_SERIAL_SEQUENCE”; SQL语句...

有人知道怎么解决吗?

【问题讨论】:

你验证H2支持Postgres系统功能了吗? 我没有找到任何关于 H2 是否与此功能兼容的信息,所以这就是我要求的原因。 h2 不是 Postgres。获得像 Postgres 一样工作和行为的数据库的唯一方法是使用 Postgres 【参考方案1】:

更换

"select currval(pg_get_serial_sequence('acl_class', 'id'))"

对于 SQL 标准查询

"SELECT CURRVAL(SELECT SEQUENCE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'acl_class' AND COLUMN_NAME = 'id')"

有效!

【讨论】:

它不是标准的,它是 H2 特有的。仅使用标准语法无法获取此类信息。

以上是关于SQLException pg_get_serial_sequence NOT FOUND的主要内容,如果未能解决你的问题,请参考以下文章

异常和 SQLException 的区别

SQLException: 游标状态无效

SQLException.getSQLState 的所有可能值是啥?

java.sql.SQLException:getShort() 的值无效 - ''

Cause: java.sql.SQLException: 请求的转换无效 ; uncategorized SQLException for SQL []; SQL state [99999]; er

Oracle DB:java.sql.SQLException:关闭连接