Получить параметр @SqlCall в виде списка <String>в формате jdbi - PullRequest
0 голосов
/ 14 ноября 2018

@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();

, где addressVarray равно CREATE 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:[]}]

1 Ответ

0 голосов
/ 14 ноября 2018

См. Этот пример взят из 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();  
}
...