2017-12-21 19 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와 오류를 얻고 있었다

을 내가 잘못된 인수에 대해 연구하여 그것을 해결하기 위해 관리 result 동시성을 설정합니다. 그러나 이제는 또 다른 문제가 있습니다. 이것은 오류 메시지입니다 :

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()'는 (허용되지 않음) (https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#last())입니다. 결과 세트의 유형. 반복은 ** ** 한 번 앞으로 진행할 수 있으며 (예 : 마지막 레코드까지) 이동할 수 없습니다. –

+1

나는이 문제가 마지막 행으로 이동하는'rs.beforeFirst()'_after_라고 생각한다. 'FORWARD_ONLY' 결과 세트에서 뒤로 스크롤 할 수 없습니다. –

+0

해결 방법이 있습니까? 나는 rs.last()를 디버깅하는 동안 10 분 전에 그것을 알아 차렸다. 문제 였고, 내가 그것을 구분하지 않으려 고 할 때 y는 foward_only를 다시 사용하라고 말했습니다. 어떻게 결과를 추가 할 수 있습니까? 나는 목록을 첨부하는 것을 생각하고 있었지만 그것은 거의 구멍 방법을 바꾸는 것을 의미합니다. –

답변

0

전진 전용 커서를 사용하면 끝까지 건너 뛸 수 없으므로 레코드 수를 얻은 다음 결과 집합을 반복하여 뒤로 이동합니다.

결과 집합을 넣으려는 배열의 크기를 조정할 때만이 정보를 사용하는 것 같습니다. 이를 수행하는 더 좋은 방법이 있습니다. Storing Result set into an array.

그 외에도, 실제로 이와 같은 SAP 데이터에 액세스 할 수있는 라이센스가 있는지 여부를 라이센스 팀에 문의 할 수 있습니다. 데이터 모델의 기본 테이블에 대한 직접 데이터베이스 액세스에는 응용 프로그램 수준의 전체 보안 모델을 우회하여 많은 제한이 있습니다.