【发布时间】:2018-10-02 12:09:13
【问题描述】:
当我尝试运行其中包含函数的 SQL 脚本时,系统会抛出错误:org.postgresql.util.PSQLException: A result was returned when none was expected.。
任务是获取一堆 sql 文件并在 DB 上执行它们。我使用 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';
这会失败('schema.' 表示某些模式,例如 'public'):
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');
这可能是什么原因?
【问题讨论】:
-
sqlQuery.executeUpdate() 旨在用于执行不返回任何结果的查询(更新,删除...),显然您的一个文件有一个选择子句,因此它将返回一些结果,对那些带有 select 子句的脚本使用 sqlQuery.getResultList()
-
@Elgayed 有没有办法在执行脚本之前以某种方式检查我应该使用哪个?因为我在文件中有各种脚本,使用 getResultList() 调用 void 也会产生错误。
-
你知道你不需要引用函数体吗?从 psql/pgadmin 运行时或仅从 java 代码运行时是否也会出现错误?
-
一种方法是使用“Statement”接口而不是“Query”inetrface。 statement 有一个执行函数,可以执行数据选择和记录更新,statement.execute("sqlQuery") docs.oracle.com/javase/6/docs/api/java/sql/…
-
@Elgayed 我会尝试...谢谢。
标签: java postgresql hibernate