PSQLException: результат был возвращен, когда ничего не ожидалось - PullRequest
0 голосов
/ 02 октября 2018

Когда я пытаюсь запустить сценарии SQL, в которых есть функции, система выдает ошибку: org.postgresql.util.PSQLException: A result was returned when none was expected..

Задача состоит в том, чтобы взять кучу файлов sql и выполнить их в БД.Я использую hibernate и postgres, вот зависимости от POM:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-java8</artifactId>
        <version>5.0.12.Final</version>
    </dependency>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.2.5</version>
    </dependency>

Все файлы выполняются один за другим в цикле.Я начинаю транзакцию перед началом цикла и фиксирую ее после завершения цикла.Текст из каждого файла передается в Query sqlQuery = session.createSQLQuery(script), и после этого я вызываю sqlQuery.executeUpdate().Это где он терпит неудачу, когда встречает скрипт с функцией.Кажется, что только более сложные функции дают сбой, маленькие функции передают OK

Это, например, проходит:

DO'
DECLARE property RECORD;
BEGIN
  FOR property IN SELECT id, default_value
    FROM schema.table WHERE type_id = 3 LOOP
      if (property.default_value) IS NULL THEN
        UPDATE schema.table SET default_value = ''DEFAULT'' WHERE id = property.id;
      END IF ;
  END LOOP;
END';

Это сбой («схема». Означает некоторую схему, такую ​​как «общедоступная»).):

CREATE OR REPLACE FUNCTION theScript(TEXT)
  RETURNS VOID AS '
DECLARE
  _table_name ALIAS FOR $1;
  _sub_id integer;
  _prop_id integer;
  _ent_id integer;
  _ent_sub_id integer;
BEGIN
  FOR _ent_id IN EXECUTE ''SELECT id FROM schema.'' || _table_name LOOP
    EXECUTE '' SELECT sub_id FROM schema.'' || _table_name || '' WHERE id = '' || _ent_id
    INTO _ent_sub_id;
    IF _ent_sub_id IS NULL THEN
      EXECUTE '' SELECT sub_property_id FROM schema.'' || _table_name || ''_data WHERE '' || _table_name || ''_id = '' || _ent_id || '' LIMIT 1''
      INTO _prop_id;
      SELECT subdivision_id
      from bms.subdivision_property
      where id = _prop_id
      INTO _sub_id;
      EXECUTE '' UPDATE schema.'' || _table_name || '' SET sub_id = '' || (_sub_id) || '' WHERE id = '' || _ent_id;
      RAISE NOTICE ''UPDATED FIELD ID: %'', _ent_id;
    END IF;
  END LOOP;
END;'
LANGUAGE plpgsql;

SELECT theScript('terminal');

Какова возможная причина этого?

1 Ответ

0 голосов
/ 02 октября 2018

select void

В вашем операторе SELECT SELECT возвращает одну строку (потому что нет FROM и нет WHERE) с одним столбцом типа void.Это возвращает что-то.

create function is_void(p_text text) returns void
  language plpgsql as
'begin
end';

select is_void('one');

Если вы не хотите ничего возвращать, вы можете сделать что-то вроде этого:

create function is_void(p_text text) returns void
  language plpgsql as
'begin
end';

do $$
begin
  perform is_void('one');
end
$$;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...