java - 执行了 CallableStatement,但未返回任何内容

标签 java postgresql stored-procedures

我在调用不返回任何内容的函数时出现 Java 异常:

org.postgresql.util.PSQLException: A CallableStatement was executed with nothing returned.

Java代码类似这样:

// Procedure call.
CallableStatement proc = con.prepareCall("{ ? = call doquery ( ? ) }");
proc.registerOutParameter(1, Types.Other);
proc.setInt(2, 33434);
proc.execute();
ResultSet results = (ResultSet) proc.getObject(1);
while (results.next()) {
  // do something with the results...
}
results.close();
proc.close();

查询很简单:

select * from table where idTable = 33434;

查询没有返回任何值,因为我在 postgresql 数据库中查找的内容不存在。一个 sql 查询就是这样,我们并不总是能得到返回。

你如何处理这种情况?

PS.- Postgresql 函数:

CREATE OR REPLACE FUNCTION doquery(_idTable bigint)
  RETURNS TABLE(idTable bigint, name varchar) AS
$BODY$
DECLARE
    searchsql text := '';
BEGIN
    searchsql := 'SELECT * FROM table
            WHERE idTable = ' || _idTable;

    RETURN QUERY EXECUTE searchsql;
END
$BODY$
  LANGUAGE plpgsql;

最佳答案

不要使用 CallableStatement。它们适用于存储的过程,而不是函数。

当您的函数返回结果集时,您需要使用 select 语句:

PreparedStatement pstmt = con.prepareStatement("select * from doquery(?)");
pstmt.setInt(1, 33434);

ResultSet results = pstmt.executeQuery();
while (results.next()) {
  // do something with the results...
}
results.close();
proc.close();

请注意,不需要使用动态 SQL 甚至 PL/pgSQL。您也不应该将参数附加到查询(就像您不应该在 Java 中那样做一样)。使用参数占位符:

CREATE OR REPLACE FUNCTION doquery(_idTable bigint)
  RETURNS TABLE(idTable bigint, name varchar) AS
$BODY$
BEGIN
    RETURN QUERY 
       SELECT * 
       FROM table
       WHERE idTable = _idTable;
END
$BODY$
  LANGUAGE plpgsql;

或者更简单的纯 SQL 函数:

CREATE OR REPLACE FUNCTION doquery(_idTable bigint)
  RETURNS TABLE(idTable bigint, name varchar) AS
$BODY$
   SELECT idtable, name 
   FROM table
   WHERE idTable = _idTable;
$BODY$
  LANGUAGE sql;

如果您确实需要动态 SQL,则在字符串中使用占位符并将参数传递给执行函数。不要连接值:

CREATE OR REPLACE FUNCTION doquery(_idTable bigint)
  RETURNS TABLE(idTable bigint, name varchar) AS
$BODY$
BEGIN
    RETURN QUERY EXECUTE '
       SELECT * 
       FROM table
       WHERE idTable = $1'
    USING _idTable;
END
$BODY$
  LANGUAGE plpgsql;

关于java - 执行了 CallableStatement,但未返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37632664/

相关文章:

sql - PostgreSQL 在 alter table 上添加 EXCLUDE 约束

sql - Teradata BTEQ : IF conditon , 使用运行时实际参数验证 SP 编译并导出 DDL

sql - SQL Server 中的 For 循环和 if else 语句

java - 我如何将两个字符串数组放入 ListView 中具有多个对象类型的数组列表中

postgresql - Postgres - 将行移动到不同的表

sql - 如何避免在此 FOR EACH STATEMENT 触发器中无限递归?

.net - SQL Server 存储过程引发多个错误

java - List<?> 与 List<Object> 不同时的示例

java - 反射 api 对函数的返回类型进行重载

java - FF a b FF 的正则表达式是什么?