Oracle 批量插入记录
2008-08-18 00:06
113 查看
这里使用了PL/SQL的联合数组.
我要将一组用'_'分隔的记录插入数据库,当然,这样做只是为了方便从java调用存储过程进行批量插入.
先定义数组类型和一个工具函数(用来分解字符串):
1 CREATE OR REPLACE PACKAGE qtone IS
2 TYPE SUBSTR_ARRAY IS TABLE OF VARCHAR2(100 CHAR) INDEX BY BINARY_INTEGER;
3 END;
4
5 create or replace FUNCTION split_str(str in varchar2, delimiter in varchar2) RETURN qtone.SUBSTR_ARRAY is
6 src_str varchar2(300 char) := '';
7 prev_index integer := 1;
8 next_index integer := 1;
9
10 retval qtone.substr_array ;
11 cnt INTEGER := 1;
12 BEGIN
13 --去掉开头和结束的分隔符
14 src_str := trim(both delimiter from str);
15 while next_index != 0 loop
16 next_index := instr(src_str,delimiter,prev_index,1);
17
18 if(next_index = 0) then
19 retval(cnt) := substr(src_str,prev_index);
20 cnt := cnt + 1;
21 else
22 retval(cnt) := substr(src_str,prev_index,next_index - prev_index);
23 cnt := cnt + 1;
24 end if;
25
26 prev_index := next_index + 1;
27 end loop;
28
29 RETURN retval;
30 end;
然后,做个简单测试:
1 CREATE TABLE test(
2 name VARCHAR2(20 char),
3 address VARCHAR2(50 char)
4 );
5
6 DECLARE
7 names VARCHAR2(100 char) := 'ungshow_sweet_ting';
8 addrs VARCHAR2(100 char) := 'GuangDong_ZheJiang_HuBei';
9
10 addr_array qtone.SUBSTR_ARRAY;
11 name_array qtone.SUBSTR_ARRAY;
12
13 stmt VARCHAR2(100 char) := '';
14 BEGIN
15 name_array := split_str(names,'_');
16 addr_array := split_str(addrs,'_');
17
18 stmt := 'insert into test(name,address) values(:name,:addr)';
19 IF(name_array.COUNT <> 0 AND name_array.COUNT = addr_array.COUNT ) THEN
20 FOR i IN name_array.first..name_array.last LOOP
21 EXECUTE IMMEDIATE stmt USING name_array(i),addr_array(i);
22 END LOOP ;
23
24 commit;
25 END IF ;
26 END ;
我要将一组用'_'分隔的记录插入数据库,当然,这样做只是为了方便从java调用存储过程进行批量插入.
先定义数组类型和一个工具函数(用来分解字符串):
1 CREATE OR REPLACE PACKAGE qtone IS
2 TYPE SUBSTR_ARRAY IS TABLE OF VARCHAR2(100 CHAR) INDEX BY BINARY_INTEGER;
3 END;
4
5 create or replace FUNCTION split_str(str in varchar2, delimiter in varchar2) RETURN qtone.SUBSTR_ARRAY is
6 src_str varchar2(300 char) := '';
7 prev_index integer := 1;
8 next_index integer := 1;
9
10 retval qtone.substr_array ;
11 cnt INTEGER := 1;
12 BEGIN
13 --去掉开头和结束的分隔符
14 src_str := trim(both delimiter from str);
15 while next_index != 0 loop
16 next_index := instr(src_str,delimiter,prev_index,1);
17
18 if(next_index = 0) then
19 retval(cnt) := substr(src_str,prev_index);
20 cnt := cnt + 1;
21 else
22 retval(cnt) := substr(src_str,prev_index,next_index - prev_index);
23 cnt := cnt + 1;
24 end if;
25
26 prev_index := next_index + 1;
27 end loop;
28
29 RETURN retval;
30 end;
然后,做个简单测试:
1 CREATE TABLE test(
2 name VARCHAR2(20 char),
3 address VARCHAR2(50 char)
4 );
5
6 DECLARE
7 names VARCHAR2(100 char) := 'ungshow_sweet_ting';
8 addrs VARCHAR2(100 char) := 'GuangDong_ZheJiang_HuBei';
9
10 addr_array qtone.SUBSTR_ARRAY;
11 name_array qtone.SUBSTR_ARRAY;
12
13 stmt VARCHAR2(100 char) := '';
14 BEGIN
15 name_array := split_str(names,'_');
16 addr_array := split_str(addrs,'_');
17
18 stmt := 'insert into test(name,address) values(:name,:addr)';
19 IF(name_array.COUNT <> 0 AND name_array.COUNT = addr_array.COUNT ) THEN
20 FOR i IN name_array.first..name_array.last LOOP
21 EXECUTE IMMEDIATE stmt USING name_array(i),addr_array(i);
22 END LOOP ;
23
24 commit;
25 END IF ;
26 END ;
相关文章推荐
- oracle多行记录与批量插入
- mybatis实现oracle批量插入,带序列(记录一下)
- Oracle:用一条 INSERT 语句批量插入多条记录
- mybatis实现oracle批量插入,带序列(记录一下)
- oracle jdbc 邪恶数字"65536" ---批量插入10万条记录引发的“血案”
- 记录一下C#+Oracle批量插入的一个方法
- oracle insert 批量插入数据,跳过已存在记录
- mybatis实现oracle批量插入,带序列(记录一下)
- 插入记录、批量删表、清理temp
- oracle ODP.NET 批量插入或更新
- mysql 控制每次批量插入5w条记录思路
- oracle批量插入数据
- Mybatis3中对oracle的批量插入
- Mybatis 批量插入带oracle序列 例子
- Oracle中以insert values的形式同时插入多条记录
- oracle 快速批量插入复杂数据的内容
- oracle ODP.NET 批量插入或更新
- 【解决方法】Oracle一次插入多条记录
- 点评 ibatis+oracle 批量插入的三种方法.
- oracle 批量改表名/插入记录