Oracle 存储过程传入二维数组
使用Oracle数组,打算传入一个二维数组到数据库中,然后利用存储过程将数据写入到数据
1、创建一个和目标表结构完全一样的TYPE,类型为object
CREATE OR REPLACE TYPE ID2 AS OBJECT(
ID NUMBER(10),
NUM NUMBER(10)
)
2、创建一个table类型的type
CREATE OR REPLACE TYPE id3 AS table OF id2
3、在存储过程中插入数据
create or replace procedure p_batch_insert3(ids in id3) is
begin
--对数组进行类型转变然后将数据插入到目标表中。
insert into a
(id, num)
select * from the (select cast(ids as id3) from dual);
end p_batch_insert3;
4、测试存储过程
CREATE OR REPLACE PROCEDURE sample is
ids id3 := new id3();
BEGIN
FOR i IN 1 .. 10 LOOP
ids.Extend();
ids(i) := id2(i,i);
dbms_output.put_line(''id--->'' || ids(i).id);
dbms_output.put_line(''num--->'' || ids(i).num);
END LOOP;
p_batch_insert3(ids);
END;
5、java程序如下:令我不解的是传入一维数组,能够将数据写入到数据库中,
在使用二维数组时,出现如下错误
java.sql.SQLException: 无法转换为内部表示: [I@9ed927
package com;
import java.sql.Connection;
import java.sql.PreparedStatement ;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.sql.rowset.*;
import oracle.sql.*;
import com.sun.rowset.CachedRowSetImpl;
public class Test2 {
public static void main(String arg[]) {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@192.168.6.185:1521:billing";
Connection con = DriverManager.getConnection(url, "flux",
"1231flux");
//con.setAutoCommit(false);
PreparedStatement pstmt = null;
String sql = "{call p_batch_insert3(?)}";
//String sql = "{call p_batch_insert2(?)}";
pstmt = con.prepareCall(sql);
//int[] x = new int[34465];
//int x[][] = new int[10][];
int x[][] = {{1,2},{4,5}};
/*for (int i = 0; i <= 34464; i++) {
x[i]=i;
}
*/
for(int i = 0; i < x.length; i++)
{
for(int j = 0; j < x[i].length; j++)
System.out.println("a1[" + i + "][" + j +"] = " + x[i][j]);
}
System.out.println("start-->" + System.currentTimeMillis());
oracle.sql.ArrayDescriptor desc = oracle.sql.ArrayDescriptor.createDescriptor("ID3",con);
oracle.sql.ARRAY array = new oracle.sql.ARRAY(desc,con,x);
// ArrayDescriptor descriptor =ArrayDescriptor.createDescriptor( "NUM_ARRAY", conn );
pstmt.setArray(1, array);
pstmt.executeUpdate();
//pstmt.executeBatch();
//con.commit();
//con.setAutoCommit(true);
System.out.println("end-->" + System.currentTimeMillis());
} catch (Exception e) {
e.printStackTrace();
//System.out.println(e.toString());
}
}
}
分享到:
相关推荐
ORACLE存储过程中定义数组并且判断某值是否在数组中。有例子可執行、 、有例子可執行、
java调用oracle输出参数为多行多列的结构化数组的存储过程,并将其遍历解析;该demo部署后,只需要配置poolman.xml数据源,即可运行;
NULL 博文链接:https://xiaogui9317170.iteye.com/blog/286401
最近在oracle 中用到拆分字符串返回数组,一直头痛,因为在 oracle 中没有类似java中有split 函数 ,所以要自己写。好不容搜到一个。那网上是到处都是这个代码。怎么找都是这个方法,我就用了。这个方法如下: ...
今天做了一个关于短消息批量删除的功能, ... 所以就决定用 数组作为存储过程的参数进行传值,在存储过程中批量删除。说实话这个选择有点得不偿失,本来以为上午就能搞定,谁知道从摸索到实现,居然发了大半天时间。
ORACLE数组使用方法,文档,详细介绍Oracle中数组如何使用
C# 传入自定义列表List 到Oracle存储过程 亲测有效,执行速度极快
C#中调用oracle存储过程返回数据集
oracle 存储过程导出excel oracle 存储过程导出excel oracle 存储过程导出excel oracle 存储过程导出excel oracle 存储过程导出excel
oracle 存储过程实例 oracle存储过程实例
本文实例讲述了Python使用cx_Oracle调用Oracle存储过程的方法。分享给大家供大家参考,具体如下: 这里主要测试在Python中通过cx_Oracle调用PL/SQL。 首先,在数据库端创建简单的存储过程。 create or replace ...
oracle 存储过程 unwrap 图形解密 工具
帆软报表调用Oracle存储过程如果存储过程定义中没有参数,但是设计器中缺弹出一个storeParameter1参数的解决插件
oracle存储过程笔记oracle存储过程笔记oracle存储过程笔记oracle存储过程笔记oracle存储过程笔记oracle存储过程笔记oracle存储过程笔记oracle存储过程笔记oracle存储过程笔记oracle存储过程笔记
oracle存储过程中入参是逗号分隔,并且参数要使用在in过滤语句中查询数据。处理的方法与实现
ibatis调用oracle存储过程分页
oracle 存储过程批量提交
oracle存储过程学习经典入门 非常好的 初学者必看
可以将SQL Server存储过程转为oracle存储过程的工具
vba 调用oracle 存储过程vba 调用oracle 存储过程vba 调用oracle 存储过程vba 调用oracle 存储过程vba 调用oracle 存储过程