java - PSQLException:预期没有结果时返回了结果
问题描述
当我尝试运行其中包含函数的 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');
这可能是什么原因?
解决方案
选择无效
在您的SELECT
语句中,SELECT
返回一行(因为 noFROM
和 no 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
$$;
推荐阅读
- c++ - 在 C++ 中实现调度程序(定时器)
- postgresql - Postgres:具有两个外键的非空约束
- javascript - 如何在运行时在 AngularJS 中动态设置 HTML id 属性
- java - Springboot - 监听特权端口(以编程方式)
- tfs - GenericJson WebHook 返回错误请求
- java - Spring boot 2.0.2,使用 Aop 拦截 Cloud Stream 注释不再起作用
- php - cURL PHP,内容类型为 NULL - 为什么?
- google-photos - 获取 Google 相册封面照片的 ID
- internet-explorer - VueJS 组件未在 IE11 中呈现
- reactjs - 如何使用 Jest 和 Enzyme 对包含 history.push 的反应事件处理程序进行单元测试?