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

Posted

技术标签:

【中文标题】使用简单的 jdbc 调用将数组作为输入参数传递给 oracle 存储过程【英文标题】:Pass array as input parameter to an oracle stored procedure using simple jdbc call 【发布时间】:2014-12-26 15:09:56 【问题描述】:

这是我的 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)
)

我正在使用 Spring JDBC Framework(SimpleJdbcCall 对象)来执行上述过程。下面是我声明的代码sn-p

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

到 MapSqlParameterSource

 MapSqlParameterSource in = new MapSqlParameterSource();

【问题讨论】:

【参考方案1】:

Spring Data JDBC Extensions 项目有一些支持,使这更容易。看看reference manual for passing in an Oracle ARRAY type。

【讨论】:

我会尝试这个并接受答案,如果它有效。谢谢 嗨..在我的例子中,除了提到的数组之外,还有很少的输入参数。如何做到这一点?【参考方案2】:

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

【讨论】:

以上是关于使用简单的 jdbc 调用将数组作为输入参数传递给 oracle 存储过程的主要内容,如果未能解决你的问题,请参考以下文章

java spring boot将字符串数组作为json中的参数传递给ajax调用

将数组作为参数传递给 C 中的函数

如何从控制台将参数传递给除 String args[] 之外的 main?

声明一个带有数组参数的python函数并将一个数组参数传递给函数调用?

将数组作为参数传递给 plsql 过程

Perl 如何将数组作为参数传递给另一个 Perl 脚本