【发布时间】:2011-11-29 22:32:36
【问题描述】:
我正在尝试调用执行更新的 PL/pgSQL 函数(语言 sql,返回 void)。我遇到了这个异常:
Internal Exception: org.postgresql.util.PSQLException: A result was returned when none was expected.
persistence.xml:
<named-native-query name="Clinic.deactivateByNotFoundInIncomingClinic">
<query>
<![CDATA[
select apply_incoming_clinic_deletions(?)
]]>
</query>
</named-native-query>
道:
public void deactivateByNotFoundInIncomingClinic(long clinicSystemId)
{
em.createNamedQuery("Clinic.deactivateByNotFoundInIncomingClinic")
.setParameter(1, clinicSystemId)
.executeUpdate();
}
救命!
更新:
在 GlassFish 3.1.1 上使用 EclipeseLink 通过 PostgreSQL 9.0-801 JDBC 4 驱动程序与 PostgreSQL 9.0 数据库通信。
【问题讨论】:
-
如果您可以直接运行该 SQL 语句(psql 或 pgAdminIII),您可以将问题隔离到数据库或中间代码。其他要检查的事项:函数的返回值是否与声明的返回类型匹配?尽管出现错误消息,是否仍执行更新? JPA 和 PostgreSQL 是最新的吗?您是否尝试提高日志级别或调试级别以获取更多信息?
-
@Catcall 请再次阅读问题。该函数没有返回类型。 SQL 语句 (
select apply_incoming_clinic_deletions(1)) 本身运行良好。 -
函数有返回类型;它的类型是
void。当函数返回(或试图返回)其声明类型以外的内容时,在 PostgreSQL 的早期版本中存在相同的错误消息。 -
如果 SQL 语句在 JPA 之外工作,在我看来问题必须是数据、您的代码、JPA 或数据库连接器。 (JPA 有自己的,还是使用 JDBC?)也许数据库连接器还没有准备好处理 Erwin Brandstetter 在下面指出的微妙之处。
-
我遇到了同样的问题(不过我使用的是不同的 JDBC 包装库),我可以通过使用
execute()而不是executeUpdate()来解决它。
标签: java postgresql jpa plpgsql