복붙노트

[SPRING] 간단한 jdbc 호출을 사용하여 입력 매개 변수로 배열을 저장 프로 시저에 전달하십시오.

SPRING

간단한 jdbc 호출을 사용하여 입력 매개 변수로 배열을 저장 프로 시저에 전달하십시오.

여기 내 오라클 절차 사양입니다

CREATE OR REPLACE PACKAGE PKG_RE_FI AS

  PROCEDURE PRC_RE_FI_DETAILS(P_FAN_NO       IN VARCHAR2,
                              P_REF_ID       IN TY_APP_REF_ID,
                              P_COMMENTS     IN VARCHAR2,
                              P_BILLING_FLAG IN VARCHAR2,
                              P_STATUS       OUT VARCHAR2);
END PKG_RE_FI;

TY_APP_REF_ID (현재)

CREATE OR REPLACE TYPE ty_app_REF_ID as varray(500) of obj_array_ref_id

CREATE OR REPLACE TYPE obj_array_ref_id  AS OBJECT(
app_ref_id VARCHAR2(100)
)

위의 절차를 수행하기 위해 Spring JDBC Framework (SimpleJdbcCall 객체)를 사용하고 있습니다. 아래는 내가 선언 한 코드 스 니펫입니다.

      this.reFIJdbcCall =  new SimpleJdbcCall(dataSource).withCatalogName("PKG_RE_FI").
              withProcedureName("PRC_RE_FI_DETAILS").declareParameters(new SqlParameter("P_FAN_NO", Types.VARCHAR),
                        new SqlParameter("P_REF_ID", Types.ARRAY),
                        new SqlParameter("P_COMMENTS", Types.VARCHAR),
                        new SqlParameter("P_BILLING_FLAG", Types.VARCHAR),
                        new SqlOutParameter("P_STATUS", Types.VARCHAR)
              );

배열을 어떻게 전달해야합니까?

new SqlParameter("P_REF_ID", Types.ARRAY),

McPherson 매개 변수

 MapSqlParameterSource in = new MapSqlParameterSource();

해결법

  1. ==============================

    1.동일한 방식으로 PseudoCode를 구현했습니다.

    동일한 방식으로 PseudoCode를 구현했습니다.

        # 1.You will require a structDescriptor object for an object equivalent in pl sql like :
    
        StructDescriptor structDes= new StructDescriptor("<schemaname in caps>.<sql_object_name>", connectionObject);
    
        # 2. You will need to pass one object values such name, class, id to an object array in order and accordance to 'sql_object_name' object. 
    
        For exmaple:
        STRUCT[] structArray=new STRUCT[<ListObj>.size()];
        int index=0;
        for (a in ListObj){
    
        Object[] object=new Object[]{a.getName(),a.getId()};
        STRUCT struct=new STRUCT(structDes ,connectionObject,object);
                   structArray[index]=struct;
                   index++;
    
        }
    
        ArrayDescriptor arrayDes=ArrayDescriptor.createDescriptor(
            "<Schema name>.<table object from sql>", connectionObject);
    
        ARRAY array=new ARRAY(arrayDes,connectionObject, structArray);
    
       then pass it to proc 
    
       .declareParameters(
       new SqlInOutParameter("<parameter to proc name>",OracleTypes.ARRAY,"
       <schema name>.<sql_array_or_table_obj>"))
    
       like 
       Hashmap<String, Object> map= new HashMap<>();
       map.put("<parameter to proc name>",array);
       psStatement.execute(map);
    

    희망이 도움이됩니다. 이 시퀀스는 사용되는 SQL 데이터베이스의 요구 사항 및 유형에 따라 다를 수 있지만 기본은 동일합니다.

  2. ==============================

    2.Spring Data JDBC Extensions 프로젝트는 이것을 쉽게 지원합니다. Oracle ARRAY 유형을 전달하기위한 참조 설명서를보십시오.

    Spring Data JDBC Extensions 프로젝트는 이것을 쉽게 지원합니다. Oracle ARRAY 유형을 전달하기위한 참조 설명서를보십시오.

  3. from https://stackoverflow.com/questions/26655331/pass-array-as-input-parameter-to-an-oracle-stored-procedure-using-simple-jdbc-ca by cc-by-sa and MIT license