2017-01-12 1 views
0

엑셀 시트에서 데이터베이스로 데이터를 업로드해야합니다."java.sql.SQLException : setObject, Exception = 입력 문자열 :"Pr ""

이 기능을 구현하기 위해 Apache POI 개념을 사용했습니다.

try { 
     Workbook wb = new HSSFWorkbook(is); 
     Sheet sheet = wb.getSheetAt(0); // first sheet 
     List excelData = new ArrayList(); 
     System.out.println("sheet.getFirstRowNum() "+sheet.getFirstRowNum()+" sheet.getLastRowNum() "+sheet.getLastRowNum()); 
     int rowStart = Math.min(1, sheet.getFirstRowNum()); 
     int rowEnd = Math.max(10, sheet.getLastRowNum()); 
     for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) { 
      Row r = sheet.getRow(rowNum); 
      if (r != null) { 
       int lastColumn = Math.max(r.getLastCellNum(), 22); 
       List cellData = new ArrayList(); 
       for (int cn = 0; cn < lastColumn; cn++) { 
        Cell c = r.getCell(cn, Row.RETURN_BLANK_AS_NULL); 

        if (c == null) { 
         cellData.add(c); 
        } else { 
         cellData.add(c); 
        } 
       } 
       excelData.add(cellData); 
      } 
     } 


     for (int rowNum = 1; rowNum < excelData.size(); rowNum++) { 
      /*provide hssfEmployeeClass variables as null*/ 
      List list = (List) excelData.get(rowNum); 
      HSSFCell[] EmployeeListCell = new HSSFCell[list.size()]; 
      for (int i = 0; i < list.size(); i++) { 
       try { 
        EmployeeListCell[i] = (HSSFCell) list.get(i); 
        //EmployeeListCell.set(i, ((HSSFCell) list.get(i)).toString()); 
       } catch (NullPointerException e) { 
        EmployeeListCell[i] = (HSSFCell) null; 
       } catch (IndexOutOfBoundsException e) { 
        EmployeeListCell[i] = (HSSFCell) null; 
       } 
      } 


      ArrayList EmployeeData = new ArrayList(list.size()); 
      long temp; 
      java.sql.Date[] temp_date = new java.sql.Date[10]; 
      for (int i = 0; i < (EmployeeListCell.length-1); i++) { 
       if(EmployeeListCell[i]==null) 
       {} 
       else if (EmployeeListCell[i].getCellType() == Cell.CELL_TYPE_FORMULA) { 
        switch (EmployeeListCell[i].getCachedFormulaResultType()) { 
        case Cell.CELL_TYPE_NUMERIC: 

         if (HSSFDateUtil.isCellDateFormatted(EmployeeListCell[i])) { 
          EmployeeData.add(i,new java.sql.Date(EmployeeListCell[i].getDateCellValue().getTime())); 
         } else { 
          temp = (int) EmployeeListCell[i].getNumericCellValue(); 
          //EmployeeData[i] = (Long.toString(temp)); 
          EmployeeData.add(i,(Long.toString(temp))); 
         } 
         break; 
        case Cell.CELL_TYPE_STRING: 
          EmployeeData.add(i,EmployeeListCell[i].getStringCellValue()); 
         break; 
        } 
       } else if (EmployeeListCell[i] != null) { 
        if (EmployeeListCell[i].getCellType() == HSSFCell.CELL_TYPE_NUMERIC) { 
         if (HSSFDateUtil.isCellDateFormatted(EmployeeListCell[i])) { 
          // EmployeeData[i] = (java.sql.Date) EmployeeListCell[i].getDateCellValue(); 
          EmployeeData.add(i,new java.sql.Date(EmployeeListCell[i].getDateCellValue().getTime())); 
         } 
         else 
         {  
         temp = (int) EmployeeListCell[i].getNumericCellValue(); 
         EmployeeData.add(i,(Long.toString(temp))); 
         } 

        } 
        if (EmployeeListCell[i].getCellType() == HSSFCell.CELL_TYPE_STRING) { 
         System.out.println("Ith position "+i); 
         EmployeeData.add(i,EmployeeListCell[i].getStringCellValue()); 
        } 
       } 
      } 

      for(int i=0;i<EmployeeData.size();i++) 
      { 
      System.out.println("Employee data values"+ i + EmployeeData.get(i)); 
      } 
      app=getApp(); 
      System.out.println("Return val is " + app.insertData(rowNum, EmployeeData)); 

     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

엑셀 시트의 데이터를 직원 데이터 배열 목록에로드합니다.

호출 가능한 명령문을 통해 데이터를 전달하기 위해 sqlData를 구현하는 EmployeeObj가 작성되는 Java 클래스가 하나 있습니다.

public class EmployeeObj implements SQLData,Serializable { 
public long EMP_ID;    
public String FIRST_NM;  
public String MIDDLE_NM; 
public String DOJ;   
public String GENDER; 
public String STATUS; 
public String REPORTING_MGR;  
public String LAST_NM; 
public String EMAIL_ID; 
public String STREAM_ID; 
public String DESIGN_ID; 
public String EMP_LOCATION; 
public String GEO_CODE; 
public String EMP_NO; 
public String LEVEL_2_MGR; 
public String TENTATIVE_LAST_DAY; 
private String sql_type="EMP_DATA_OBJ"; 
static int count=0; 
public EmployeeObj() { 
    super(); 
} 
public EmployeeObj(String sql_type,Object[] empObj) 
{ 
    this.sql_type = sql_type; 
    count=count+1; 
    System.out.println("empObj[1].toString(); "+ empObj[1].toString()); 
    this.EMP_NO=empObj[1].toString(); 
    this.EMP_ID=Long.parseLong(empObj[2].toString());    
    this.FIRST_NM=empObj[3].toString();  
    this.LAST_NM=empObj[4].toString(); 
    this.DOJ=empObj[5].toString();   
    this.GENDER=empObj[6].toString(); 
    this.STATUS=empObj[7].toString(); 
    this.REPORTING_MGR=empObj[9].toString();  
    this.LEVEL_2_MGR=empObj[11].toString(); 
    this.EMAIL_ID=empObj[12].toString(); 
    this.STREAM_ID=empObj[13].toString(); 
    this.DESIGN_ID=empObj[14].toString(); 
    this.EMP_LOCATION=empObj[15].toString(); 
    this.GEO_CODE=empObj[16].toString(); 
    try 
    { 
    this.TENTATIVE_LAST_DAY=empObj[17].toString(); 
    } 
    catch(NumberFormatException n) 
    { 
    System.out.println("Not a number in employee obj"); 
    } 
} 

@Override 
public String getSQLTypeName() throws SQLException { 
    // TODO Implement this method 
    return sql_type; 
} 

@Override 
public void readSQL(SQLInput stream, String typeName) throws SQLException { 
    // TODO Implement this method 
    sql_type=typeName; 
    this.EMP_ID=stream.readLong();    
    this.FIRST_NM=stream.readString();  
    //this.MIDDLE_NM=stream.readString(); 
    this.DOJ=stream.readString(); 
    this.GENDER=stream.readString(); 
    this.STATUS=stream.readString(); 
    this.REPORTING_MGR=stream.readString();  
    this.LAST_NM=stream.readString(); 
    this.EMAIL_ID=stream.readString(); 
    this.STREAM_ID=stream.readString(); 
    this.DESIGN_ID=stream.readString(); 
    this.EMP_LOCATION=stream.readString(); 
    this.GEO_CODE=stream.readString(); 
    this.EMP_NO=stream.readString(); 
    this.LEVEL_2_MGR=stream.readString();  
    this.TENTATIVE_LAST_DAY=stream.readString(); 
    } 


@Override 
public void writeSQL(SQLOutput stream) throws SQLException { 
    // TODO Implement this method 
    stream.writeLong(EMP_ID); 
    stream.writeString(FIRST_NM); 
    //stream.writeString(MIDDLE_NM); 
    stream.writeString(DOJ); 
    stream.writeString(GENDER); 
    stream.writeString(STATUS); 
    stream.writeString(REPORTING_MGR); 
    System.out.println("write "+REPORTING_MGR); 
    stream.writeString(LAST_NM); 
    stream.writeString(EMAIL_ID); 
    stream.writeString(STREAM_ID); 
    stream.writeString(DESIGN_ID); 
    stream.writeString(EMP_LOCATION); 
    stream.writeString(GEO_CODE); 
    stream.writeString(EMP_NO); 
    stream.writeString(LEVEL_2_MGR); 
    stream.writeString(TENTATIVE_LAST_DAY); 

} 

}

 CallableStatement pstmt = 
      getDBTransaction().createCallableStatement("begin ?:= emp_dml.Main(?,EMP_OBJ_DT_ARR(?),?); end;", 
                 0); 
     EmployeeObj eob=null; 
     Object[] obj = EmployeeD.toArray(new Object[EmployeeD.size()]); 
     for(int i=0;i<EmployeeD.size();i++) 
     { 
      obj[i]=EmployeeD.get(i).toString(); 
      System.out.println("i "+i+" obj[i] "+obj[i]); 
     } 
     eob=new EmployeeObj("EMP_DATA_OBJ",obj); 
     pstmt.setInt(2,row_id); 
     pstmt.setObject(3, (Object) eob); 
     pstmt.setString(4,user); 
     pstmt.registerOutParameter(1, Types.BIGINT); 

     try 
     { 
     pstmt.executeUpdate(); 
     } 
     catch(SQLException e1) 
     { 
      System.out.println("ExecuteUpdate number format exception"); 
       e1.printStackTrace(); 
      } 
     System.out.println("After Update app insert"); 
     dbTransaction.commit(); 

    } 

