第一步:创建一个对象类型

 create or replace type STUDENT as object(
id number(4),
name varchar2(50),
age number(3)
);
/

第二步:创建一个数组类型 (任意选择下面的一句执行)

-- 方式1:用table来盛放对象
create or replace type STU_LIST as table of STUDENT;
/ -- 方式2:用数组来盛放对象,同时可指定数组的大小[用as varray(100)也是可以滴]
create or replace type STU_LIST as array(100) of STUDENT;
/

第三步:创建一个过程引用集合类型的参数

create or replace procedure test_in_list(
-- 参数区域
studentlist in STU_LIST,
message out varchar2
)
is
-- 变量区域
begin
-- 执行区域
for i in 1 .. studentlist.count loop
message:=message||'{id:'||studentlist(i).id||', name:'||studentlist(i).name||', age'||studentlist(i).age||'},';
end loop;
end test_in_list;
/

第四步:java调用存储过程

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.util.ArrayList; import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
import oracle.sql.STRUCT;
import oracle.sql.StructDescriptor; public class TestProInList { // 测试main
public static void main(String[] args) {
new TestProInList().testProInList();
} // 调用存储过程并返回执行结果
public void testProInList() {
// 定义需要的变量
Connection ct = null;
CallableStatement cs = null;
ResultSet rs = null; try {
// 加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver"); // 得到连接
ct = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:myora1", "sccot", "tiger"); // 创建CallableStatement接口
cs = ct.prepareCall("{call TEST_IN_LIST(?,?)}"); // 给in?赋值
ArrayList<Student> list = new ArrayList<Student>() {
{
this.add(new Student(1, "ZhangSan", 23));
this.add(new Student(2, "LiSi", 22));
this.add(new Student(3, "WangWu", 21));
}
};
ARRAY array = getArray(ct, "STUDENT", "STU_LIST", list);// 该函数调用的第二三个参数就是上面自定义的两个类型,在此必须大写
// 设置入参
cs.setArray(1, array);
// 注册出参
cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR); // 执行
cs.execute(); // 获取返回结果
String message = cs.getString(2);
System.out.println(message);
// 打印结果:
// {id:1, name:ZhangSan, age23},{id:2, name:LiSi, age22},{id:3,
// name:WangWu, age21}, } catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭资源
try {
if (cs != null) {
cs.close();
}
if (rs != null) {
rs.close();
}
if (ct != null) {
ct.close();
}
} catch (Exception e) {
e.printStackTrace();
}
cs = null;
rs = null;
ct = null;
}
} private ARRAY getArray(Connection con, String OraObjType, String OraArrType, ArrayList<Student> stuList)
throws Exception {
ARRAY list = null;
if (stuList != null && stuList.size() > 0) {
// Oracle识别的集合对象,匹配java对象集合
STRUCT[] structs = new STRUCT[stuList.size()]; // Oracle识别的对象模板,匹配单个java对象
StructDescriptor structdesc = new StructDescriptor(OraObjType, con); // 遍历stuList,将每个Student对象转换为Oracle可识别的模板对象
for (int i = 0; i < stuList.size(); i++) {
// java对象
Student student = stuList.get(i); // 数组大小应和你定义的数据库对象(STUDENT)的属性的个数
Object[] oneRow = new Object[3];
oneRow[0] = student.getId(); // 将Student对象的每个属性按顺序设置到oneRow数组中
oneRow[1] = student.getName();
oneRow[2] = student.getAge();
structs[i] = new STRUCT(structdesc, con, oneRow);
} // 匹配list
ArrayDescriptor desc = ArrayDescriptor.createDescriptor(OraArrType, con);
list = new ARRAY(desc, con, structs);
}
return list;
}
} class Student {
private int id;
private String name;
private int age; // 构造函数
public Student(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
} // getters/setters(略) }

集合元素为基本数据类型时的小例子

sql部分:

-- 创建数组对象
create or replace type tables_array as varray(100) of varchar2(32);
/ -- 测试用存储过程
create or replace procedure test_in_list(
--参数区域
objlist in tables_array,
message out varchar2
) is
--变量区域
begin
--执行区域
for i in objlist.first .. objlist.last loop
message:=message||objlist(i)||',';
end loop;
commit;
end test_in_list;
/

java部分:

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List; import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor; public class TestProInList { // 调用测试用存储过程
public static void main(String[] args) {
// 定义需要的变量
Connection ct = null;
CallableStatement cs = null;
ResultSet rs = null; try {
// 加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver"); // 得到连接
ct = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:myora1", "sccot", "tiger"); // 创建CallableStatement接口
cs = ct.prepareCall("{call TEST_IN_LIST(?,?)}"); // 给in?赋值
ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("TABLES_ARRAY", ct);
List<String> list = new ArrayList<String>() {
{
this.add("abc");
this.add("edf");
this.add("ghi");
}
};
ARRAY array = new ARRAY(descriptor, ct, list.toArray());
// 设置入参
cs.setArray(1, array);
// 注册出参
cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR); // 执行
cs.execute(); // 获取返回结果
String message = cs.getString(2);
System.out.println(message); //打印结果: abc,edf,ghi, } catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭资源
try {
if (cs != null) {
cs.close();
}
if (rs != null) {
rs.close();
}
if (ct != null) {
ct.close();
}
} catch (Exception e) {
e.printStackTrace();
}
cs = null;
rs = null;
ct = null;
}
}
}

