p { margin-bottom: 0.25cm; direction: ltr; color: rgb(0, 0, 0); line-height: 120%; text-align: justify }
p.western { font-family: "Times New Roman", serif; font-size: 10pt }
p.cjk { font-family: "宋体", "SimSun"; font-size: 10pt }
p.ctl { font-family: "Times New Roman", serif; font-size: 10pt }

数组里存储的是Stringintlang等基本数据类型或引用数据类型(不包括java bean

一、在oracle中定义一个数组类型(TYPE)

代码如下:

createorreplacetype
msg_array astableofnumber;

意思是创建一个名称为msg_array,存放类型为整型的数组类型

二、在oracle中定义一个存储过程

代码如下:

createorreplaceprocedure
modifyage(m_array
in
msg_array)

as

begin

for
i ..m_array.count
loop

update
users set
agewhere
id=m_array(i);

endloop;

commit;

exception

whenothersthen

rollback;

end
modifyage;

操作。

三、JAVA代码如下

Connection
conn = null;

CallableStatement
cstmt = null;

try
{

Class.forName("oracle.jdbc.OracleDriver");

conn
= DriverManager.getConnection(

"jdbc:oracle:thin:@localhost:1521:orcl",
"orcl_dev",

"dev");

List
list = new
ArrayList();

list.add(30);

list.add(31);

list.add(32);

list.add(33);

ArrayDescriptor
tabDesc = ArrayDescriptor.createDescriptor(

"MSG_ARRAY",
conn);

ARRAY
vArray = new
ARRAY(tabDesc, conn, list.toArray());

cstmt
= conn.prepareCall("call
modifyage(?)");

cstmt.setArray(1,
vArray);

cstmt.execute();

cstmt.close();

conn.close();

}
catch
(Exception e) {

e.printStackTrace();

}

个变量,然后通过JDBC的方式得到Connection,然后定义要传给存储过程的数组。

映射
Oracle端数组
AS TABLE OF类型

通过ArrayDescriptor.createDescriptor("MSG_ARRAY",conn)定义数组描述方式。

在通过new
ARRAY(tabDesc, conn,
list.toArray()),把要传入的数组按批定的数组描述方式生成一个新的Oracle定义的数组。

调用存储过程,传入参数并执行。

数组里存储的是java
bean

一、在oracle中定义一个对象类型(OBJECT)

createorreplacetype
userobj asobject(

id
number,

username
),

age
number,

password
)

)

意思是创建一个名称为userobj的对象类型,字符串的类型一定要写成nvarchar2,否则,传入数据库的字符串为null

二、在oracle中定义一个数组类型(TYPE)

代码如下:

createorreplacetype
obj_array astableof
userobj;

意思是创建一个名称为obj_array,存放类型为userobj的数组类型

三、在oracle中定义一个存储过程

代码如下:

createorreplaceprocedure
saveObjArray

(

avc_objArray
in
obj_array,

rowcountoutnumber,

msg
outvarchar2

)as

userinfo
userobj;

begin

for
i in
avc_objArray.First()..avc_objArray.Last()loop

userinfo
:=
avc_objArray(i);

insertinto
users (id,name,password,age)

values(userinfo.id,userinfo.username,userinfo.password,userinfo.age);

endloop;

rowcount:=sql%rowcount;

commit;

exception

whenothersthen

;

msg
:=sqlerrm;

rollback;

end
saveObjArray;

创建一个存储过程,传入的参数是上面定义的obj_array类型的数组,循环数组,分别插入数据库。返回受影响的行数和提式信息。

四、JAVA代码如下

Connection
conn = null;

CallableStatement
cstmt = null;

