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

ORACLE批量绑定FORALL与BULK COLLECT

阅读更多
   FORALL与BULK COLLECT的使用方法:
1.使用FORALL比FOR效率高,因为前者只切换一次上下文,而后者将是在循环次数一样多个上下文间切换。

2.使用BLUK COLLECT一次取出一个数据集合,比用游标条取数据效率高,尤其是在网络不大好的情况下。但BLUK COLLECT需要大量内存。

例子:
create table test_forall ( user_id number(10), user_name varchar2(20));

select into 中使用bulk collect
DECLARE
  TYPE table_forall IS TABLE OF test_forall%ROWTYPE;
  v_table table_forall;
BEGIN
    SELECT mub.user_id,mub.user_name
         BULK COLLECT INTO v_table
    FROM mag_user_basic mub
         WHERE mub.user_id BETWEEN 10000 AND 10100;
    FORALL idx IN 1..v_table.COUNT
           INSERT INTO test_forall VALUES v_table(idx);
           --VALUES(v_table(idx).user_id,v_table(idx).user_name);Error
           --在PL/SQL中,BULK In-BIND与RECORD,%ROWTYPE是不能在一块使用的,
           --也就是说,BULK In-BIND只能与简单类型的数组一块使用
    COMMIT;

EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;
  
END;

fetch into 中使用bulk collect
DECLARE
  TYPE table_forall IS TABLE OF test_forall%ROWTYPE;
  v_table table_forall;   
  
  CURSOR c1 IS
    SELECT mub.user_id,mub.user_name
         FROM mag_user_basic mub
           WHERE mub.user_id BETWEEN 10000 AND 10100;
BEGIN
   OPEN c1;
   --在fetch into中使用bulk collect
   FETCH c1 BULK COLLECT INTO v_table;
   
   FORALL idx IN 1..v_table.COUNT
         INSERT INTO test_forall VALUES v_table(idx);
    COMMIT;

EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;
END;

在returning into中使用bulk collect
CREATE TABLE test_forall2 AS SELECT * FROM test_forall;
----在returning into中使用bulk collect
DECLARE
   TYPE IdList IS TABLE OF test_forall.User_Id%TYPE;
   enums IdList;
   TYPE NameList IS TABLE OF test_forall.user_name%TYPE;
   names NameList;
BEGIN
   DELETE FROM test_forall2 WHERE user_id = 10100
        RETURNING user_id, user_name BULK COLLECT INTO enums, names;
   dbms_output.put_line('Deleted ' || SQL%ROWCOUNT || ' rows:');
   FOR i IN enums.FIRST .. enums.LAST
   LOOP
     dbms_output.put_line('User #' || enums(i) || ': ' || names(i));
   END LOOP;
   COMMIT;
   
EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;
       
END;

批量更新中,将for改成forall
DECLARE 
    TYPE NumList IS VARRAY(20) OF NUMBER;                                                
    depts NumList := NumList(10, 30, 70, ...);
 -- department numbers                    
     BEGIN        
     ...           
       FOR i IN depts.FIRST..depts.LAST
       LOOP
       ...
       --UPDATE statement is sent to the SQL engine 
       -- with each iteration of the FOR loop!
         UPDATE emp SET sal = sal * 1.10 WHERE deptno = depts(i);
      END LOOP: 
    END;          

--UPDATE statement is sent to the SQL engine just once, with the entire nested table
FORALL i IN depts.FIRST..depts.LAST 
  UPDATE emp SET sal = sal * 1.10 WHERE deptno = depts(i); 

To maximize performance, rewrite your programs as follows:
a. If an INSERT, UPDATE, or DELETE statement executes inside a loop and References collection elements, move it into a FORALL statement.
b. If a SELECT INTO, FETCH INTO, or RETURNING INTO clause references a
Collection, incorporate the BULK COLLECT clause.
c. If possible, use host arrays to pass collections back and forth between your Programs and the database server.
d. If the failure of a DML operation on a particular row is not a serious problem,Include the keywords SAVE EXCEPTIONS in the FORALL statement and report Or clean up the errors in a subsequent loop using the %BULK_EXCEPTIONS Attribute.
分享到:
评论

