[英]JPA & PostgreSQL: How do I call a stored procedure with void return type?
我正在嘗試調用執行更新的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>
DAO:
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數據庫通信。
不知道這是從哪里來的。 問題中缺少您的函數定義。
但你可以嘗試一個plpgsql
函數而不是sql
。 當聲明為RETURNS void
時,它們的返回類型略有不同。 考慮這個演示:
CREATE OR REPLACE FUNCTION f_sql()
RETURNS void AS
'UPDATE foo SET id = id+1 WHERE id = 34567'
LANGUAGE sql;
CREATE OR REPLACE FUNCTION f_plpgsql()
RETURNS void AS
$$
BEGIN
UPDATE foo SET id = id+1 WHERE id = 34567;
END;
$$ LANGUAGE plpgsql;
現在,VOID是虛構類型。 雖然plpgsql函數實際上返回VOID,但SQL函數似乎返回NULL。 我不確定自己為什么會這樣。
db=# SELECT f_sql() IS NULL;
?column?
----------
t
db=# SELECT f_plpgsql() IS NULL;
?column?
----------
f
程序
DROP FUNCTION updatename(bigint);
CREATE OR REPLACE FUNCTION updatename(var_id bigint)
RETURNS void AS $$
DECLARE
BEGIN
update person set
name ='lucas'
where id=var_id;
RETURN;
END;$$
LANGUAGE 'plpgsql';
//調用程序
Long id=50;
Query query = emProvider.get().createNativeQuery("SELECT updatename(?1)") ;
query.setParameter(1,id);
query.executeUpdate();
將DAO代碼更改為此工作:
public void deactivateByNotFoundInIncomingClinic(long clinicSystemId)
{
em.createNamedQuery("Clinic.deactivateByNotFoundInIncomingClinic")
.setParameter(1, clinicSystemId)
.getSingleResult();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.