`

在Oracle中把Array类型作为参数传入存储过程

阅读更多
在Oracle中把Array类型作为参数传入存储过程
2010-03-02 16:46
别人提到的问题,试验了一下, 是没问题的,过程如下。
使用Oracle Database 11g Enterprise Edition Release 11.2.0.1.0.

步骤:
1. 创建自定义的类型。由于Oracle没有提供现成的array类型,这里用table类型来模拟。

CREATE OR REPLACE TYPE varchar_array is Table OF varchar2(128)


创建后,varchar_array是一个table,里面元素的类型为varchar2(128).

2. 创建一个存储过程test1. 这个过程接受一个上面创建的varchar_array类型作为输入参数. 在过程体中,通过一个循环遍历传入的array中的每一个元素, 插入到一个表tb中:

create or replace procedure test1(arr in varchar_array) is
begin
   FOR i IN arr.first .. arr.last LOOP
      insert into tb values(arr(i));
   END LOOP;
end test1;


3. 数据库这边的基本上完事了。 Java程序如下, 基本上和普通程序差不多:

String driver = "oracle.jdbc.driver.OracleDriver";
String strUrl = "jdbc:oracle:thin:@192.168.1.199:1521:orcl";
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;

try {
   Class.forName(driver);
   conn = DriverManager.getConnection(strUrl, "user", "pass");
   CallableStatement proc = null;
   proc = conn.prepareCall("{ call test1(?) }"); //调用存储过程test1
   //不一样的地方,获得上面创建的自定义的类型,注意大小写
   ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("VARCHAR_ARRAY",
                                                conn);

   List list = new ArrayList();
   list.add("a");
   list.add("b");        
   //把list中的元素转换成自定义的类型
   ARRAY array = new ARRAY(descriptor, conn, list.toArray());
   //设置参数, 和普通的一样
   proc.setArray(1, array);
   //执行
   proc.execute();
}
   catch (Exception ex) {
   ex.printStackTrace();
} finally {
   ..... 各种 close ......
}


执行该Java程序,查询表tb, 程序中的元素正常插入:
SQL> select * from tb;

A
--------------------------------------------------------------------------------
a
b

SQL>

 

分享到:
评论
1 楼 ninnd 2011-09-28  
CREATE OR REPLACE TYPE ptest_type is RECORD(
    ID          VARCHAR2(32),
    NME         VARCHAR2(32)
);

CREATE OR REPLACE TYPE ptest_type_array IS TABLE OF ptest_type index by binary_integer;

create or replace package pkg_ptest_interface IS

  PROCEDURE ptest_insert_data_to_table(P_dataArray ptest_type_array);
 
end pkg_ptest_interface;
--package body 略去--
这样的array入参怎么处理?
我用过的是ibatis

相关推荐

    C# 传入自定义列表List 到Oracle存储过程

    本文将详细讲解如何在C#中使用自定义列表(List)作为参数调用Oracle存储过程,以及实现这一功能的关键技术和注意事项。 首先,我们需要了解Oracle数据库中的PL/SQL类型,例如VARCAR2、NUMBER等,它们对应于C#中的...

    Java调用存储过程--传入集合参数

    此过程涉及使用`StructDescriptor`和`ArrayDescriptor`创建描述符,然后使用这些描述符构建`STRUCT`和`ARRAY`对象,最终作为参数传递给存储过程。 ```java private static ARRAY getOracleArray(Connection con, ...

    Spring访问传入数组参数的Oracle存储过程

    当我们谈论`Spring`访问传入数组参数的`Oracle`存储过程时,我们实际上是在探讨如何利用Java的Spring框架与Oracle数据库进行高级交互。Spring是一个广泛使用的开源框架,它简化了企业级Java应用的开发,而Oracle...

    Oracle中把ArrayOracle中把

    在 Oracle 数据库中,将 Array 类型作为参数传递给存储过程是一种常见的操作,尤其是在需要处理大量数据时。Oracle 自身并没有内置的 Array 类型,但可以通过创建自定义的 Table 类型来模拟 Array 功能。以下是如何...

    java操作Oracle数据库——ARRAY、TABLE类型批量入库

    - 最后,执行SQL语句,例如存储过程,该过程接受ARRAY作为参数并进行批量操作。 2. **TABLE类型的处理**: - TABLE类型比ARRAY更复杂,因为它可以包含多行数据。在Java中,你需要定义一个自定义的OracleTable类型...

    Mybatis传list参数调用oracle存储过程的解决方法

    为了解决这个问题,我们可以使用Mybatis的TypeHandler机制来将List类型参数封装成Oracle的ARRAY类型,然后将其传递给存储过程。 解决步骤 1. 建立数据库表 首先,我们需要建立一个数据库表,用于存储批量插入的...

    C++Oracle存储过程批量插入

    上述代码创建了一个存储过程调用,其中`PKG批量操作.BATCH_INSERT`是Oracle中的存储过程名,`data`是传入的参数,它是一个字符串数组。存储过程内部应当设计为接受这种类型的数据并进行批量插入操作。 在Oracle端,...

    oracle存储过程调用实践[文].pdf

    3. wrong number or types of arguments in call to *** 当调用存储过程时,传递的参数数量或类型与存储过程定义的不符,需要核对参数列表,确保传入的参数正确无误。 4. weblogic.jdbc.wrapper.Array_oracle_sql_...

    oracle存储过程

    在Oracle中,存储过程可以接受输入参数,返回输出值,甚至处理异常,提高了数据库操作的效率和代码的模块化。 "e3tree"可能是指一个特定的存储过程或一个与树形结构相关的数据库应用程序。在数据库设计中,如果数据...

    Mybatis调用PostgreSQL存储过程实现数组入参传递

    在存储过程中,我们可以定义接受数组作为参数的函数。例如,以下是一个接受整数数组作为参数的PostgreSQL存储过程: ```sql CREATE OR REPLACE FUNCTION "public"."func_arr_update"(ids _int4) RETURNS "pg_...

    MyBatis传入集合 list 数组 map参数的写法

    在MyBatis中,处理集合参数如list、array以及map是非常常见的操作。这些参数通常用于构建动态SQL,特别是当需要在`IN`语句中使用多个值时。下面将详细解释如何在MyBatis中使用这些参数类型。 1. **List参数**: 当...

    PLSQL编程(存储器).docx

    `pro_sum_params`展示了如何传递多个参数到存储过程中,通过声明变量并指定参数类型,然后在BEGIN块中计算参数之和。 6. **%TYPE属性**: `%TYPE`属性用于确保变量的类型与表列的类型完全匹配,例如`employees....

    存储过程返回数组对象示例代码

    这个存储过程的使用方式是在PL/SQL代码或Java、C#等支持Oracle存储过程调用的编程语言中调用`account_month`函数,传入日期参数,并接收返回的"T_ACCOUNT_MONTH_TABLE"对象。在应用程序中,可以进一步处理这个数组...

    向Oracle中传入数组,批量执行SQL语句

    1、首先用PL/SQL创建package 1 create or replace package excuteBatchOperate 2 as 3 type sqlStr_Array is table of varchar...  2、在packagebody内创建存储过程 1 create or replace package body excuteBatc

    MyBatis参数处理实现方法汇总

    - 可以设置参数的一些规则,如`javaType`、`jdbcType`、`mode`(存储过程)、`numericScale`、`resultMap`、`typeHandler`、`jdbcTypeName`和`expression`(未来功能)。 - `jdbcType`在某些特定情况下需要设置,...

    Mybatis批量删除数据操作方法

    MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis使得开发者能够将注意力集中在使用SQL来构建自己的系统上,而无需关注...

    PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】.docx

    在实际使用中,开发者可以根据需要,将数据库配置信息传入类的构造函数,然后通过调用相应的类方法执行SQL操作。例如,创建一个新的数据库连接对象,执行一个查询,获取所有结果并遍历: ```php $config = array( ...

    springmybatis

    查询出列表,也就是返回list, 在我们这个例子中也就是 List<User> , 这种方式返回数据,需要在User.xml 里面配置返回的类型 resultMap, 注意不是 resultType, 而这个resultMap 所对应的应该是我们自己配置的 ...

Global site tag (gtag.js) - Google Analytics