Example - Array DML

Top  Previous  Next

Array DMLOracleの機能の一つで、アプリケーションが一度のネットワーク往復の一命令で複数レコードの挿入、更新、そして削除することを可能にします。これはバッチ処理に対して大幅なパフォーマンス向上をもたらします。WAN設定のもとでは、飛躍的なパフォーマンス向上が得られます。

Array DMLを使うために、TOracleQuerySetVariableメソッドにバリアント値の配列を提供する必要があります。全ての配列は同じ長さでなくてはいけません。次のサンプルは4つのよく知られた部署をdept tableに挿入します:

var deptno, dname, loc: variant;

begin

deptno := VarArrayCreate([0, 3], varVariant);

dname  := VarArrayCreate([0, 3], varVariant);

loc    := VarArrayCreate([0, 3], varVariant);

deptno[0] := 10;

dname[0]  := 'Accounting';

loc[0]    := 'New York';

deptno[1] := 20;

dname[1]  := 'Research';

loc[1]    := 'Dallas';

deptno[2] := 30;

dname[2]  := 'Sales';

loc[2]    := 'Chicago';

deptno[3] := 40;

dname[3]  := 'Operations';

loc[3]    := 'Boston';

// insert into dept (deptno, dname, loc) values (:deptno, :dname, :loc)

with InsDeptQuery do

begin

   SetVariable('deptno', deptno);

   SetVariable('dname',  dname);

   SetVariable('loc',    loc);

   Execute;

end;

end;

 

array DMLを使うときにはエラー処理に特別な注意が必要です。例外が発生したら、どのレコードでそれが発生したかを知る必要があります。OnArrayErrorイベントはそれぞれのレコードのエラーを扱うために使われます:

procedure TForm1.InsDeptQueryOnArrayError(Sender: TOracleQuery; Index: Integer; ErrorCode: Integer; const ErrorMessage: string; var Continue: Boolean);

var dname: Variant;

begin

dname := Sender.GetVariable('dname');

ShowMessage('Error inserting department ' + dname[Index] + #13#10 + ErrorMessage);

end;

 

エラーを起こした配列内のレコードにアクセスするためにゼロベースのIndexパラメーターを使ってください。配列の残りの処理を中断もしくは続行するためにContinueパラメーターを使うことが出来ます。

Execute メソッドは自動的に宣言された配列内の全てのレコードを実行してしまいます。もし一部分だけを処理する必要がある場合は、ExecuteArrayメソッドを使ってください:

function TOracleQuery.ExecuteArray(Index, Count: Integer): Integer;

 

Indexは配列内のゼロベースの開始位置です。Countは処理するレコードの数を表します。結果はうまく処理できたレコードの数となります。