【问题标题】:Call PostgreSQL stored procedure using SimpleJdbcCall and REF_CURSOR使用 SimpleJdbcCall 和 REF_CURSOR 调用 PostgreSQL 存储过程
【发布时间】:2017-09-15 19:58:18
【问题描述】:

我想使用 SimpleJDBCCall 调用带有 REF_CURSOR 的 PostgreSQL 存储过程。我的存储过程如下所示:

CREATE OR REPLACE FUNCTION public.procName()
RETURNS refcursor AS
$BODY$
  DECLARE
  ref1 refcursor := 'cursor';
BEGIN
   open ref1  for SELECT *   FROM public."tableName";
   RETURN ref1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION public.procName()
OWNER TO postgres;

我尝试使用以下 JAVA 代码调用该过程:

    JdbcTemplate jdbcTemplate = new JdbcTemplate(getDataSource());
    jdbcTemplate.setResultsMapCaseInsensitive(true);


    SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate);
    jdbcCall.withFunctionName("procName").returningResultSet("cursor",
            BeanPropertyRowMapper.newInstance(CustomEntity.class));

     Map m = jdbcCall.execute();

运行代码我收到一条错误消息:

org.postgresql.util.PSQLException: ERROR: cursor "cursor" does not exist
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2270)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1998)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:570)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:406)
at org.postgresql.jdbc2.AbstractJdbc2Connection.execSQLQuery(AbstractJdbc2Connection.java:339)
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.internalGetObject(AbstractJdbc2ResultSet.java:213)
at org.postgresql.jdbc3.AbstractJdbc3ResultSet.internalGetObject(AbstractJdbc3ResultSet.java:36)
at org.postgresql.jdbc4.AbstractJdbc4ResultSet.internalGetObject(AbstractJdbc4ResultSet.java:312)
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getObject(AbstractJdbc2ResultSet.java:2711)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:457)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:413)
at org.springframework.jdbc.core.JdbcTemplate$6.doInCallableStatement(JdbcTemplate.java:1068)
at org.springframework.jdbc.core.JdbcTemplate$6.doInCallableStatement(JdbcTemplate.java:1066)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1016)
at org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1066)
at org.springframework.jdbc.core.simple.AbstractJdbcCall.executeCallInternal(AbstractJdbcCall.java:397)
at org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbcCall.java:369)
at org.springframework.jdbc.core.simple.SimpleJdbcCall.execute(SimpleJdbcCall.java:173)

我使用 Oracele 存储过程以及 REF_CURSOR 测试了这段代码。我用withProcedureName() 方法代替了withFunctionName()。存储过程被正确调用,并返回结果。

有没有办法调用使用 SimpleJDBCCall 返回 REF_CURSOR 的 PostreSQL 存储过程?

【问题讨论】:

    标签: java spring postgresql stored-procedures jdbc


    【解决方案1】:
    SimpleJdbcCall call = new SimpleJdbcCall(jdbcTemplate).withProcedureName("genidproc");
    HashMap<String, Object> params = new HashMap<String, Object>();
    params.put("keystr", "uno");
    Map<String, Object> result = call.execute(params);
    for (String s : result.keySet()) {
         pw.println("6.0  " + result.get(s));
    }
    

    【讨论】:

    • 虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    猜你喜欢
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 2011-05-28
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多