2014-05-09 2 views
1
내가 Oracle 저장 프로 시저에 "ArrayList를"을 추진하기 위해 노력하고있어

에 필요한 수정을 한 후, 객체는 다시 반환됩니다.보내기 및 검색 배열 목록을 Oracle 저장 프로 시저

I는 "AS TYPE OF TABLE"인 입출력 매개 변수 Oracle 저장 프로 시저가있다. 내가 TypeHandler 구현에서의 MyBatis를 사용하여 전화를 걸 수 있어요 그 방법 공공 무효의 setParameter를 무시

되는 SQLException

발생 (PreparedStatement의 추신, 나는, 개체 매개 변수 JdbcType jdbcType은 INT)하지만 난 문제에 직면하고있어 개체를 검색하는 동안 나는 아래 메서드를 재정의를 입수

. 클래스 오라클 액세스하려고 :

공공 개체 getResult를 (CallableStatement로 CS, columnIndex에를 INT) 는

나는 아래의 오류 java.lang.IllegalAccessError납니다이되는 SQLException {

ARRAY array_to_pass = ((OracleCallableStatement) cs).getARRAY(1);  

    /* showing content */ 
    Datum[] elements = array_to_pass.getOracleArray(); 

    for (int i = 0; i < elements.length; i++) { 
     Object[] element = ((STRUCT) elements[i]).getAttributes(); 
     String value = (String) element[0]; 
     System.out.println("array(" + i + ").val=" + value); 
    } 

}을 던졌습니다. 오류 코드 :

ARRAY array_to_pass = (OracleCallableStatement) cs) .getARRAY (1); 오라클에서 Object 유형의 테이블을 검색하는 방법에 대한


어떤 생각이/도움이됩니다.


+0

이것은 http : // stacko에 도움이 될 수 있습니다. verflow.com/questions/5198856/pass-array-to-oracle-procedure – vav

+0

오라클로 전달하면 문제가 없습니다. 그것을 돌려 보내는 방법? – MukeshKoshyM

답변

4

스프링, Mybatis & 오라클을 사용하여 성공적으로 구현할 수 있습니다.구현 참조 코드 데이터베이스에 입력 작성)

1 아래와 같다

CREATE OR OBJECT AS TYPE 타잎 교체 (
입력란 1 VARCHAR (6) 입력란 2 VARCHAR (6) )

2) 데이터베이스에 테이블 유형 생성

CREATE OR REPLACE TYPE TableTypeName AS TABLE of TypeName;

3)이 개 필드

4) 전송 객체

5) 만들기 데이터베이스 호출

CALL의 StoredProcedureName에 필요한 ArrayList를 생성하여 자바에서 이동 객체를 생성 ( # {Parameter_in, javaType = Object, jdbcType = ARRAY, jdbcTypeName = TableTypeName, m} 송시 = INOUT, typeHandler = javaHandlername} )

6) 핸들러

public class javaHandlername implements TypeHandler { 
    // Set data to oracle object 
    @Override 
    public void setParameter(PreparedStatement ps, int i, Object parameter, 
     JdbcType jdbcType) throws SQLException 
    { 
     List<TO> TOs = (List<TO>) parameter; 

     StructDescriptor structDescriptor = StructDescriptor 
     .createDescriptor("TypeName", ps.getConnection()); 
     STRUCT[] structs = null; 
     structs = new STRUCT[TOs.size()]; 
     for (int index = 0; index < TOs.size(); index++) { 
      TO to = TO.get(index); 
      Object[] params = new Object[2]; 
      params[0] = fSVDisptchSchedDely.getField1(); 
      params[1] = fSVDisptchSchedDely.getField2(); 

      STRUCT struct = new STRUCT(structDescriptor, 
      ps.getConnection(), params); 
      structs[index] = struct; 

     } 

     ArrayDescriptor desc = ArrayDescriptor.createDescriptor(
     "TableTypeName", ps.getConnection()); 
     ARRAY oracleArray = new ARRAY(desc, ps.getConnection(), structs); 
     ps.setArray(i, oracleArray); 
    } 

    // Set the result back to Java object 
    public Object getResult(CallableStatement cs, int columnIndex) 
    throws SQLException { 

     List<TO> TOs= new ArrayList<TO>(); 
     Object[] structArray = (Object[]) cs.getArray(columnIndex).getArray(); 
     oracle.sql.STRUCT mystruct = null; 
     for (Object structObj : structArray) { 
      TO to= new TO(); 
      mystruct = (oracle.sql.STRUCT) structObj; 
      Object[] structAttr = mystruct.getAttributes(); 
      to.setField1((String)structAttr[0])); 
      to.setField2((String)structAttr[1]));    
      TOs.add(to); 
     } 
     return TOs; 
    } 
} 



7) 데이터베이스 전화 걸기 만들기

즐기 ... :)