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

 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. js学习(五)-全局函数和类内部函数区别

    //---------------------------js代码--------------------------- function User(){       //类成员的定义及构造函数 th ...

  2. PHP 打乱数组

    $arr = array( array( "id"=>1, "name"=>"张三", "sex"=> ...

  3. 用css3实现社交分享按钮

    以前实现按钮一般都是用图片来实现的,特别是一些拥有质感的按钮,今天练习了一些相关方面的的例子,用css3来实现Social Media Buttons html代码如下 <div class=& ...

  4. Unity下Iso和Persp两种模式的区别

    Iso模式 平行视野.在Iso模式下,不论物体距离摄像头远近都给人的感觉是一样大的. Persp模式 透视视野.在persp模式下,物体在scene界面上所呈现的画面是给人一种距离摄像头近的物体显示的 ...

  5. vi 命令集

    一:跳到文件第一行 1. 输入:0或:1,然后回车: 2. 在键盘按下小写gg:   二:跳到文件最后一行 1. 输入:$,然后回车: 2. 在键盘按下大写G : 3. 在键盘按Shift + g: ...

  6. 关于session_cache_expire 的理解

    session_cache_limiter,它是session在客户端的缓存方式,有nocache,private,private_no_expire,publice主这几种. cache是属于浏览器 ...

  7. SQL Server2005配置同步复制

    因为实际需要,需要对两台SQL Server服务器配置同步复制.记录一下配置过程. 配置环境 两台服务器: 发布服务器,以下简称PS. 订阅服务器,以下简称SS. 两台服务器都是Windows Ser ...

  8. 性能优化系列二:JVM概念及配置

    一.虚拟机组成 虚拟机主要由三部分组成:编译器(执行引擎),堆与栈. 1. 编译器 编译器分为即时编译器与解释器. 即时编译器将代码编译成本地代码存于code区.因此它快,但它有内存限制! 解释器逐行 ...

  9. Java如何显示所有正在运行的线程?

    在Java编程中,如何显示所有正在运行的线程? 以下示例演示如何使用getName()方法显示所有正在运行的线程的名称. package com.yiibai; public class Displa ...

  10. 边框颜色为 tintColor 的 UIButton

    创建一个 UIButton 的子类,重写其方法: - (void)drawRect:(CGRect)rect { [[self layer] setCornerRadius:CORNER_RADIUS ...