try{

Class.forName("oracle.jdbc.OracleDriver");

conn
= DriverManager.getConnection(

"jdbc:oracle:thin:@localhost:1521:orcl",
"orcl_dev",

"dev");

List<User>
userList = new
ArrayList<User>();

User
user = new
User();

user.setId(37);

user.setUsername("dddddd");

user.setPassword("dddddd");

user.setAge(14);

userList.add(user);

StructDescriptor
recDesc =

StructDescriptor.createDescriptor("USEROBJ",
conn);

ArrayList<STRUCT>
pstruct = new
ArrayList<STRUCT>();

for(User
u : userList){

Object[]
objs = new
Object[4];

objs[0]
= u.getId();

objs[1]
= u.getUsername();

objs[2]
= u.getAge();

objs[3]
= u.getPassword();

STRUCT
struct = new
STRUCT(recDesc, conn, objs);

pstruct.add(struct);

}

ArrayDescriptor
tabDesc =

ArrayDescriptor.createDescriptor("OBJ_ARRAY",
conn);

ARRAY
vArray = new
ARRAY(tabDesc, conn, pstruct.toArray());

cstmt
= conn.prepareCall("call
saveObjArray(?,?,?)");

cstmt.setArray(1,
vArray);

cstmt.registerOutParameter(2,
Types.INTEGER);

cstmt.registerOutParameter(3,
Types.VARCHAR);

cstmt.execute();

System.out.println(cstmt.getString(2));

System.out.println(cstmt.getString(3));

cstmt.close();

conn.close();

}catch(Exception
e){

e.printStackTrace();

}

个变量,然后通过JDBC的方式得到Connection,然后定义要传给存储过程的数组。

映射
Oracle端对象
AS OBJECT类型

首先通过StructDescriptor.createDescriptor("USEROBJ",conn)定义对象描述方式。

然后,把java
bean 的各个属性赋值给Object类型的数组,通过new
STRUCT(recDesc, conn, objs)方法,把java
bean按照对象描述方式描述成Oracle可以识别的对象。最后放到数组里。

映射
Oracle端数组
AS TABLE OF类型

通过ArrayDescriptor.createDescriptor("OBJ_ARRAY",conn)定义数组描述方式。

在通过new
ARRAY(tabDesc, conn,
pstruct.toArray()),把要传入的数组按批定的数组描述方式生成一个新的Oracle定义的数组。

调用存储过程,传入参数并执行。

数组做为参数传入Oracle存储过程操作数据库的更多相关文章

  1. 将C# dataTable 做为参数传入到存储过程

    1.list转换为DataTable(如果有需要) public static DataTable ListToDataTable<T>(List<T> entitys) { ...

  2. 写一个函数,将一个int型的数组做为参数传入,使用指针返回两个结果:最大值和最小值

    今日下午研究了一下c语言中的指针问题,c语言的核心是指针,指针的核心是地址,地址的核心是内存. #include <stdio.h> void hanshu(int *arry,int s ...

  3. java如何将一个List传入Oracle存储过程

    注:本文来源于  深圳gg  < java如何将一个List传入Oracle存储过程   > 一:数据库端建一个PL/SQL的数组. CREATE OR REPLACE TYPE tabl ...

  4. java怎样将一个List传入Oracle存储过程

    java怎样将一个List传入Oracle存储过程.样例例如以下: 数据库端建一个PL/SQL的数组. CREATE OR REPLACE TYPE tables_array AS VARRAY(10 ...

  5. C语言 数组做函数参数不传数组个数的遍历方法

    //数组做函数参数不传数组个数的遍历方法 #include<stdio.h> #include<stdlib.h> #include<string.h> void ...

  6. C语言 数组做函数参数退化为指针的技术推演

    //数组做函数参数退化为指针的技术推演 #include<stdio.h> #include<stdlib.h> #include<string.h> //一维数组 ...

  7. 【面试题003】c数组做为参数退化的问题,二维数组中的查找

    [面试题003]c数组做为参数退化的问题,二维数组中的查找  一,c数组做为参数退化的问题 1.c/c++没有记录数组的大小,因此用指针访问数组中的元素的时候,我们要确保没有超过数组的边界, 通过下面 ...

  8. java怎样将一组对象传入Oracle存储过程

    注:本文来源 <  java怎样将一组对象传入Oracle存储过程  > java怎样将一组对象传入Oracle存储过程 java怎样将一组对象传入Oracle存储过程.须要注意的是jar ...

  9. go语言基础之数组做函数参数是值拷贝

    1.数组做函数参数是值拷贝 示例: package main //必须有个main包 import "fmt" //数组做函数参数,它是值传递 //实参数组的每个元素给形参数组拷贝 ...

随机推荐

  1. Java笔记(四)……常量与变量

    常量 常量表示不会改变的数值. Java中常量的分类: 整数常量:所有整数 小数常量:所有小数 布尔型常量:较为特有,只有两个数值,true false 字符常量:将一个数字字母或者符号用单引号(' ...

  2. test-from

    title header1 hahhahjl header2 adfkljasd $$a^2$$ point 1 point 2 | table1 | table2 | | ---- | ---- | ...

  3. C语言结构

    一个进程在内存中的布局如图所示:        .text段(正文段)——保存程序所执行的程序二进制文件,CPU执行的机器指令部分:一个程序只有一个副本:只读,防止程序由于意外事故而修改自身指令. . ...

  4. 最常用的Java库一览

    本文由 ImportNew - 邢 敏 翻译自 programcreek.欢迎加入翻译小组.转载请见文末要求. 写在前面: 1) 本文列出的名单是根据我自己的调查,并结合个人的经验.有可能是它们不恰恰 ...

  5. smarty对网页性能的影响--开启opcache

    在上一篇<smarty对网页性能的影响>中,默认没有开启opcache,于是我安装了一下zend opcache扩展,重新实验了一下,结果如下: 有smarty 用apache的ab命令进 ...

  6. linux系统磁盘分区之parted

    对于linux的分区通常可以使用fdisk命令工具和parted工具 对于分区表通常有MBR分区表和GPT分区表 对于磁盘大小小于2T的磁盘,我们可以使用fdisk和parted命令工具进行分区 对于 ...

  7. 3 分钟学会调用 Apache Spark MLlib KMeans

    Apache Spark MLlib是Apache Spark体系中重要的一块拼图:提供了机器学习的模块.只是,眼下对此网上介绍的文章不是非常多.拿KMeans来说,网上有些文章提供了一些演示样例程序 ...

  8. InnoTop

    是一个系统活动报告,类似于Linux性能工具,它与Linux的top命令相仿,并参考mytop工具而设计. 它专门用后监控InnoDB性能和MySQL服务器.主要用于监控事务,死锁,外键,查询活动,复 ...

  9. Top 10 Questions about Java Exceptions--reference

    reference from:http://www.programcreek.com/2013/10/top-10-questions-about-java-exceptions/ This arti ...

  10. web服务器决定支持多少人同时在线的因素

    经常遇到一些做WEB用户咨询服务器支持在线人数问题,在此做个简单介绍.非技术性讨论,如有疏漏或错误,敬请原谅和指导.以普通单路服务器为例,CPU处理多个进程,并非是同一时刻处理的,(可以精确到1/10 ...