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でしか出来ない機能は他にも無数にありますが、ここでは網羅的に説明はしません。