Oracle_学習開発サブルーチン_複合データ型3(一括バインド)

5048 ワード

一括バインドはoracle 9 iの新たな追加特性であり、単一のSQL操作を実行することですべての集合要素のデータを伝達することができ、一括バインドによってデータ処理速度を極めて速め、アプリケーションの性能を高めることができる.一括バインドはbulk collect句とforall文法で完成し、他のbulk collect句は一括データを取得するために使用され、この句はselect文、fetch文、DML戻り句にしか使用できない.一方、forall文はバッチのDML操作にのみ適用されます.
一、forall文
PL/SQLアプリケーションで一括insert、update、delete操作を実行する場合はforall文を使用します.oracle 9 iの前にforall文を使用する場合は連続する要素が必要ですが、oracle 9 iからは新しいindices of句とvalues of句を使用することで、不連続な集合要素を使用できます.for文は循環文であり、forallは循環文ではなくoracle 10 gから開始できます.forall文には、以下に示す3つの実行方法があります.
1、文法一:
   forall  index  in lower_bound..upper_bound
       sql_statement;
上記のようにindexは、定義された整数変数(集合要素として参照される)を暗黙的に含んでいる.lower_boundとupper_boundはそれぞれ集合要素の上,下界である.
2、文法2:
   forall index in indies of collection
     [between lower_bound and upper_bound]
上記のようにindices of句は、対応するcollection集合要素の下付き文字のみを取得するindex値を指定するために使用されます.
3、文法3:
forall index in values of index_collection
    sql_statement;
上記のように、values of句は、集合変数indexからindex値を指定するために使用されます.collectionで取得します.注意Oracle 9 iでは、最初の方法しか使用できません.以下に例を示します.
(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句はoracle 10 gが新たに追加した特徴であり、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;

3、fetch into文は後で説明する