PL/SQL에서 EmployeeData 생성 유형은 다음과 같습니다

create or replace type EMP_OBJ_DT_ARR as table of EMP_DATA_OBJ; 

    create or replace TYPE EMP_DATA_OBJ AS OBJECT 
    (
    EMP_NO   VARCHAR2(10), 
    EMP_ID   NUMBER,  
    LAST_NM  VARCHAR2(100), 
    FIRST_NM  VARCHAR2(100), 
    DOJ   VARCHAR2(100),   
    GENDER   VARCHAR2(50), 
    STATUS   VARCHAR2(100), 
    REPORTING_MGR NUMBER,   
    LEVEL_2_MGR  NUMBER,   
    EMAIL_ID  VARCHAR2(200), 
    STREAM_ID  VARCHAR2(100),  
    DESIGN_ID  VARCHAR2(100), 
    EMP_LOCATION VARCHAR2(100), 
    GEO_CODE  VARCHAR2(100), 
    TENTATIVE_LAST_DAY CHAR(8)); 

내가 코드를 실행 할 때마다. 예외가 발생합니다

 java.sql.SQLException: setObject, Exception = For input string: "Pr" 
at weblogic.jdbc.wrapper.JDBCWrapperImpl.invocationExceptionHandler(JDBCWrapperImpl.java:142) 
at weblogic.jdbc.wrapper.PreparedStatement.setObject(PreparedStatement.java:378) 
at model.AppModuleImpl.insertData(AppModuleImpl.java:940) 
at view.Parse_employee.upload(Parse_employee.java:176) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
at com.sun.el.parser.AstValue.invoke(AstValue.java:254) 
at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:302) 
at org.apache.myfaces.trinidad.component.MethodExpressionMethodBinding.invoke(MethodExpressionMethodBinding.java:46) 
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) 
at org.apache.myfaces.trinidad.component.UIXCommand.broadcast(UIXCommand.java:190) 
at org.apache.myfaces.trinidad.component.UIXComponent.broadcastInContext(UIXComponent.java:364) 
at oracle.adf.view.rich.event.ProxyEvent.broadcastWrappedEvent(ProxyEvent.java:72) 
at oracle.adf.view.rich.component.fragment.UIXRegion.broadcast(UIXRegion.java:124) 
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) 
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) 
at oracle.adfinternal.view.faces.lifecycle.LifecycleImpl._invokeApplication(LifecycleImpl.java:1074) 
at oracle.adfinternal.view.faces.lifecycle.LifecycleImpl._executePhase(LifecycleImpl.java:402) 
at oracle.adfinternal.view.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:225) 
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) 
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:280) 
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:254) 
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:136) 
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:346) 
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:25) 
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79) 
at oracle.adf.model.servlet.ADFBindingFilter.doFilter(ADFBindingFilter.java:192) 
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79) 
at oracle.adfinternal.view.faces.webapp.rich.RegistrationFilter.doFilter(RegistrationFilter.java:105) 
at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl$FilterListChain.doFilter(TrinidadFilterImpl.java:502) 
at oracle.adfinternal.view.faces.activedata.AdsFilter.doFilter(AdsFilter.java:60) 
at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl$FilterListChain.doFilter(TrinidadFilterImpl.java:502) 
at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl._doFilterImpl(TrinidadFilterImpl.java:327) 
at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl.doFilter(TrinidadFilterImpl.java:229) 
at org.apache.myfaces.trinidad.webapp.TrinidadFilter.doFilter(TrinidadFilter.java:92) 
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79) 
at oracle.adf.library.webapp.LibraryFilter.doFilter(LibraryFilter.java:202) 
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79) 
at oracle.security.jps.ee.http.JpsAbsFilter$1.run(JpsAbsFilter.java:137) 
at java.security.AccessController.doPrivileged(Native Method) 
at oracle.security.jps.util.JpsSubject.doAsPrivileged(JpsSubject.java:315) 
at oracle.security.jps.ee.util.JpsPlatformUtil.runJaasMode(JpsPlatformUtil.java:460) 
at oracle.security.jps.ee.http.JpsAbsFilter.runJaasMode(JpsAbsFilter.java:120) 
at oracle.security.jps.ee.http.JpsAbsFilter.doFilter(JpsAbsFilter.java:217) 
at oracle.security.jps.ee.http.JpsFilter.doFilter(JpsFilter.java:81) 
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79) 
at oracle.dms.servlet.DMSServletFilter.doFilter(DMSServletFilter.java:220) 
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79) 
at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27) 
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79) 
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3436) 
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3402) 
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) 
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120) 
at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57) 
at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2285) 
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2201) 
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2179) 
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1572) 
at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:255) 
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:311) 
at weblogic.work.ExecuteThread.run(ExecuteThread.java:263) 

