TOracleQueryとTOracleDataSetの使い分け方について説明します。
OracleサーバでSQL(PL/SQL)を実行するためにDOAは幾つかのコンポーネントを用意しています。特に中心となるのは、TOracleQueryとTOracleDataSetですが、この二つはどこが異なっていて、どのように使い分ればよいのでしょうか。
TOracleQueryとTOracleDataSetの違いと役割
- TOracleQueryはPL/SQLを実行し(単方向)カーソルを取得する最小限の機能をもったコンポーネントです。余計なオーバーヘッドがなくリソースも消費しないので、可能なときはこちらを使います。また、Oracleが返すエラーコード"ORA-NNNNN"をそのまま例外として受け止めることが可能なためきめ細かいエラーハンドリングが可能です。
- TOracleDataSetは、主にデータベース対応コントロールを使用するために、DelphiのTDataSetとの互換性を提供するコンポーネントです。TDataSetに対応したDB対応コンポーネントのすべてが利用可能になり、BDEでのプログラミングに極めて近い感覚でプログラミングが可能になります。
この二つのコンポーネントは、
原則として以下のような基準で使い分けるとよいと思います。(
原則を太字にしたのは、
例外もあるということに注意したいためです)
SQL(PL/SQL)のタイプ | 使用コンポーネント |
---|---|
DB対応コンポーネントでユーザが編集するデータセット/カーソルを返す SELECTクエリまたはストアドプロシージャ |
TOracleDataSet |
CachedUpdates機能を用いてまとめて変更を反映させるためのデータセット/カーソルを取得(作成)するための SELECTクエリまたはストアドプロシージャ |
TOracleDataSet |
Edit/Append/Insert/Post など TDataSet互換のメソッドで更新したいデータセット/カーソルを取得する SELECTクエリまたはストアドプロシージャ |
TOracleDataSet |
Locateメソッドの検索によって ランダムアクセスしたいデータセット/カーソルを取得するための SELECTクエリまたはストアドプロシージャ |
TOracleDataSet |
上記以外のSELECTクエリ (DB対応コントロールを使わず、取得結果を先頭から順に1回だけ参照する場合など) |
TOracleQuery |
上記以外の ストアドプロシージャ (カーソルの取得を伴わないか、カーソルを取得しても先頭から順に1回だけスキャンする場合など) |
TOraclePackage/Package Wizard またはTOracleQuery |
DML(INSERT/UPDATE/DELETE)クエリ | TOracleQuery |
BDEのTQueryにはRowsAffectedプロパティがあって、DML(INSERT/UPDATE/DELETE)が
更新したレコード件数を返しますが、これに相当するのは
TOracleQuery.RowsProcessedです。TOracleDataSetは、RowsProcessedDMLクエリに使用するように作られていないため、RowsProcessedプロパティがありません。
TOraclePackage と
Package Wizard
は、大規模プロジェクトにおいて、ストアド・プロシージャを作成と利用とを分離し、プログラミングとテストの分業を実現するための洗練された方法です。パッケージプロシージャに関する記述を参考にしてください。
なお、TOracleDataSetでしか出来ない機能は他にも無数にありますが、ここでは網羅的に説明はしません。