【问题标题】:"A result was returned when none was expected" exception on JDBCTemplate update executionJDBCTemplate 更新执行时出现“预期结果未返回结果”异常
【发布时间】:2015-06-02 23:10:27
【问题描述】:

我正在尝试通过 postgresql update() 方法执行函数,但它给我抛出了一个异常 - “预期没有结果时返回了结果”。

PostgreSQL 函数:

CREATE OR REPLACE FUNCTION create_order(note VARCHAR, created_by BIGINT, service_request BIGINT) 
RETURNS TABLE (service_order integer, note varchar)
BEGIN
  INSERT INTO service_order 
  (note, service_request_fk, created_by, so_status_type_fk, price_total, created)
  VALUES (note, service_request, created_by, 1, 0, now());
END;
$$ LANGUAGE plpgsql;

我正在尝试执行的 SQL:

String sql = "SELECT create_order(?,?,?)";

更新函数:

int id = jdbc.update(sql, new Object[] {order.getNote(), emp.getEmployeeId(), order.getServiceRequestId()});

该函数必须返回没有任何意义的 VOID,但在我看来,它返回没有行的表,JDBCTemplate 将其视为表。

如何避免这个异常?

【问题讨论】:

标签: java spring postgresql


【解决方案1】:

从 PostgreSQL 9 开始,没有CALL 命令,因此您必须改用SELECT。使用SELECT func_name(); 调用存储过程或函数将返回RECORD。要返回列或TABLE,您必须将语法更改为SELECT * FROM func_name();

【讨论】:

    【解决方案2】:

    当您实际使用存储过程时,您使用的是 select 语句;您必须使用呼叫。

    https://jdbc.postgresql.org/documentation/head/callproc.html

    【讨论】:

      【解决方案3】:

      9.6 中没有 CALL,所以它不起作用。 https://www.postgresql.org/docs/9.6/static/sql-commands.html

      【讨论】:

        【解决方案4】:

        您可以通过使用 DOPERFORM 来解决此问题:

        final var sql = "DO $$" +
          " BEGIN" +
          "   PERFORM create_order(:note,:employeeId,:requestId);" +
          " END;" +
          "$$";
        
        entityManager.createNativeQuery(sql)
          .setParameter("note", order.getNote())
          .setParameter("employeeId", emp.getEmployeeId())
          .setParameter("requestId", order.getServiceRequestId())
          .executeUpdate();
        

        【讨论】:

          猜你喜欢
          • 2019-11-16
          • 2020-08-07
          • 2011-08-09
          • 2010-09-22
          • 2021-05-17
          • 2018-02-19
          • 2018-03-23
          • 2020-03-15
          • 1970-01-01
          相关资源
          最近更新 更多