【问题标题】:PSQLException: A result was returned when none was expectedPSQLException:预期没有结果时返回了结果
【发布时间】: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


【解决方案1】:

选择无效

在您的 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
$$;

【讨论】:

    猜你喜欢
    • 2019-10-13
    • 1970-01-01
    • 2019-11-16
    • 2016-06-28
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    相关资源
    最近更新 更多