PLSQL批量绑定插入数据

简介:

1)记住批量绑定是什么 2)用什么完成的,各个工具之间都有什么方法及使用即可

批量绑定:执行单词SQL操作能传递所有集合元素的数据,使用forall,bulk_collect语句完成,

bulk_collect子句用于取得批量数据,只能用于select,fetch和dml返回字句中,

forall语句只试用于执行批量的dml执行,


好处:可以极大地提高数据处理速度,提高应用程序的性能,

demo示例:

create table demo (

    id number(6) primary key,name varchar2(10)

);

不使用批量绑定

declare
type id_table_type is table of number(6) index by binary_integer;
type name_table_type is table of varchar2(20) index by binary_integer;
id_table id_table_type;
name_table name_table_type;
start_time number(10);
end_time number(10);
begin
for i in 1..5000 loop
id_table(i):=i;
name_table(i):='Name'||to_char(i);
end loop;
start_time:=dbms_utility.get_time();
for i in 1..id_table.count loop
insert into demo values(id_table(i),name_table(i));

end loop;

end_time:=dbms_utility.get_time();
dbms_output.put_line('Alltime(s):'||to_char((end_time-start_time)/100));
end;

SQL> /
Alltime(s):.24
PL/SQL procedure successfully completed

使用批量绑定

declare
type id_table_type is table of number(6) index by binary_integer;
type name_table_type is table of varchar2(20) index by binary_integer;
id_table id_table_type;
name_table name_table_type;
start_time number(10);
end_time number(10);
begin
for i in 1..5000 loop
id_table(i):=i;
name_table(i):='Name'||to_char(i);
end loop;
start_time:=dbms_utility.get_time();
forall i in 1..id_table.count
insert into demo values(id_table(i),name_table(i));
end_time:=dbms_utility.get_time();
dbms_output.put_line('Alltime(s):'||to_char((end_time-start_time)/100));
end;

SQL> /
Alltime(s):.09
PL/SQL procedure successfully completed



forall有三种语法:

1)forall index in lower_bound..upper_bound

        sql_statement;

2)forall index in indices of collection  用于处理null值

        [between lower_bound.and. upper_bound]

        sql_statement;

3)forall index in values of index_collection 

        sql_statement;

该语句还有一个方法是取部分的下标,sql%bulk_rowcount属性用于取得在执行批量绑定操作时第i个元素所作用的行数,


bulk_collect子句用于取得批量数据,用于select into ,fetch into,dml子句。将批量数据放于pl/sql集合变量中。

1)select into中使用bulk_collect子句,select into只能返回一行数据,但是用bulk_collect却可以一次将select语句的多行结果检索到集合变量中,

declare

    type emp_table_type is table of emp%ROWTYPE index by binary_integer;

    emp_table emp_table_type;

    begin

    select * bulk_collect into emp_table from emp where deptno=&no;

    for i in 1..emp_table.count loop

    dbms_output.put_line('Employee name :'||emp_table(i).ename);

    end loop;

    end;

    /

2)dml返回字句中使用

declare
type emp_table_type is table of emp%ROWtype index by binary_integer;
emp_table emp_table_type;
begin

delete from emp where deptno=&no

returning ename bulk collect into ename_table;
for i in 1..emp_table.count loop
dbms_output.put_line(emp_table(i).ename);
end loop;
end;

/



本文转自 aklaus 51CTO博客,原文链接:http://blog.51cto.com/aklaus/1966342

相关文章
|
7月前
|
SQL Oracle 关系型数据库
SQL 的 with as 临时中间表
SQL 的 with as 临时中间表
124 1
|
7月前
|
SQL 数据库
SQL-修改表操作
SQL-修改表操作
|
SQL C# uml
C# SQL添加数据,删除数据,修改数据,查询数据
C# SQL添加数据,删除数据,修改数据,查询数据
221 0
C# SQL添加数据,删除数据,修改数据,查询数据
|
SQL 存储 大数据
【Sql Server】创建表模拟批量添加数据以及添加的方式
在实际项目场景中,需要快速模拟大批量数据进行查询测试 基于这个需求,模拟大数据方式有很多,这里简答的写几个中在数据库模拟大数据的方式
301 0
|
SQL BI 数据库
SQL Server通过创建临时表遍历更新数据
SQL Server通过创建临时表遍历更新数据
219 0
SQL Server通过创建临时表遍历更新数据
|
存储 SQL 数据库
DM8数据库批量创建表,插入数据,更改表信息,删除测试
在测试产品的功能和性能的时候需要大量数据表,我们可以通过**游标**和**存储过程**批量创建测试表,插入测试数据,更改测试表,删除测试表。
|
存储
基于存储过程实现批量复制表(Procedure)的方案实现
基于存储过程实现批量复制表(Procedure)的方案实现
616 0
|
SQL 测试技术
abap代码使用sql语句删除自定义表的1条数据
自定义表,指的是abap开发人员使用SE11创建的透明表。既然是自己创建的表,那么增删改查的时候,基本上很自由,至少可以随意使用sql语句对表的内容进行处理。那么,对于这种情况,如何删除数据呢?如下图,是表的内容,红框中的数据,是我们打算删除的内容:删除一条记录。
2141 0
|
SQL
SQL Server 表的管理_关于表的操作增删查改的操作的详解(案例代码)
原文:SQL Server 表的管理_关于表的操作增删查改的操作的详解(案例代码) SQL Server 表的管理_关于表的操作增删查改的操作的详解(案例代码) 概述: 表由行和列组成,每个表都必须有个表名。
1282 0
|
SQL 数据库 Go
使用sql语句创建修改SQL Server标识列(即自动增长列)
原文:使用sql语句创建修改SQL Server标识列(即自动增长列) 一、标识列的定义以及特点SQL Server中的标识列又称标识符列,习惯上又叫自增列。该种列具有以下三种特点:1、列的数据类型为不带小数的数值类型2、在进行插入(Insert)操作时,该列的值是由系统按一定规律生成,不允许空值3、列值不重复,具有标识表中每一行的作用,每个表只能有一个标识列。
2084 0