我正在尝试使用vertx3读取返回ref_cursor的Oracle存储过程。如果我编辑它以返回clob并使用JDBCType.CLOB,同样的过程是有效的,但由于某种原因,我必须使用ref_cursor。有人可以帮助我吗?
JDBCClient client = JDBCClient.createShared(vertx, new JsonObject()
.put("url", "jdbc:oracle:thin:@localhost:8787:TEST")
.put("driver_class", "oracle.jdbc.OracleDriver")
.put("user", "user")
.put("password", "****"));
client.getConnection( connection -> {
if (connection.succeeded()) {
SQLConnection con = connection.result();
JsonObject params = new JsonObject()
.put("query", "{ call ? := package.procedure(?) }")
.put("paramsIn", new JsonArray().addNull().add(89))
.put("paramsOut", new JsonArray().add(JDBCType.REF_CURSOR));
con.callWithParams(params.getString("query"), params.getJsonArray("paramsIn"), params.getJsonArray("paramsOut"), query -> {
if(query.succeeded()){
ResultSet rs = query.result();
System.out.println(rs.toJson().toString())
}else{
System.out.println(req.body() + query.cause().toString());
}
});
} else {
System.out.println(connection.cause().toString())
}
});
我收到错误:
{打电话? := package.procedure(?)} java.sql.SQLException:输入de colonne non valide:2012
答案 0 :(得分:0)
从Vert.x 3.4.1开始,不支持游标。作为一种变通方法,您可以创建自己的javax.sql.DataSource
并将其与Vertx.executeBlocking
一起使用来调用JDBC java.sql.CallableStatement
。
对于其他查询,您仍然可以使用creating a JDBCClient instance from your javax.sql.DataSource
之前的Vert.x API。这样可以避免维护两个不同的连接池。
答案 1 :(得分:0)
您是否尝试过使用oracle.jdbc.OracleTypes.CURSOR
中的com.oracle:ojdbc8:12.2.0.1
而不是JDBCType.REF_CURSOR
?