使用简单的jdbc调用将数组作为输入参数传递给oracle存储过程



这是我的oracle过程规范

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)
)

我使用SpringJDBC框架(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),

映射SqlParameterSource

 MapSqlParameterSource in = new MapSqlParameterSource();

Spring Data JDBC Extensions项目提供了一些支持,使这一点变得更容易。请参阅有关传递OracleARRAY类型的参考手册。

PeudoCode与我实现的相同。

    # 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数据库的要求和类型而有所不同,但基础是相同的。

最新更新