数组做为参数传入Oracle存储过程操作数据库
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 }
数组里存储的是String、int、lang等基本数据类型或引用数据类型(不包括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存储过程操作数据库的更多相关文章
- 将C# dataTable 做为参数传入到存储过程
1.list转换为DataTable(如果有需要) public static DataTable ListToDataTable<T>(List<T> entitys) { ...
- 写一个函数,将一个int型的数组做为参数传入,使用指针返回两个结果:最大值和最小值
今日下午研究了一下c语言中的指针问题,c语言的核心是指针,指针的核心是地址,地址的核心是内存. #include <stdio.h> void hanshu(int *arry,int s ...
- java如何将一个List传入Oracle存储过程
注:本文来源于 深圳gg < java如何将一个List传入Oracle存储过程 > 一:数据库端建一个PL/SQL的数组. CREATE OR REPLACE TYPE tabl ...
- java怎样将一个List传入Oracle存储过程
java怎样将一个List传入Oracle存储过程.样例例如以下: 数据库端建一个PL/SQL的数组. CREATE OR REPLACE TYPE tables_array AS VARRAY(10 ...
- C语言 数组做函数参数不传数组个数的遍历方法
//数组做函数参数不传数组个数的遍历方法 #include<stdio.h> #include<stdlib.h> #include<string.h> void ...
- C语言 数组做函数参数退化为指针的技术推演
//数组做函数参数退化为指针的技术推演 #include<stdio.h> #include<stdlib.h> #include<string.h> //一维数组 ...
- 【面试题003】c数组做为参数退化的问题,二维数组中的查找
[面试题003]c数组做为参数退化的问题,二维数组中的查找 一,c数组做为参数退化的问题 1.c/c++没有记录数组的大小,因此用指针访问数组中的元素的时候,我们要确保没有超过数组的边界, 通过下面 ...
- java怎样将一组对象传入Oracle存储过程
注:本文来源 < java怎样将一组对象传入Oracle存储过程 > java怎样将一组对象传入Oracle存储过程 java怎样将一组对象传入Oracle存储过程.须要注意的是jar ...
- go语言基础之数组做函数参数是值拷贝
1.数组做函数参数是值拷贝 示例: package main //必须有个main包 import "fmt" //数组做函数参数,它是值传递 //实参数组的每个元素给形参数组拷贝 ...
随机推荐
- sr4000自带API和opencv结合获取图像
/* * ===================================================================================== * * Filen ...
- chm 字体修改
今天打开从网络下载的“[MSDN]Csharp编程指南+参考手册.chm”文件,以为看看里面所提供的一些知识点,但是发现文件显示的字体觉得有点别扭,以为能够像网页那样ctrl键+鼠标滚轮就能进行字体的 ...
- 【HTML】Advanced2:Conditional Comments
1.try and figure out what is sensible for you to support. Are your web site visitors likely to be us ...
- java 小结2 多态问题和容器介绍
面向对象这个东西,其实我们一直是不是都没有感觉到自己在用,以后我一定要用用.以前学c#时候认真的看过一次,最近一直研究java.随便再看看. 多态问题: 在java中多态分为(1)编译时多态和(2)运 ...
- 小波变换和motion信号处理(三)(转)
这篇文章算太监了,去作者blog提问去吧:http://www.kunli.info/2012/04/08/fourier-wavelet-motion-signal-3/ 从前两篇发布到现在,过去一 ...
- freemaker分页模板
<link href="${base}/res/pra/css/style.css" rel="stylesheet" type="text/c ...
- 百度的TSDB——可针对tag查询,应该类似kairosDB
天工架构 目前,天工平台的服务主要由物接入.物解析.物管理.规则引擎和时序数据库组成,并可无缝对接百度云天算智能大数据平台及基础平台产品,可提供千万级设备接入的能力,百万数据点每秒的读写性能,超高的压 ...
- UOJ#191. 【集训队互测2016】Unknown
题意:维护一个数列,每个元素是个二维向量,每次可以在后面加一个元素或者删除一个元素.给定P(x,y),询问对于[l,r]区间内的元素$S_i$,$S_i \times P$的最大值是多少. 首先简单地 ...
- 修改Tomcat Connector运行模式,优化Tomcat运行性能
Tomcat是一个小型的轻量级应用服务器,也是JavaEE开发人员最常用的服务器之一.不过,许多开发人员不知道的是,Tomcat Connector(Tomcat连接器)有bio.nio.apr三种运 ...
- 微信中QQ表情的解析(php)
微信公众平台接受的消息中,标签是用'/:'开头的字符串表示的,假设要在网页上显示(比方制作微信大屏幕),就须要进行转换. 所以我向微信公众平台按顺序发送了各个QQ表情,在微信公众平台后台能够看到接受的 ...