Когда я пытаюсь запустить сценарии 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');
Какова возможная причина этого?