在JDBCTemplate更新执行时,“在没有预期时返回结果”异常

时间:2015-06-02 23:10:27

标签: java spring postgresql

我试图通过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将其视为表。

如何避免此异常?

4 个答案:

答案 0 :(得分:1)

实际使用存储过程时,您正在使用select语句;你必须使用Call。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您可以通过将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();