zoukankan      html  css  js  c++  java
  • 转:Oracle 10g批量绑定forall bulk collect

    批量绑定可以通过减少在PL/SQLSQL引擎之间的上下文切换(context switches )以此提高性能。

    批量绑定(Bulk binds)主要包括:

    (1) Input collections, use the FORALL statement
    ,用来改善DMLINSERTUPDATEDELETE) 操作的性能。

    (2) Output collections, use BULK COLLECT clause
    ,用来提高查询(SELECT)的性能。

    Oracle 10g
    开始forall语句可以使用三种方式:

    in low..up

    in indices of collection 取得集合元素下标的值。

    in values of collection 取得集合元素的值。

    forall
    语句还可以使用部分集合元素。

    sql%bulk_rowcount(i)
    表示forall语句第i元素所作用的行数。


    --drop table blktest;
    --CREATE TABLE blktest (num NUMBER(20), name varchar2(50
    ));
    --CREATE OR REPLACE PROCEDURE p_bulktest
     IS
    DECLARE
    TYPE type_num IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
    TYPE type_name IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER;
    tab_num type_num;
    tab_name type_name;
    t1 NUMBER;
    t2 NUMBER;
    t3 NUMBER;

    BEGIN
    FOR i IN 1 .. 500000 LOOP
    tab_num(i) := i;
    tab_name(i) := 'name: ' || to_char(i);
    END LOOP;

    SELECT dbms_utility.get_time
       
    INTO t1
       
    FROM dual;

    FOR i IN 1 .. 500000 LOOP
    INSERT INTO blktest
          
    VALUES
    (tab_num(i), tab_name(i));
    END LOOP;

    SELECT
    dbms_utility.get_time
       
    INTO t2
       
    FROM dual;

    FORALL i IN 1 .. 500000
    INSERT INTO blktest
          
    VALUES
    (tab_num(i), tab_name(i));

    SELECT dbms_utility.get_time
       
    INTO t3
       
    FROM dual;

    dbms_output.put_line('Execution Time(S)');
    dbms_output.put_line
    ('-------------------');
    dbms_output.put_line('FOR loop: '
    || to_char((t2 - t1) / 100));
    dbms_output.put_line('FORALL:
      '
    || to_char((t3 - t2) / 100));

    END;
    /*
    Execution Time(S)
    -------------------
    FOR loop: 32.78
    FORALL:
      2.64
    */

    /*
    bulk collect
    语句:
    于取得批量数据,只适用于
    select into ,fetch into DML语句的返回子句
    DECLARE
    TYPE type_emp IS TABLE OF
    scott.emp%ROWTYPE INDEX BY BINARY_INTEGER;
    tab_emp type_emp;

    TYPE type_ename IS TABLE OF
    scott.emp.ename%TYPE INDEX BY BINARY_INTEGER;
    tab_ename type_ename;
    CURSOR c IS
    SE
    LECT *
    FROM scott.emp;
    BEGIN
    SELECT * BULK COLLECT
    INTO tab_emp
    FROM scott.emp;
    FOR i IN 1 .. tab_emp.COUNT LOOP
    dbms_output.put_line(tab_emp(i).ename);
    END LOOP;

    dbms_output.new_line;
    DELETE scott.emp RETURNING
    ename BULK COLLECT INTO tab_ename;
    FOR i
    IN 1 .. tab_emp.COUNT LOOP
    dbms_output.put_line(tab_emp(i).ename);
    END LOOP;
    ROLLBACK;

    OPEN c;
    FETCH c BULK COLLECT
    INTO tab_emp;
    dbms_output.new_line;
    FOR i IN 1 .. tab_emp.COUNT LOOP
    dbms_output.put_line(tab_emp(i).sal);
    END LOOP;

    END;
    */

    ============
    ==================


    批量输入FORALL+批量输出BULK

    DECLARE
    --
    批量输入FORALL+批量输出BULK
    TYPE type_num IS TABLE OF NUMBER;
    tab_1 type_num;
    tab_2 type_num;
    BEGIN
    tab_1 := type_num(1, 2, 3);
    FORALL i IN 1 .. tab_1.COUNT
    --EXECUTE IMMEDIATE 'update t2 set id2=id*2
    where id=
    :1 returning id2 into :2'
    --USING tab_1(i) RETURNING BULK COLLECT INTO tab_2;
    update t2 set id2=id*2 where id=tab_1(i)
    returning id2 bulk collect into tab_2;
    FOR i IN 1 .. tab_2.COUNT LOOP
    dbms_output.put_line(tab_2(i));
    END LOOP;
    END
    ;
    魔兽就是毒瘤,大家千万不要玩。
  • 相关阅读:
    DLL注入实践
    程序编译保护机制
    加密配置文件总结
    PCL点云配准(3)
    PCL点云分割(3)
    ubuntu Ros环境halcon的一个程序
    opencv2/nonfree/nonfree.hpp:没有那个文件或目录
    深度图像计算三维点云
    利用深度学习的点云语义分割(一)
    3D 特征点概述(2)
  • 原文地址:https://www.cnblogs.com/tracy/p/1712732.html
Copyright © 2011-2022 走看看