出现错误:游标“ <未命名的门户1>”不存在

时间:2019-08-30 01:22:40

标签: java postgresql simplejdbccall

我试图从spring.jdbc调用函数中使用SimpleJdbcCall,该函数返回一个游标,并且出现以下错误:

org.springframework.jdbc.UncategorizedSQLException: CallableStatementCallback; uncategorized SQLException for SQL [{? = call dbo.api_config_select(?)}]; SQL state [34000]; error code [0]; ERROR: cursor "<unnamed portal 1>" does not exist; nested exception is org.postgresql.util.PSQLException: ERROR: cursor "<unnamed portal 1>" does not exist

这是PostGreSQL函数代码:

CREATE OR REPLACE FUNCTION "dbo"."api_config_select" (in "_id" integer) RETURNS refcursor AS
$$
    DECLARE
      ref refcursor;                                                     
    BEGIN
      OPEN ref FOR 

        SELECT
            1;

      RETURN ref;                                                       
    END;
    $$
LANGUAGE 'plpgsql' COST 100

这是Java代码

        simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate).withFunctionName("api_config_select").withSchemaName("dbo")
              .declareParameters(

              new SqlOutParameter("_cursor",  Types.OTHER),
              new SqlParameter("_id", Types.INTEGER));

        HashMap<String, Object> params = new HashMap<String, Object>();
        params.put("_id", id);

        try {
            Map<String, Object> result = simpleJdbcCall.execute(10);
            for (String s : result.keySet()) {
                System.out.println("6.0  " + result.get(s));
            }
        }

        catch(UncategorizedSQLException e) {
            e.printStackTrace();
        }
        catch(Exception e) {
                e.printStackTrace();
        }

一旦应用程序调用simpleJdbcCall.execute(),我就会收到错误消息。我试图传递refcursor名称,但收到相同的错误。

有人有使用PostgreSql,Spring JDBC和游标的代码示例代码吗?

2 个答案:

答案 0 :(得分:1)

确保必须使用 connection.setAutoCommit(false); 在连接后检查如下: if(connection!= null){ connection.setAutoCommit(false);

原因是,如果您不使用setAutoCommit(false),则游标将关闭,并且在检索数据时将失败。

答案 1 :(得分:0)

在您的方法中使用此代码块:

Connection conn = jdbcTemplate.getDataSource().getConnection();
conn.setAutoCommit(false);
CallableStatement proc = conn.prepareCall("{? = call dbo.api_config_select() }");
proc.registerOutParameter(1, Types.OTHER);
proc.execute();
ResultSet results = (ResultSet) proc.getObject(1);
while (results.next())
{
    // do something with the results.
}
results.close();
proc.close();