我试图从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和游标的代码示例代码吗?
答案 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();