Oracle存储过程入参传入List集合的小例子的更多相关文章

  1. mybatis框架之多参数入参--传入Map集合

    需求:查询出指定性别和用户角色列表下的用户列表信息 实际上:mybatis在入参的时候,都是将参数封装成为map集合进行入参的,不管你是单参数入参,还是多参数入参,都是可以封装成map集合的,这是无可 ...

  2. Oracle 存储过程或函数传入的数值参数number

    在oralce中,如果存储过程需要接收含有数值类型的参数时,如何声明呢.如下: CREATE OR REPLACE PACKAGE GPS.PKG_MONTH_TARGET AS ---------- ...

  3. SQLServer 在存储过程里使用事务控制的简单小例子

    alter proc sp_test(     @name varchar(50))asbegin    --开始事务   begin transaction   --设置一个存储报错代码的变量   ...

  4. oracle 存储过程 示例

      oracle 存储过程 示例 CreationTime--2018年9月4日09点49分 Author:Marydon 1.情景展示 对VIRTUAL_QRCODELOG表的静态二维码,动态二维码 ...

  5. oracle常用函数以及调用入参为record的存储过程的方法,

    转自:http://www.cnblogs.com/zhangronghua/archive/2007/08/20/862812.html SQL中的单记录函数1.ASCII返回与指定的字符对应的十进 ...

  6. Oracle存储过程-自定义数据类型,集合,遍历取值

    摘要 Oracle存储过程,自定义数据类型,集合,遍历取值 目录[-] 0.前言 1.Packages 2.Packages bodies 3.输出结果 0.前言 在Oracle的存储过程中,可能会遇 ...

  7. jdbcTemplate 调用存储过程。 入参 array 返回 cursor

    注:本文来源<   jdbcTemplate 调用存储过程. 入参 array 返回 cursor   > 需求: java传入一个list object.从数据库找到相关的数据并返回. ...

  8. 先查询再插入,改为存储过程,java部分入参出参、mybatisxml【我】

    先查询再插入,改为存储过程 create or replace procedure PRO_REVENUE_SI(l_p_cd in Varchar2, l_c_cd in Varchar2, l_p ...

  9. oracle中带参存储过程的使用

    Oracle中存储过程带参分为:输入参数(in)和输出参数(out) 例如: create or replace procedure out_test(v_user in emp.user_name% ...

随机推荐

  1. kinect2的标定

    我用的是ubuntu14.04LTS,ROS 版本是indigo,kinect v2,我是用双系统装的ubuntu,关于怎么使用安装kinect2的安装以及使用的都在github上有着详细的说明 Ki ...

  2. webpack3--配置多入口和多出口

    上一篇我们稍微提到了webpack.config.js.今天主要来说下如何配置多入口,多出口. 我们之前写到的webpack.config.js,具体代码如下: module.exports = { ...

  3. js 实时数据显示

    js代码 <script type="text/javascript" src="jquery.js"></script> <sc ...

  4. python公司内部语言规范与语言风格

    一.python语言规范 1.1导入 Tip: 仅对包和模块使用导入 定义: 模块间共享代码的重用机制. 优点: 命名空间管理约定十分简单.每个标识符的源都用一种一致的方式指示.x.obj 表示obj ...

  5. 使用Maven运行单元测试

    要通过Maven运行单元测试,发出此命令: mvn test 这会在你的项目中运行整个单元测试. 案例学习 创建两个单元测试,并通过 Maven 的运行它.参见一个简单的 Java 测试类: pack ...

  6. LintCode #1 A + B 问题

    分析:以3 + 5为例 3的二进制为 1 1,5的二进制为 1 0 1,可以这样做:1先给这两个数加起来不考虑进位,这样得到的结果为 1 1 0,会发现与^得到的结果相同,与是先给两个数 做^运算:2 ...

  7. Linux 内存buffer与cache区别_003

    一.首先大概了解一下计算机CPU.Cache.Buffer.内存.硬盘.SWAP CPU也称为中央处理器(CPU,Central Processing Unit)是一块超大规模的集成电路,是一台计算机 ...

  8. Linux 下 CPU 使用率与机器负载的关系与区别

    原文链接:  http://blog.chinaunix.net/uid-28541347-id-4926054.html 当我们使用top命令查看系统的资源使用情况时会看到load average, ...

  9. C#页面前台<%%><%#%><%=%>

    ASP.net前台绑定用的最多,今天小小总结一下. 1:<%#Eval("")%> 2:<%#Bind("")%> 3:<%=变量 ...

  10. EventBus的思路和一些反思

    本文版权归博客园和作者吴双本人共同所有 转载和爬虫请注明原文地址 www.cnblogs.com/tdws   C#本地实现的和Redis Set实现的,实际上都是要维护一个Events和Handle ...