|
Example - Array DML |
Top Previous Next |
|
Array DMLはOracleの機能の一つで、アプリケーションが一度のネットワーク往復の一命令で複数レコードの挿入、更新、そして削除することを可能にします。これはバッチ処理に対して大幅なパフォーマンス向上をもたらします。WAN設定のもとでは、飛躍的なパフォーマンス向上が得られます。 Array DMLを使うために、TOracleQueryのSetVariableメソッドにバリアント値の配列を提供する必要があります。全ての配列は同じ長さでなくてはいけません。次のサンプルは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は処理するレコードの数を表します。結果はうまく処理できたレコードの数となります。 |