Caused by: java.lang.NumberFormatException: For input string: "Pr" 
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
at java.lang.Integer.parseInt(Integer.java:492) 
at java.lang.Integer.parseInt(Integer.java:527) 
at oracle.sql.NUMBER.toBytes(NUMBER.java:1917) 
at oracle.sql.NUMBER.stringToBytes(NUMBER.java:3448) 
at oracle.sql.NUMBER.<init>(NUMBER.java:317) 
at oracle.jdbc.oracore.OracleTypeNUMBER.toNUMBER(OracleTypeNUMBER.java:285) 
at oracle.jdbc.oracore.OracleTypeNUMBER.toDatum(OracleTypeNUMBER.java:60) 
at oracle.jdbc.oracore.OracleType.toDatumInternal(OracleType.java:149) 
at oracle.sql.StructDescriptor.toOracleArray(StructDescriptor.java:945) 
at oracle.sql.StructDescriptor.toArray(StructDescriptor.java:1930) 
at oracle.sql.STRUCT.<init>(STRUCT.java:165) 
at oracle.sql.OracleSQLOutput.getSTRUCT(OracleSQLOutput.java:122) 
at oracle.sql.STRUCT.toSTRUCT(STRUCT.java:875) 
at oracle.jdbc.driver.OraclePreparedStatement.setObjectCritical(OraclePreparedStatement.java:13219) 
at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:12597) 
at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:13744) 
at oracle.jdbc.driver.OracleCallableStatement.setObject(OracleCallableStatement.java:11812) 
at oracle.jdbc.driver.OraclePreparedStatementWrapper.setObject(OraclePreparedStatementWrapper.java:260) 
at weblogic.jdbc.wrapper.PreparedStatement.setObject(PreparedStatement.java:363) 
... 62 more 

