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

 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. Spring Cloud / Spring Boot There was an unexpected error (type=Unauthorized, status=401). Full authentication is required to access this resource.

    访问EndPoint时会出现没有权限   There was an unexpected error (type=Unauthorized, status=401). Full authenticat ...

  2. 标签<view>文字自动换行

    <view style='word-break:break-all;'>{{con.blog}}</view>

  3. 常用的HTTP协议状态码

    200 - OK,服务器成功返回网页     - Standard response for successful HTTP requests. 301 - Moved Permanently(永久跳 ...

  4. Simple Path Data Resources that I Add to Every WPF and Silverlight Project

    Here’s a little time saver. I sort of have a routine that I go through when I create a new WPF proje ...

  5. 摄像头驱动OV7725学习笔记连载(一):OV7725 电器特性和时序图

    OV(豪威科技)已经被中国财团收购.这个昔日的大佬,最终走下神坛. 关于OVsensor的资料包括,OV7725的简介(OmniVsion_OV7725),OV7725的数据手册(OV7725_Dat ...

  6. Mxnet学习资源

    MxNet 学习笔记(1):MxNet中的NDArray http://mxnet.incubator.apache.org/api/python/symbol/symbol.html api文档 M ...

  7. 【4】JVM-GC设计思路分析

    Java中将内存的控制交给JVM来实现,方便了JAVA程序猿,当然牺牲了一部分效率,不过总体来看是值得的.那么JVM中是如何设计GC的呢,本文从几个问题入手,然后分析了一下设计思路,如果有理解错误的地 ...

  8. Kali配置网卡静态信息

    临时配置ip ifconfig eth0 up //端口启用 ifconfig eth0 down //端口关闭 ifconfig eth0 192.168.1.10 //只修改ip地址 ifconf ...

  9. 第三百八十四节,Django+Xadmin打造上线标准的在线教育平台—路由映射与静态文件配置以及会员注册

    第三百八十四节,Django+Xadmin打造上线标准的在线教育平台—路由映射与静态文件配置以及会员注册 基于类的路由映射 from django.conf.urls import url, incl ...

  10. Java如何使用重载方法处理异常?

    在Java编程中,如何使用重载方法处理异常? 此示例显示如何使用重载方法来处理异常.需要在每个方法中使用try catch块. package com.yiibai; public class Exc ...