【问题标题】:Call PostgreSQL stored procedure with Java returns null用 Java 调用 PostgreSQL 存储过程返回 null
【发布时间】:2015-04-08 12:01:27
【问题描述】:

我有以下用 PostgreSQL 9.3 编写的存储过程,运行良好:

CREATE OR REPLACE FUNCTION getColor(i INT) 
 RETURNS VARCHAR AS $varColor$
    DECLARE varColor varchar;   
    BEGIN
      select color into varColor FROM colors where id = i;
      return varColor;
    END;
    $varColor$ LANGUAGE plpgsql;

事实上,当我在 pgAdmin 中执行 select getColor(2) 时,我得到了预期值。 我试图从Java(简化版)这样称呼它:

String call =  "{ call getColor(?,?) }";
CallableStatement cstmt = connection.prepareCall(call);
cstmt.setInt(1, 2);
cstmt.registerOutParameter(2, java.sql.Types.VARCHAR);
boolean hadResults = cstmt.execute();

问题是hadResults 始终为空。 有什么想法吗?

【问题讨论】:

  • CallableStatement 用于“真正的”存储过程。使用PreparedStatement 和executeQuery() 运行select getColor(2) 可以更好地调用postgres 函数
  • 在 postgresql 中,使用 create 函数语句 sqlines.com/postgresql/stored_procedures_functions 创建存储过程
  • @user1820620:这是“存储过程”,而不是“存储过程”。而CREATE FUNCTION创建了一个函数,几乎但不完全相同。
  • 谢谢,那么如何在postgresql中创建一个“真正的”存储过程呢?在链接sqlines.com/postgresql/stored_procedures_functions 中没有区别
  • 该链接完全错误。 Postgres 没有“存储过程”,因此您无法创建“真正的”存储过程。声称一个函数不能返回多个结果集也是错误的。这是可能使用参考游标。您必须使用引用游标返回结果的说法也是完全错误的。你应该坚持官方手册。

标签: java postgresql stored-procedures


【解决方案1】:

Postgresql 存储过程的概念与 Oracle 等其他供应商不同。 基本上Oracle中所谓的存储过程在Postgresql中可以是一个函数,在Java中调用一个函数最好使用prepare语句和executeQuery方法,如下例所示

String call =  "select getColor(?)";
PreparedStatement pstmt = connection.prepareStatement(call);
pstmt.setInt(1,1);
Resultset resultset = pstmt.executeQuery();

感谢所有在问题 cmets 中提供帮助的人!

【讨论】:

  • 我会推荐"String call = "select getColor(?)"; 和connection.prepareStatement()
猜你喜欢
  • 2012-02-08
  • 2014-08-04
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 1970-01-01
相关资源
最近更新 更多