JPA & PostgreSQL: как вызвать хранимую процедуру с возвращаемым типом void? - PullRequest
3 голосов
/ 30 ноября 2011

Я пытаюсь вызвать функцию 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();
}

Помощь!

Обновление:

Использование EclipeseLink на GlassFish 3.1.1 для связи с базой данных PostgreSQL 9.0 через драйверы JDBC 4 PostgreSQL 9.0-801.

Ответы [ 3 ]

2 голосов
/ 30 ноября 2011

Не уверен, откуда это взялось.В вопросе отсутствует определение вашей функции.
Но вы можете попробовать функцию 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
1 голос
/ 28 февраля 2013

процедура

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();
1 голос
/ 30 ноября 2011

Изменение кода DAO на это сработало:

public void deactivateByNotFoundInIncomingClinic(long clinicSystemId)
{
    em.createNamedQuery("Clinic.deactivateByNotFoundInIncomingClinic")
            .setParameter(1, clinicSystemId)
            .getSingleResult();
}
...