Db2 ODBC SQL と組み込み SQL の相違点

Db2 ODBC と組み込み SQL の間には大きな相違がありますが、Db2 ODBC では、組み込み SQL で動的に準備できる SQL ステートメントを実行することができます。

組み込み SQL インターフェースを使用するアプリケーションには、SQL ステートメントを コードに変換するためのプリコンパイラーが必要であり、 変換後そのコードはコンパイルされ、データ・ソースにバインド されて実行されます。 これに対して、Db2 ODBC アプリケーションは、プリコンパイルまたはバインドされる必要はありませんが、代わりに標準セットの関数を使用して実行時に SQL ステートメントと関連サービスを実行することができます。

従来、プリコンパイラーは、各データベース製品固有のものであり、 それによってその製品とアプリケーションとを事実上結び付ける役割を 果たしていたため、この違いは重要です。 Db2 ODBC では、特定のデータベース製品に依存しないポータブル・アプリケーションを作成することができます。 ODBC アプリケーションをプリコンパイルしないため、Db2 ODBC ドライバーは、ODBCを介して実行されるステートメントに、プリコンパイラー・オプションの固定セットを課します。 これらのオプションは、 一般的な ODBC アプリケーションを意図したものです。

この独立性により、 Db2 ODBC アプリケーションは、異なる Db2 またはDRDAデータソースにアクセスするために再コンパイルや再バインドを行う必要はなく、実行時に適切なデータソースに接続するだけで済みます。

Db2 ODBC と組み込み SQL も、以下の点で異なります。
  • Db2 ODBC では、カーソルの明示宣言を必要としません。 必要に応じて、Db2 ODBC によって生成されます。 その後、アプリケーションは、通常のカーソル・フェッチ・モデルの生成済みカーソルを、 複数行の SELECT ステートメント、および位置付け UPDATE および位置付け DELETE ステートメントに使用できます。
  • OPEN ステートメントは、Db2 ODBC では使用されません。 その代わりに、SELECT の実行によって自動的に カーソルがオープンされます。
  • 埋め込みSQLとは異なり、 Db2 ODBC では、EXECUTE IMMEDIATEステートメント( SQLExecDirect() 関数)に相当するパラメータマーカーを使用することができます。
  • Db2 ODBC における COMMIT または ROLLBACK は、SQL ステートメントとして渡すのではなく、 SQLEndTran() 関数呼び出しを使用して発行されます。
  • Db2 ODBC は、アプリケーションの代わりにステートメント関連情報を管理し、それを抽象オブジェクトとして参照するためのステートメント・ハンドルを提供します。 このハンドルによって、アプリケーションは製品固有のデータ構造を 使用する必要がなくなります。
  • ステートメント・ハンドルと同様に、 環境ハンドル および接続ハンドル が、 すべてのグローバル変数および接続固有の情報を参照する方法として備えられています。
  • Db2 ODBC は、X/Open SQL CAE 仕様によって定義された SQLSTATE 値を使用します。 フォーマットおよびほとんどの値は、 IBM® のリレーショナルデータベース製品で使用されている値と一致していますが、相違点もあります(一部の ODBC SQLSTATEおよびX/Open定義のSQLSTATEも異なります)。

これらの相違点にもかかわらず、組み込み SQL と Db2 ODBC には、Db2 ODBC は組み込み SQLで動的に準備可能な SQL ステートメントを実行できるという概念が共通しています。

表1は、各 Db2 for z/OS® SQLステートメントを列挙し、 Db2 ODBC でそのステートメントを実行できるかどうかを示しています。

各データベース管理システムには、動的に準備可能な追加のステートメントがある場合があります。この場合、Db2 ODBC はそれらをデータベース管理システムに渡します。

例外: 一部のデータベース管理システムでは、COMMIT および ROLLBACK を動的に準備することはできますが、 渡すことはありません。 COMMIT または ROLLBACK のいずれかを指定する代わり に、SQLEndTran() 関数を使用する必要があります。

表 1. SQL ステートメントに対する ODBC サポート
SQL ステートメント 動的1 Db2 ODBC2
ALTER TABLE はい はい
ALTER DATABASE はい はい
ALTER INDEX はい はい
ALTER STOGROUP はい はい
ALTER TABLESPACE はい はい
BEGIN DECLARE SECTION3 いいえ いいえ
CALL いいえ 4
CLOSE いいえ SQLFreeHandle()
COMMENT ON はい はい
COMMIT はい SQLEndTran()
CONNECT (タイプ 1) いいえ SQLConnect()、SQLDriverConnect()
CONNECT (タイプ 2) いいえ SQLConnect()、SQLDriverConnect()
CREATE { ALIAS, DATABASE, INDEX, STOGROUP, SYNONYM, TABLE, TABLESPACE, VIEW, DISTINCT TYPE } はい はい
DECLARE CURSOR3 いいえ SQLAllocHandle()
DECLARE STATEMENT いいえ いいえ
DECLARE TABLE いいえ いいえ
DECLARE VARIABLE いいえ いいえ
DELETE はい はい
DESCRIBE いいえ SQLDescribeCol(), SQLColAttribute()
DROP はい はい
END DECLARE SECTION3 いいえ いいえ
EXECUTE いいえ SQLExecute()
EXECUTE IMMEDIATE いいえ SQLExecDirect()
EXPLAIN はい はい
FETCH いいえ SQLFetch()、SQLExtendedFetch()
FREE LOCATOR4 いいえ はい
GET DIAGNOSTICS いいえ いいえ
GRANT はい はい
HOLD LOCATOR4 いいえ はい
INCLUDE3 いいえ いいえ
INSERT はい はい
LABEL ON はい はい
LOCK TABLE はい はい
MERGE5 はい はい
OPEN いいえ SQLExecute()、SQLExecDirect()
PREPARE いいえ SQLPrepare()
RELEASE いいえ いいえ
RENAME はい はい
REVOKE はい はい
ROLLBACK はい SQLEndTran()
select-statement はい はい
SELECT INTO いいえ いいえ
SET CONNECTION いいえ SQLSetConnection()
SET host_variable いいえ いいえ
SET CURRENT APPLICATION ENCODING SCHEME いいえ いいえ
SET CURRENT DEGREE はい はい
SET CURRENT PACKAGESET いいえ いいえ
SET CURRENT PATH はい はい
SET CURRENT SCHEMA はい はい
SET CURRENT SQLID はい はい
UPDATE はい はい
WHENEVER3 いいえ いいえ
注:
  1. このリストのすべてのステートメントは静的 SQL としてコーディング できますが、動的 SQL としてコーディングできるのは「可」の付いた ステートメントだけです。
  2. 「可」は、該当するステートメントが SQLExecDirect()、 または SQLPrepare()SQLExecute() のいずれかを使用して実行できることを示します。 同等の Db2 ODBC 機能がリストされています。
  3. このステートメントは実行できません。
  4. このステートメントは動的ではありませんが、 Db2 ODBC を使用すると、 SQLExecDirect() または SQLPrepare()SQLExecute() のいずれかを呼び出す際にステートメントを指定することができます。
  5. FOR n ROWS 文節は、Db2 ODBC プログラムの MERGE ステートメントで指定することはできません。 結合する行数を指定するには、 SQLSetStmtAttr() とSQL_ATTR_PARAMSET_SIZEステートメント属性を使用します。