【问题标题】:Retrieve out parameter of @SqlCall as List<String> in jdbi在 jdbi 中以 List<String> 形式检索 @SqlCall 的参数
【发布时间】:2018-11-14 07:48:06
【问题描述】:

@SqlQuery 如果需要,将选择答案解析到列表中。示例:

@SqlQuery("Select a.id from indexes a")
List<String> selectIds();

如何将@SqlCall 的参数解析为列表?我不明白我应该使用java.sql.Types 的什么类型。例如这里:

@SqlCall("begin " +
         "SELECT a.id " +
         "BULK COLLECT " +
         "INTO :output " +
         "from indexes a; "
         "end;") 
@OutParameter(name = "output", sqlType = #Don't know what to put here#)
OutParameters selectIds();

UPD。 试过这个:

@SqlCall("begin " +
        "SELECT DISTINCT scu.LOGIN " +
        "BULK COLLECT " +
        "INTO :output " +
        "from sc_users scu; " +
        "end;")
@OutParameter(name = "output", sqlType = Types.ARRAY)
OutParameters selectIds();

得到:

org.jdbi.v3.core.statement.UnableToCreateStatementException: Exception while binding 'output' [statement:"begin SELECT DISTINCT scu.LOGIN BULK COLLECT INTO :output from sc_users scu; end;", rewritten:"begin SELECT DISTINCT scu.LOGIN BULK COLLECT INTO ? from sc_users scu; end;", arguments:{ positional:{}, named:{output:org.jdbi.v3.core.statement.Call$OutParamArgument@45198fd9}, finder:[]}]

UPD2.也试过这个:

@SqlCall("declare " +
        "ar addressVarray; " +
        "begin " +
        "ar := addressVarray('asd'); " +
        ":output := ar; " +
        "end;")
@OutParameter(name = "output", sqlType = Types.ARRAY)
OutParameters getArray();

其中addressVarrayCREATE Or Replace TYPE addressVarray AS VARRAY(2) OF VARCHAR2(50);

又来了:

org.jdbi.v3.core.statement.UnableToCreateStatementException: Exception while binding 'output' [statement:"declare ar addressVarray; begin ar := addressVarray('asd'); :output := ar; end;", rewritten:"declare ar addressVarray; begin ar := addressVarray('asd'); ? := ar; end;", arguments:{ positional:{}, named:{output:org.jdbi.v3.core.statement.Call$OutParamArgument@46c22d8e}, finder:[]}]

【问题讨论】:

标签: java oracle jdbc jdbi


【解决方案1】:

这个例子取自https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.db2.luw.apdv.java.doc/src/tpc/imjcc_c0052030.html

Connection con;
CallableStatement cstmt;
ResultSet rs;
java.sql.Array inPhoneData;
…
cstmt = con.prepareCall("CALL GET_EMP_DATA(?,?)");
                                            // Create a CallableStatement object
String[] charArray = new String[] {"a", "b", "c"};        
inPhoneData = conn.createArrayOf("CHAR", charArray);   
cstmt.setArray(1, inPhoneData);             // Set input parameter
cstmt.registerOutParameter (2, java.sql.Types.ARRAY);         
                                            // Register out parameters
cstmt.executeUpdate();                      // Call the stored procedure
Array outPhoneData = cstmt.getArray(2);                                   
                                            // Get the output parameter array
System.out.println("Parameter values from GET_EMP_DATA call: ");
String [] outPhoneNums = (String [])outPhoneData.getArray();
                                            // Retrieve output data from the
                                            // JDBC Array object into a Java
                                            // String array
for(int i=0; i<outPhoneNums.length; i++) {
  System.out.print(outPhoneNums[i]); 
  System.out.println();  
}

【讨论】:

  • 我试过了,得到了org.jdbi.v3.core.statement.UnableToCreateStatementException: Exception while binding 'output' [statement:"begin SELECT DISTINCT scu.LOGIN BULK COLLECT INTO :output from sc_users scu; end;", rewritten:"begin SELECT DISTINCT scu.LOGIN BULK COLLECT INTO ? from sc_users scu; end;", arguments:{ positional:{}, named:{output:org.jdbi.v3.core.statement.Call$OutParamArgument@1f4863e0}, finder:[]}]
  • 我的方法是:@SqlCall("begin SELECT DISTINCT scu.LOGIN BULK COLLECT INTO :output from sc_users scu; end;") @OutParameter(name = "output", sqlType = Types.ARRAY) OutParameters selectIds();
【解决方案2】:

我设法通过Jdbi Handle 解决了这个问题:

var query = "begin " +
         "SELECT a.id " +
         "BULK COLLECT " +
         "INTO :output " +
         "from indexes a; "
         "end;"

try( var call = handle.createCall( query )
   .registerOutParameter( "output", java.sql.Types.ARRAY, new CallableStatementMapper() // see note below
   {
      @Override
      public Object map( int position, CallableStatement stmt ) throws SQLException
      {
         return stmt.getArray( position );
      }
   } )
    // .bind( "anotherParam", "value" )
) {
   var out = call.invoke();

   return out.getObject( "output", Array.class );
}

注意:确保输出参数首先注册在createCall返回的Call接口上!否则你会得到上述异常。

【讨论】:

猜你喜欢
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-21
  • 1970-01-01
相关资源
最近更新 更多