使用vertx

时间:2017-03-23 19:16:35

标签: java oracle vert.x ojdbc

我正在尝试使用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

2 个答案:

答案 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