相关推荐

    oracle下巧用bulk collect实现cursor批量fetch的sql语句

    2. 结合FORALL进行DML操作:如果需要对批量数据执行INSERT、UPDATE或DELETE操作,可以使用FORALL语句,它允许在单个事务中对集合内的所有行执行相同的操作,进一步提升效率。 3. 注意绑定变量的使用:在构建查询时,...

    forall 用法小结

    其中,`FORALL`语句作为Oracle PL/SQL的一个强大特性,提供了批量绑定和批量收集的能力,能够显著提升处理大量数据时的效率。本文将深入探讨`FORALL`的使用方法及其背后的原理,帮助开发者更好地理解和应用这一功能...

    Oracle Bulk Binds技术分析.pdf

    输入绑定则使用`FORALL`关键字,它指示PL/SQL引擎在发送SQL语句给SQL引擎执行前先进行批量绑定。这样,对于一组操作,只需要一次上下文切换,提高了执行速度。例如: ```sql FORALL i IN index_range INSERT INTO ...

    批量插入数据到Oracle数据库Demo

    3. **FORALL**:在收集了大量数据后,可以使用FORALL语句一次性将它们插入到数据库中,避免了循环中的单次插入,提高了性能。 4. **绑定变量**:在Oracle中,绑定变量可以用来提高查询性能,减少解析次数。在批量...

    for all 用法小结

    `FORALL` 是 Oracle PL/SQL 中的一个强大特性,主要用于批量处理数据,如批量插入、更新或删除等操作。使用 `FORALL` 可以显著提升数据库应用程序的性能,尤其是在处理大量数据时。 #### 二、FORALL 语法及特点 `...

    oracle性能

    `FORALL`与`BULK COLLECT`是PL/SQL中的两个关键字,它们一起用于在存储过程或函数中执行批量DML操作,如INSERT、UPDATE或DELETE。这种方式可以减少网络往返次数,大大提高执行效率。 2. **存储过程(Stored ...

    JAVA 与 Sql学习笔记

    【JAVA与Sql学习笔记】 ...总之,学习并熟练掌握FORALL、批绑定、BULK COLLECT等特性,对于Java程序员在处理大量数据时能更高效地与Oracle数据库进行交互,同时了解SQL优化策略也是提升数据库应用性能的关键。

    oracle 优化笔记

    "Oracle优化笔记"可能涵盖了如何有效地优化SQL查询,特别是针对where条件的编写技巧,以及如何利用FORALL和BULK COLLECT等特性来提升性能。下面我们将详细探讨这些关键知识点。 1. **SQL优化基础**: SQL优化的...

    ORACLE数据库中插入大字段数据的解决方法

    - 使用`FORALL`语句与`BULK COLLECT`配合,可以避免循环中每次的DML操作,降低开销。 3. **绑定变量**: 当插入大量相似数据时,使用绑定变量能有效防止SQL语句硬解析,提高执行效率。例如,使用PL/SQL匿名块,将...

    Oracle查询优化改写-技巧与案例

    书中的改写技巧可能涉及到如何将游标改写为集合操作,或者使用 bulk collect 和 for all 语句提高效率。 8. **存储过程和函数优化**:优化存储过程和函数,包括减少调用次数,使用绑定变量,以及避免在过程中进行大...

    Oracle批量插入数据的三种方式【推荐】

    在实际应用中,为了进一步提高性能,可以结合Oracle的`BULK COLLECT`和`FORALL`语句,以及使用绑定变量来处理大量数据。此外,对于超大规模的数据导入,可以考虑使用`SQL*Loader`工具,它能快速高效地从外部文件导入...

    update语句的优化-oracle

    对于大量相似的更新操作,可以考虑使用BULK COLLECT和FORALL语句进行批量处理,以减少网络和数据库调用的开销: ```sql DECLARE TYPE col_table IS TABLE OF table_name.column_name%TYPE INDEX BY PLS_INTEGER; ...

    Oracle官方SQL帮助手册

    手册还会讲解如何使用WHERE子句来指定操作条件,以及如何使用BULK COLLECT和FORALL语句进行批量操作。 3. 数据定义:SQL允许创建、修改和删除数据库对象,如表、视图、索引、存储过程、函数和触发器。手册会详细...

    Oracle表字段更新存储过程效率优化思路

    可以尝试批量更新,如使用BULK COLLECT INTO和FORALL语句。 4. **避免冗余计算**:在存储过程中,避免在循环中进行重复的计算或查询。可以将这些计算结果先保存在变量中,减少数据库交互次数。 5. **使用绑定变量*...

    Oracle通解API

    2. 数据操纵:INSERT、UPDATE和DELETE语句用于插入、修改和删除数据,以及如何使用BULK COLLECT和FORALL进行批量操作。 3. 数据定义:CREATE、ALTER和DROP命令用于创建、修改和删除表、视图、索引、用户和角色等...

    Oracle性能优化

    9. **批量操作**:使用BULK COLLECT和FORALL语句进行批量插入、更新或删除,减少数据库调用次数。 10. **适时使用 hint**:在必要时使用提示(hint)来指导Oracle的优化器生成更优的执行计划。 综上所述,Oracle...

    OracleSQL.zip_oracle

    Oracle SQL扩展了标准SQL,提供了诸如BULK COLLECT和FORALL等高级特性,以提高批量操作的效率。 3. **DDL(Data Definition Language)**:用于定义数据库结构,如创建、修改和删除表、视图、索引、存储过程等。...

    Oracle 12c PL SQL程序设计终极指南

    3. **集合操作**:Oracle 12c引入了新的集合处理特性,如Bulk Collect和For All。这使得在处理大量数据时,能够显著提高性能。 4. **游标**:游标用于逐行处理查询结果,是PL/SQL中处理动态数据的关键工具。你可以...

    Oracle 查询优化,个人练习

    批量处理可以提高性能,例如使用BULK COLLECT和FORALL语句。 6. **绑定变量**:使用绑定变量可以提高重用执行计划的效率,避免因参数化不佳导致的硬解析。 7. **查询重写**:通过数据库的查询重写功能,可以将复杂...

    Oracle_SQL学习笔记

    - **FORALL循环**: FORALL语句用于执行批量更新、插入或删除操作。 - 示例: `FORALL i IN 1..x.COUNT INSERT INTO t VALUES (x(i));` - **BULK COLLECT**: BULK COLLECT用于收集多个结果到集合中。 - 示例: `...

Global site tag (gtag.js) - Google Analytics