2017-12-21 12 views
0

私がオラクルに挿入するためにHANAでDBから読み取るしようとしているクラスでは、この方法があります:結果セットタイプFORWARD_ONLYに対して、操作を解決する方法は許可されていませんか?

private void selectZ_ITEM_MASTER() { 
    //System.out.println("entre al select"); 
    try { 
     Statement stmt; 
     ResultSet rs = null; 
     BasicDataSource ds = new BasicDataSource(); 
     ds.setDriverClassName(getHec_driver()); 
     ds.setUrl(getHec_url()); 
     ds.setUsername(getHec_usuario()); 
     ds.setPassword(getHec_clave()); 
     ds.setMaxActive(-1); 

     Connection con = ds.getConnection(); 
     stmt = con.createStatement(

      ResultSet.TYPE_FORWARD_ONLY, 
      ResultSet.CONCUR_READ_ONLY); 

      String query = "SELECT "; 
        query += "MARA.MANDT, "; 
        query += "MARC.WERKS, "; 
        query += "MARA.MATNR, "; 
        query += "MAKT.MAKTX, "; 
        query += "MAKT.MAKTG, "; 
        query += "MARA.MATKL, "; 
        query += "T023T.WGBEZ, "; 
        query += "T023T.WGBEZ60, "; 
        query += "MARA.BRGEW, "; 
        query += "MARA.NTGEW, "; 
        query += "MARA.GEWEI, "; 
        query += "MARA.MEINS, "; 
        query += "MARA.SPART, "; 
        query += "TSPAT.VTEXT "; 
        query += "FROM "; 
        query += "SAPR3P.MARA MARA LEFT OUTER JOIN SAPR3P.MAKT MAKT ON MARA.MANDT = MAKT.MANDT AND "; 
        query += "                MARA.MATNR = MAKT.MATNR "; 
        query += "      LEFT OUTER JOIN SAPR3P.T023T T023T ON MARA.MANDT = T023T.MANDT AND "; 
        query += "                MARA.MATKL = T023T.MATKL AND "; 
        query += "                T023T.SPRAS = 'S' "; 
        query += "      LEFT OUTER JOIN SAPR3P.TSPAT TSPAT ON MARA.MANDT = TSPAT.MANDT AND "; 
        query += "                MARA.SPART = TSPAT.SPART AND "; 
        query += "                TSPAT.SPRAS = 'S' "; 
        query += "      LEFT OUTER JOIN SAPR3P.MARC MARC ON MARA.MANDT = MARC.MANDT AND "; 
        query += "                MARA.MATNR = MARC.MATNR ";      
        query += "WHERE "; 
        query += "MARA.MANDT = '100' "; 
        //query += "AND MARC.WERKS IN ('3000') "; 
        //query += "AND MARA.MATNR IN ('000000004030005209','000000004030005215')"; 
        query += "AND MARC.WERKS IN ('1000','2000') "; 
        query += "AND MARA.MATNR BETWEEN '000000001000000152' AND '000000001000000152' "; 
        query += "ORDER BY "; 
        query += "MARA.MANDT, MARC.WERKS, "; 
        query += "MARA.MATNR "; 

        //System.out.println(query); 

     try{ 
     rs = stmt.executeQuery(query); 
     rows = 1; 
     rs.last(); 
     rows = rs.getRow(); 
     System.out.println("Cantidad de Registros:" + rows); 

     ResultSetMetaData rsmd = rs.getMetaData(); 
     columns = rsmd.getColumnCount(); 
     System.out.println("Cantidad de Columnas:" +columns); 
     arr = new String[rows][columns]; 

     int i = 0; 
     rs.beforeFirst(); 
     while (rs.next()){ 
      for (int j = 0; j < columns; j++) 
      arr [i][j] = rs.getString(j+1); 
      i++; 


      } 
       } catch (SQLException e) { 
       e.printStackTrace(); 
       insertLog("Z_ITEM_MASTER VEN: " + e.getMessage(),"error", "Z_ITEM_MASTER VEN"); 
      } 
     stmt.close(); 
     con.close(); 
     rs.close(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
     msj = e.getMessage(); 
     insertLog("Z_ITEM_MASTER VEN: " + e.getMessage(),"error", "Z_ITEM_MASTER VEN"); 
    } 
} 

私が使用CONCUR_READ_ONLY、CONCUR_UPDATABLEでエラーになったと私は無効な引数について調査することによってそれを解決するために管理を結果並行処理を設定しましたが、別の問題が発生しました。これはエラーメッセージです

com.sap.db.jdbc.exceptions.JDBCDriverException: SAP DBTech JDBC: The operation is not allowed for result set type FORWARD_ONLY. 
at com.sap.db.jdbc.exceptions.SQLExceptionSapDB.createException(SQLExceptionSapDB.java:345) 
at com.sap.db.jdbc.exceptions.SQLExceptionSapDB.generateSQLException(SQLExceptionSapDB.java:113) 
at com.sap.db.jdbc.ResultSetSapDB.assertNotForwardOnly(ResultSetSapDB.java:2760) 
at com.sap.db.jdbc.ResultSetSapDB.last(ResultSetSapDB.java:592) 
at com.sap.db.jdbc.trace.ResultSet.last(ResultSet.java:972) 
at org.apache.commons.dbcp.DelegatingResultSet.last(DelegatingResultSet.java:367) 
at org.apache.commons.dbcp.DelegatingResultSet.last(DelegatingResultSet.java:367) 
at org.inverpaca.integracion.Integracion.selectZ_ITEM_MASTER(Integracion.java:145) 
at org.inverpaca.integracion.Integracion.insertDatos(Integracion.java:207) 
at org.inverpaca.integracion.Integracion.main(Integracion.java:287) 

誰かが私を助けることができますか?

いくつかのフォーラムでは、正しい結果セットまたはそのようなステートメント設定に関係するこの問題を参照しています。

+0

'rs.last()'のように見えるのは[not allowed]です(https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#last())。 ResultSetの型。反復は** **一回だけ進むことができ、(最後のレコードのように)ジャンプしません。 –

+1

私は問題が最後の行に移動する 'rs.beforeFirst()' _after_であると信じています。 'FORWARD_ONLY'結果セットの中で後方にスクロールすることはできません。 –

+0

これを回避する方法はありますか?私は10分前にrs.last()をデバッグしている間に気づいた。問題がありました。私はそれを区別しないようにしようとしましたが、私は再びfoward_onlyを使うように言いました...どうすれば結果を追加できますか?私はリストを添付することを考えていたが、それはほとんどホールメソッドを変更することを意味する。 –

答えて

0

前方のみのカーソルでは、最後にジャンプしてレコード数を取得し、その後に戻り、結果セットを反復して反復することはできません。

この情報は、結果セットを配置するアレイのサイズを決める場合にのみ使用されるようです。これを行うためのより良い方法があります。 Storing Result set into an array

これ以外にも、実際にこのようなSAPデータへのアクセスがライセンスされているかどうかは、ライセンスチームに問い合わせることをおすすめします。データモデルのベーステーブルへの直接データベースアクセスには、アプリケーションレベルのセキュリティモデル全体をバイパスするための多くの制限があります。

関連する問題