如何在不使用SELECT的情况下在Postgres中调用函数?

6

我为我的postgresql创建了以下函数:

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

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

但是我想要不使用select来运行它,只需myfunc(1),这样做不起作用,并告诉我Syntax error at 1

我正在尝试实现PostgreSQL中插入重复项更新的db_merge函数?

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


2
“我无法从Java运行SELECT db_merge(..)” - 这不是真的。 Statement.execute(“select db_merge()”)将完美地工作。您只需不能使用executeUpdate(),因为它不允许返回任何内容。 - user330315
@a_horse_with_no_name 我正在使用 executeBatch() 语句在其中运行它,该语句由 JdbcTemplate.batchUpdate() 调用。所以我可能不能使用它? - membersound
1
JdbcTemplate.execute(String) 是为 DDL 语句设计的。http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jdbc/core/JdbcTemplate.html#execute-java.lang.String- -- 使用其他的 execute(String, ResultSetExtractor|RowCallbackHandler|RowMapper) 中的一个,并简单地丢弃结果。 - pozs
你没有提到你正在使用Spring。我的评论涉及到纯JDBC。 - user330315
在JDBC中,您可以使用“{call myfunc()}”转义,但它实际上只是在后台执行了一个“SELECT”。我不明白这有什么问题。 - Craig Ringer
2个回答

2
在PostgreSQL中,如果没有发出SELECT语句,则不能调用存储函数。此外,PostgreSQL不支持 CALL语句。
在PostgreSQL中调用函数的更多信息。
注意:在PL/pgSQL上下文中,如果被调用的函数返回RETURNS void,则必须使用PERFORM(而不是SELECT)。 编辑: 对于JDBC,请勿使用executeUpdate(),只需像处理任何其他SELECT语句一样使用execute()即可。
对于Spring的JdbcTemplate:execute(String)旨在处理DDL语句;使用其他方法并简单地丢弃结果即可:
  • query(String, ResultSetExtractor)
  • query(String, RowCallbackHandler)
  • query(String, RowMapper)

我的PL是从https://dev59.com/uHNA5IYBdhLWcg3wC5Xh#1109198,只有`UPDATE`和`INSERT`。如果函数应该返回void,我怎么在postgresql中执行函数而不使用select?我的机会是什么? - membersound
@membersound 这并不重要,无论是什么 SELECT 语句总会返回数据(在 RETURNS void 函数的情况下,它会返回单个 NULL)。 - pozs
3
在使用JDBC时,不要使用executeUpdate(),而是像处理其他SELECT语句一样使用execute() - pozs

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接