如何在没有SELECT的情况下调用postgres中的函数?

时间:2015-01-09 14:25:56

标签: java postgresql jdbc

我为postgresql创建了以下函数:

CREATE FUNCTION myfunc(param INT) RETURNS VOID AS..

如何在没有SELECT的情况下调用该函数? 当我运行SELECT myfunc(1)时它会起作用,即使它没有按设计返回任何内容。

但是我想在没有选择的情况下运行它,只有myfunc(1),这不起作用并告诉我Syntax error at 1

我正在尝试从Insert, on duplicate update in PostgreSQL?实现db_merge函数。

我无法从java运行SELECT db_merge(..),因为这会给我"A result was returned when none was expected."), PSQLState.TOO_MANY_RESULTS)错误。

2 个答案:

答案 0 :(得分:2)

你不能那样做(如果没有在PostgreSQL中发出SELECT语句就不能调用存储的函数)。另外,PostgreSQL does not support CALL语句。

有关PostgreSQL中calling functions的更多信息。

注意:在PL / pgSQL上下文中,如果被调用的函数有SELECT,则必须使用PERFORM(而不是RETURNS void)。

修改

如果是JDBC,请不要使用executeUpdate(),只需像使用任何其他SELECT语句一样使用execute()

对于Spring的JdbcTemplate:execute(String)是为DDL语句设计的;使用其中一个&简单地丢弃结果:

  • query(String, ResultSetExtractor)
  • query(String, RowCallbackHandler)
  • query(String, RowMapper)

答案 1 :(得分:0)

Postgres消息传递协议允许direct function invocation,而Postgres JDBC驱动程序通过Fastpath class公开此消息。 driver documentation解释了如何设置它。