여기에 숫자 형식 예외가 표시됩니다. 나는 그것을 어떤 숫자 형식으로도 변환하지 않을 것이다. 제발 제안 해주세요.

+1

숫자 인 데이터베이스 필드에 숫자가 아닌 문자열을 채우려 고 시도합니다. 너는 그렇게 할 수 없다. –

+0

First_nm은 varchar2 필드입니다. – 5extremers

+1

그리고'pstmt.registerOutParameter (1, Types.BIGINT);는 의도 된 것입니까? –

답변

0

저는 왜 numberFormatException이 발생하는지 거의 이해하지 못했습니다.

저는 SqlData를 구현하는 java 클래스를 개발했습니다.

readSQL(SQLInput stream, String typeName) 
writeSQL(SQLOutput stream) 

여기 writeSQL가 스트림으로서 데이터를 취할 것이다

SQLDATA 클래스에서 구현 될 필요가있는 2 가지 방법이있다. 그래서 내가 무엇을 건지면, 그것은 물결에 덧붙여 질 것이다. 내가 자바

id  name age 
    1  xyz 26 

으로 데이터 유형을 데이터를 전달하고 가정합니다

PL/SQL 데이터 형식에서
id - Integer 
    name - String 
    age - Integer 

id -number 
name -varchar2 
age -number 

내가 순서대로 데이터를 검색하려고 할 경우 이름, 아이디 및 나이 (예 : xyz 1 26) 다음 그것은 sqlException을 사용하여 numberFormatException을 던집니다. 그래서 우리가 가지고있는 것과 같은 순서로 전달해야합니다.