代码之家  ›  专栏  ›  技术社区  ›  Zmur

PSQLException:返回了一个结果,但不应返回任何结果

  •  0
  • Zmur  · 技术社区  · 6 年前

    当我尝试运行包含函数的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()

    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');
    

    可能的原因是什么?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Emilio Platzer    6 年前

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