SQL プロシージャーでの配列サポート
SQL プロシージャーは、配列タイプのパラメーターと変数をサポートします。 配列は、アプリケーションとストアード・プロシージャーの間で、または 2 つのストアード・プロシージャー間で一時的なデータの集合を受け渡すのに便利な方法です。
SQL ストアード・プロシージャーでは、配列は、標準的なプログラミング言語の配列として操作可能です。 また、配列として表されるデータを表に簡単に変換したり、表列内のデータを配列に集約したりするなど、配列はリレーショナル・モデルに統合されます。 次の例では、配列の操作方法をいくつか示しています。 どちらの例もコマンド行プロセッサー (CLP) スクリプトで、ステートメント終止符としてパーセント文字 (%) を使用しています。
例 1
この例には、sub と main の 2 つのプロシージャーが示されています。 プロシージャー main は、配列コンストラクターを使用して 6 つの整数からなる 1 つの配列を作成します。 このプロシージャーは、その後この配列をプロシージャー sum に渡します。プロシージャー sum は、入力配列内のすべての要素の合計を計算し、その結果をプロシージャー main に戻します。 プロシージャー sum は、配列の副指標の使用法、および CARDINALITY 関数の使用法の例を示しています。この関数は、配列内の要素数を戻します。
create type intArray as integer array[100] %
create procedure sum(in numList intArray, out total integer)
begin
declare i, n integer;
set n = CARDINALITY(numList);
set i = 1;
set total = 0;
while (i <= n) do
set total = total + numList[i];
set i = i + 1;
end while;
end %
create procedure main(out total integer)
begin
declare numList intArray;
set numList = ARRAY[1,2,3,4,5,6];
call sum(numList, total);
end %例 2
この例では、2 つの配列データ・タイプ (intArray および stringArray)、さらには 2 つの列 (id および name) を持つ persons 表を使用します。 プロシージャー processPersons は、3 人の人物をこの表にさらに追加し、文字「o」が含まれる人物名を ID 順に並べた配列を返します。 追加される 3 人の人物の ID と名前は、2 つの配列 (ids および names) として表されます。 これらの配列は UNNEST 関数への引数として使用され、この関数はこうした配列を 2 列からなる表に変換します。その後、この表の要素が persons 表に挿入されます。 最後に、このプロシージャーの最後の set ステートメントでは ARRAY_AGG 集約関数を使用して、出力パラメーターの値を計算します。
create type intArray as integer array[100] %
create type stringArray as varchar(10) array[100] %
create table persons (id integer, name varchar(10)) %
insert into persons values(2, 'Tom') %
insert into persons values(4, 'Jill') %
insert into persons values(1, 'Joe') %
insert into persons values(3, 'Mary') %
create procedure processPersons(out witho stringArray)
begin
declare ids intArray;
declare names stringArray;
set ids = ARRAY[5,6,7];
set names = ARRAY['Bob', 'Ann', 'Sue'];
insert into persons(id, name)
(select T.i, T.n from UNNEST(ids, names) as T(i, n));
set witho = (select array_agg(name order by id)
from persons
where name like '%o%');
end %