2012-09-12 79 views
1

我試圖執行一個有記錄的表的IN-OUT參數的Oracle存儲過程:執行存儲過程

TYPE RECORD_TYP IS RECORD (
    CAT_CD     VARCHAR2(4), 
    MOD_ID  NUMBER(6) 
); 

,我發現這個例子談起List<String>List<Integer>http://viralpatel.net/blogs/java-passing-array-to-oracle-stored-procedure/

但是List<MyRecordDTO>呢?

編輯:我在這裏發現了一個答案,其中海報使用了oracle.sql.STRUCT類型。 http://betteratoracle.com/posts/32-passing-arrays-of-record-types-between-oracle-and-java

使用這個例子,我發現了例外java.sql.SQLException: Internal Error: Inconsistent catalog view。使用谷歌搜索這個例外,我打電話給DBA授權我訪問「​​」

+0

將返回的jdbc數組結構轉換爲'List '。 jdbc中沒有任何內容會爲你執行POJO轉換的任意值。 – jtahlborn

+0

實際上,列表是一個INOUT參數,我無法傳遞此參數。 –

回答

0

我知道這是一個非常古老的問題。但我希望這有助於。 這裏我傳遞一個自定義類型數組,並返回期望的自定義​​類型數組。

 myJavaRequest req = new myJavaRequest(); 
     req.setEmpId("940006614"); 
     myJavaReqArray[0] = req; 
     List<myJavaResp> myJavaRespLst = new ArrayList<myJavaResp>(); 

     try { 

      //fetch connection (this should be a OracleConnection class). 
      OracleConnection oraConn = (OracleConnection) getConnectionFromDB(); 

      //Set the mappings -- what is the SQL Object type to Java class mappings when it comes to response. 
      Map map = oraConn.getTypeMap(); 
      map.put("MYSCHEMA.SQLRESPDTO", Class.forName("com.myhome.myJavaResp")); 

      //Create the Array descriptor for the input array 
      ArrayDescriptor inputArrayDescr = ArrayDescriptor.createDescriptor("MYSCHEMA.MYREQDTOLIST", oraConn); 
      ARRAY inputArray = new ARRAY(inputArrayDescr, oraConn, spgPrefReqArray); //This is an Oracle ARRAY 

      //Prepare the Stored procedure call 
      OracleCallableStatement stmt = (OracleCallableStatement)oraConn.prepareCall("{ ? = call MYSCHEMA.PKG.SOME_SP(?) }"); 
      stmt.registerOutParameter(1, OracleTypes.ARRAY, "MYSCHEMA.SQLRESPDTOLIST"); 
      stmt.setArray(2, inputArray); 

      //Lets execute 
      stmt.execute(); 

      //Fetch the Array of Objects that will have the set of expecting response java objects. 
      ARRAY outArray = ((OracleCallableStatement)stmt).getARRAY(1); 
      Object[] objects = (Object[])outArray.getArray(map); 

      if(null != objects && objects.length > 0){ 
       for(int iIndex=0; iIndex<objects.length; iIndex++){ 
        myJavaRespLst.add((myJavaResp)objects[iIndex]); 
       } 
      } 
     }