`
q272156430
  • 浏览: 275787 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

oracle 复合数据类型(批量绑定)

阅读更多

批量绑定是oracle9i新增加特性,是指执行单次SQL操作能传递所有集合元素的数据,通过批量绑定可以极大的加快数据处理速度,提高应用程序的性能,批量绑定是使用bulk collect子句和forall语法完成,其他bulk  collect子句用于取得批量数据,该子句只能用于select语句、fetch语句和DML返回子句,而forall语句只适用于批发批量的DML操作。
一、forall语句
当要在PL/SQL应用程序中执行批量insert、update、delete操作时,可以使用forall语句,在oracle9i之前,当使用forall语句时,必须具有连续的元素,而从oracle9i开始,通过使用新增的indices of子句和values of子句,可以使用不连续的集合元素,注意for语句是循环语句,而forall可不是循环语句,从oracle10g开始,forall语句有是三种执行方法,如下所示;
1、语法一:
   forall  index  in lower_bound..upper_bound
       sql_statement;
如上所示:index是隐含定义的整数变量(将作为集合元素下标被引用);lower_bound和upper_bound分别是集合元素的上、下界。
2、语法二:
   forall index in indies of collection
     [between lower_bound and upper_bound]
如上所示:indices of子句用于指定只取得对应中的collection集合元素下标的index值。
3、语法三:
forall index in values of index_collection
    sql_statement;
如上所示:其中values of子句用于指定index值从集合变量index_collection中取得,注意Oracle9i只能使用第一种方法,以下通过示例说明:
(1)、在insert语句上使用批量绑定
   当使用批量绑定为数据库表插入数据时,首先需要给集合元素赋值,然后使用forall语句执行批量绑定插入操作,示例如下:

 

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


(2)、在update语句上使用批量绑定
   当使用批量绑定为更新数据时,首先需要给集合元素赋值,然后使用forall语句执行批量绑定修改操作,示例如下:

declare
 type id_table_type is table of number(6) index by binary_integer;
 type name_table_type is table of varchar2(10) index by binary_integer;
 id_table id_table_type;
 name_table name_table_type;
begin
for i in 1..10 loop
id_table(i):=i;
name_table(i):='yanglin'|| to_char(i);
end loop;
forall i in 1..id_table.count
update demo set name=name_table(i) where id=id_table(i);
end;


(3)、在delete语句上使用批量绑定
   当使用批量绑定删除数据时,首先需要给集合元素赋值,然后使用forall语句执行批量绑定删除操作,示例如下:

declare
 type id_table_type is table of number(6) index by binary_integer;
 id_table id_table_type;
begin
for i in 1..10 loop
id_table(i):=i;
end loop;
forall i in 1..id_table.count
delete from  demo where id=id_table(i);
end;


(4)、在forall语句上使用部分集合元素
   当使用forall语句进行批量操作时,即可以使用集合的所有元素,也可以使用集合的部分元素,示例如下:

declare
 type id_table_type is table of number(6) index by binary_integer;
 id_table id_table_type;
begin
for i in 11..20 loop
id_table(i):=i;
end loop;
forall i in 15..20
delete from  demo where id=id_table(i);
end;


(4)、在forall语句上使用indices of子句
   indices of子句是oracle10g新增加的特征,该子句用于跳转null集合元素,示例如下:

declare
 type id_table_type is table of number(6);
 id_table id_table_type;
begin
id_table:=id_table_type(11,null,12,null,13,null);
forall i in indices of id_table
delete from  demo where id=id_table(i);
end;


二、bulk collect子句
bulk collect用于取得批量数据,它只适用于select into语句、fetch into语句和DML返回子句,通过使用该子句可以将批量数据存放到PL/SQL集合变量中,其语法如下:
... bulk collect into collection_name[,collection_name].....
如上所示:collection_name用于指定集合变量名
1、在select into语句使用bulk collect语句,示例如下:

declare
 type temp_table_type is table of cip_temps%rowtype index by binary_integer;
 temp_table temp_table_type;
begin
select * bulk collect into temp_table from cip_temps where id=10;
for i in 1..temp_table.count loop
dbms_output.put_line(temp_table(i).name ||':'|| temp_table(i).address||':'||temp_table(i).age);
end loop;
end;


2、在DML返回子句中使用bulk collect语句,示例如下:
   执行DML操作时会改变数据库数据,为了取得DML操作所改变的数据,可以使用returning子句,为了取得DML所作用的多行数据,需要使用bulk collect子句,示例如下:

declare   
 type temp_table_type is table of cip_temps%rowtype index by binary_integer;   
 temp_table temp_table_type;   
begin   
delete from cip_temps where id=1  
returning name,age,address,id bulk collect into temp_table;   
dbms_output.put_line('信息'|| temp_table.count);   
for i in 1..temp_table.count loop   
dbms_output.put_line(temp_table(i).name ||':'|| temp_table(i).age||':'||temp_table(i).address||':'||temp_table(i).id);   
end loop;   
end;  
 
分享到:
评论

相关推荐

    Oracle PL/SQL编程及最佳实践

    为了提高程序的性能和可读性,需要遵守一定的最佳实践,例如使用合适的数据类型、避免使用 global 变量等。 九、PL/SQL 数据类型 PL/SQL 提供了多种数据类型,例如数字、字符、日期等。数字类型包括整数、浮点数等...

    Effective Oracle By Design

    书中详细讨论了何时使用B树索引、位图索引、函数索引以及复合索引,以及如何根据数据分布和查询模式来选择最合适的索引类型。 2. **表分区**:当处理大规模数据时,表分区能显著提高查询性能。书中介绍了范围分区、...

    Oracle PL SQL语言基础 详细 好用

    PL/SQL支持多种数据类型,包括数值型(如NUMBER)、字符型(如VARCHAR2、CHAR)、日期型(DATE)、布尔型(BOOLEAN)以及复合和记录类型。变量可以在声明部分声明,并在执行部分赋值和使用。 **控制流程语句** PL/...

    oracle-sql(两本pdf)

    2. 分区和分片:介绍Oracle中的高级特性,如范围分区、列表分区、哈希分区和复合分区,以及数据分片的策略。 3. 存储优化:讨论索引的类型(B树、位图、函数索引)和创建,以及如何通过分析和统计优化查询性能。 4. ...

    Oracle9i 数据库性能优化

    - **并行度设置**:适当增加并行度可以有效提高数据加载和批量处理的速度。 ##### 2.3 SQL 语句优化 - **避免全表扫描**:通过建立合适的索引来减少数据访问量。 - **减少排序操作**:尽可能使用索引而不是排序来...

    ORACLE存储过程性能优化技巧

    9. **使用合适的数据类型**:根据实际需求选择最小的数据类型,减少存储空间,提升处理速度。 10. **减少事务大小**:大事务可能导致长时间锁定资源,影响并发性能。尽量将大事务分解为小事务,降低锁的竞争。 11....

    oracle(9i)pl_sql+oracle(11g)pl_sql参考手册

    3. **数据类型**:介绍Oracle支持的内置数据类型,如NUMBER、VARCHAR2、DATE等。 4. **运算符和表达式**:包括算术、比较和逻辑运算符,以及如何构建复杂的表达式。 5. **流程控制语句**:如IF-THEN-ELSIF、CASE、...

    高级oracle-plsql-培训资料

    接下来,我们探讨高级数据类型,如复合类型(记录和表类型)、嵌套表和关联数组。这些数据类型允许我们处理复杂的数据结构,例如存储多个行或列的数据,增强程序的灵活性。 PL/SQL中的游标用于逐行处理查询结果,...

    精通Oracle.10g.PLSQL编程

    使用复合数据类型 8.1 PL/SQL记录 8.1.1 定义PL/SQL记录 8.1.2 使用PL/SQL记录 8.2 PL/SQL集合 8.2.1 索引表 8.2.2 嵌套表 8.2.3 变长数组(VARRAY) 8.2.4 PL/SQL记录表...

    oracle pl/sql

    - 通过绑定变量、索引、物化视图、存储过程和批量操作等技术可以优化PL/SQL代码的执行效率。 14. **错误处理和日志记录** - 错误处理不仅限于异常处理,还包括RAISE语句手动抛出错误,以及使用DBMS_OUTPUT记录...

    Oracle的PL-SQL编程手册

    PL-SQL支持多种数据类型,包括数值类型(如NUMBER、INTEGER)、字符类型(VARCHAR2、CHAR)、日期时间类型(DATE)、布尔类型(BOOLEAN)以及复合和记录类型。变量可以在声明部分定义,然后在执行部分进行操作。 三...

    Oracle 8i PL_SQL高级程序设计

    2. **PL/SQL数据类型**:学习Oracle支持的各种内置数据类型,如数值类型(NUMBER、INTEGER)、字符类型(VARCHAR2、CHAR)、日期时间类型(DATE)、布尔类型(BOOLEAN)以及复合类型(记录和数组)。 3. **变量声明...

    oracle技巧部分

    3. **批处理操作**:批量插入、更新和删除数据,减少网络传输和数据库交互次数。 4. **Oracle存储过程**:编写和调用存储过程,实现复杂的业务逻辑,提高执行效率。 三、Oracle高级特性 1. **物化视图**:创建...

    ORACLE+SQL性能优化系列

    - 全表扫描(Full Table Scan, FTS): 当Oracle进行全表扫描时,它不会按单个数据块读取,而是以批量方式一次性读取多个数据块,从而提高效率。这种方式适用于表较小或没有合适索引的情况。 - 通过ROWID访问: ...

    Oracle.PL.SQL程序设计 第五版 下册

    1. **PL/SQL基础**:包括变量声明、数据类型、常量、条件语句(IF-THEN-ELSIF)、循环结构(WHILE, FOR, LOOP),以及异常处理(BEGIN-EXCEPTION-END块)。 2. **PL/SQL过程和函数**:详细介绍了如何创建和调用存储...

    Oracle存储过程

    - 定义:使用`CREATE [OR REPLACE] PROCEDURE`语句创建,指定过程名、参数(可选)、参数模式(IN, OUT, IN OUT)和数据类型。例如: ```sql CREATE OR REPLACE PROCEDURE USP_Learning( p_para1 VARCHAR2 := '...

    ORACLE SQL编程技巧.doc

    7. **批次插入大量数据**:批量插入数据比单条插入更有效率。使用BULK COLLECT INTO和FORALL语句来提升插入性能。 **二、SQL的使用** 1. **show和set命令**:在SQL*Plus中,show命令用于显示当前设置,set命令用于...

    ORACLE SQL性能調整

    38. **避免改变索引列的类型**:更改索引列的数据类型可能导致索引失效。 39. **需要当心的WHERE子句**:避免在WHERE子句中使用可能导致全表扫描的表达式。 40. **连接多个扫描**:理解并优化JOIN操作,减少全表...

    Oracle数据库中SQL语句优化.pdf

    在Oracle中,应合理创建和使用B树索引、位图索引、函数索引等,以适应不同类型的查询需求。避免在频繁更新的列上创建索引,因为这会增加写操作的开销。同时,考虑使用复合索引,以提高多条件查询的效率。 二、查询...

    Oracle SQL优化规则.zip

    复合索引可以针对多列查询进行优化,但需注意索引维护的额外成本。 2. **避免全表扫描**:尽量避免在SQL语句中使用“*”来获取所有列,这会导致全表扫描。明确指定需要的列可以减少I/O操作,提高查询效率。 3. **...

Global site tag (gtag.js) - Google Analytics