DRDA サービスでは、動的 SQL ステートメントと静的 SQL ステートメントの実行の両方がサポートされています。 DRDA Server は動的 SQL ステートメントを処理します。たとえば、DRDA コマンド EXCSQLIMM (即時 SQL ステートメントの実行) や EXCSQLSTT (SQL ステートメントの実行) は、ANSI SQL 92 Entry-Level DB2 構文の基本セットを Microsoft SQL Server T-SQL 構文に変換します。 DRDA サービスは、(1) バインド時と (2) ランタイムの 2 つの手順で静的 SQL ステートメントを処理します。
バインド時に、DRDA サービスは BGNBND (RDB へのパッケージのバインドを開始する) と BNDSQLSTT (RDB パッケージへの SQL ステートメントのバインド) を SQL Server T-SQL ストアド プロシージャに処理します。 必要に応じて、DRDA サービスは、MICROSOFT 静的 SQL for DB2 XML ファイルへのバインドを処理したり、カスタムの置き換え可能なバインド リスナー (より広範な SQL 構文変換をサポートできるカスタムまたはサード パーティ製のパッケージ バインダー) を呼び出してバインドを処理したりできます。 Microsoft DRDA クライアントと DRDA サービスでサポートされるパッケージ XML 形式の詳細については、「Static SQL for DB2」というタイトルのトピックを参照してください。
実行時に、DRDA サービスは PRPSQLSTT (SQL ステートメントの準備)、EXCSQLSTT (SQL ステートメントの実行)、および OPNQRY (Open Query) コマンドを T-SQL CALL ステートメントに処理します。 サーバー カーソル操作をサポートするために、DRDA サービスは OPNQRY をオープン カーソル コマンドに処理し、CNTQRY (Continue Query) を fetch コマンドに、CLSQRY (Close Query) をクローズ カーソル コマンドに処理します。 DRDA サービスは、DRDA DUW (分散作業単位) のサポートの一環として、コミット、ロールバック、およびログ コマンドの同期を処理します。
パッケージの名前付け規則
DRDA は、これらの複数の部分で構成される PKGNAM (RDB パッケージ名) を使用して、完全修飾静的 SQL パッケージを定義します。
RDBNAM (リレーショナル データベース名)
RDBCOLID (RDB コレクション識別子)
PKGID (RDB パッケージ識別子)
RDBNAME.RDBCOLID.PKGID.PKGCNSTKN.PKGSN
前の例は、一貫性トークンを持つ完全修飾パッケージ名を示しています。
Warnung
PKGNAM に対して複数のパッケージの値が同じである場合、パッケージは VRSNAM (バージョン名) または PKGCNSTKN (パッケージ名整合性トークン) によって区別されます。
PKGCNSTKN (RDB パッケージ整合性トークン)
VRSNAM (バージョン名)
パッケージをストアド プロシージャに変換する
DRDA サービスは、DRDA BGNBND (Begin Bind) および BNDSQLSTT (Bind SQL Statement) プロトコル フローと書式設定されたデータ値を処理することによって、DB2 パッケージ用の静的 SQL と埋め込み SQL ステートメントを SQL Server ストアド プロシージャに変換します。 必要に応じて、DRDA サービスは、後でストアド プロシージャに変換したり、トラブルシューティングを行ったりするために、XML ファイルとしてバインドを処理できます。 さらに、DRDA サービスは、カスタム バインド リスナー コンポーネントを呼び出して、BGNBND フローと BNDSQLSTT フローを処理できます。 パッケージ バインド フローの処理の詳細については、「操作」を参照してください。 カスタム・バインド・リスナーの詳細については、プログラマー・ガイドおよびプログラマー・リファレンスを参照してください。
前の図では、DB2 for z/OS 組み込み SQL は、DB2 事前コンパイル フェーズ中に DB2 パッケージに変換され、DB2 バインド コピー フェーズ中に DRDA BGNBND および BNDSQLSTT フローに変換された後、DRDA バインド パッケージとステートメント フローを処理するときに DRDA サービスによって SQL Server ストアド プロシージャに変換されます。
静的 SQL パッケージ ステートメント
IBM DB2 for z/OS 製品およびドキュメントには、COBOL for z/OS を含む一連のインストール検証テスト・サンプル・プログラムが含まれています。
EXEC SQL CONNECT TO :TEMPLOC END-EXEC
EXEC SQL INSERT INTO VHDEPT
VALUES (:DEPT-NUMB, :DEPT-NAME, :DEPT-MGR,
:DEPT-ADMR, :DEPT-LOC)
END-EXEC.
前の例は、SQL CONNECT および INSERT ステートメントが組み込まれた IBM DB2 for z/OS サンプル COBOL プログラムを示しています。
CONNECT TO :H
INSERT INTO VHDEPT VALUES (:H, :H, :H, :H, :H )
前の例は、DB2 事前コンパイラーによって抽出され、静的 SQL for DB2 パッケージ (ステートメントごとに 1 つのセクション) に格納された IBM DB2 for z/OS サンプル COBOL プログラムの組み込み SQL ステートメントを示しています。
<Section Number="18" Alias="">
<Statement Number="18">INSERT INTO VHDEPT VALUES ( :H , :H , :H , :H , :H ) </Statement>
<Parameters>
<Parameter Name="DEPT-NUMB" Type="Char" Length="3" Precision="0" Scale="0" CCSID="37" Nullable="False" />
<Parameter Name="DEPT-NAME" Type="Char" Length="36" Precision="0" Scale="0" CCSID="37" Nullable="False" />
<Parameter Name="DEPT-MGR" Type="Char" Length="6" Precision="0" Scale="0" CCSID="37" Nullable="False" />
<Parameter Name="DEPT-ADMR" Type="Char" Length="3" Precision="0" Scale="0" CCSID="37" Nullable="False" />
<Parameter Name="DEPT-LOC" Type="Char" Length="16" Precision="0" Scale="0" CCSID="37" Nullable="False" />
</Parameters>
</Section>
前の例では、DRDA サービスによって、IBM DB2 for z/OS のサンプル COBOL プログラムの静的 SQL パッケージステートメントが、DB2 の XML ファイルセクションの静的 SQL に変換された様子を示しています。 DB2 for z/OS は、リモート DRDA 定義パッケージに CONNECT ステートメントを含めません。
/****** BNDOPT: <Options><BNDCHKEXS>BNDEXSOPT</BNDCHKEXS><BNDCRTCTL>BNDNERALW</BNDCRTCTL><BNDEXPOPT>EXPNON</BNDEXPOPT><DFTRDBCOL>CXE001</DFTRDBCOL><DGRIOPRL>1</DGRIOPRL><PKGATHOPT>PKGATHKP</PKGATHOPT><PKGISOLVL>ISOLVLCS</PKGISOLVL><PKGOWNID>CXE001</PKGOWNID><PKGRPLOPT>PKGRPLALW</PKGRPLOPT><QRYBLKCTL>FIXROWPRC</QRYBLKCTL><RDBRLSOPT>RDBRLSCMM</RDBRLSOPT><STTDATFMT>USADATFMT</STTDATFMT><STTDECDEL>DECDELPRD</STTDECDEL><STTSTRDEL>STRDELAP</STTSTRDEL><STTTIMFMT>USATIMFMT</STTTIMFMT></Options> ******/
CREATE PROCEDURE [DSN8910].[DSN8HC3_18BBB2BA1492DAC8_19] @DEPT_NUMB Char(3), @DEPT_NAME Char(36), @DEPT_MGR Char(6), @DEPT_ADMR Char(3), @DEPT_LOC Char(16)
AS
begin
INSERT INTO VHDEPT VALUES ( @DEPT_NUMB , @DEPT_NAME , @DEPT_MGR , @DEPT_ADMR , @DEPT_LOC )
return @@ROWCOUNT
end
GO
前の例は、DRDA サービスによって SQL Server CREATE PROCEDURE ステートメントに変換された、IBM DB2 for z/OS のサンプル COBOL プログラムにおける DB2 パッケージ用の静的 SQL ステートメントを示しています。
DRDA サービス パッケージのバインド オプション
DRDA BGNBND (バインド開始) フローには、ランタイム パッケージのストレージと実行に影響を与えることができるパッケージ バインド オプションのセットが含まれています。 DRDA サービスは、限られた数のバインド オプションを SQL Server コンストラクトにマップします。 DRDA サービスは、静的 SQL for DB2 パッケージ XML ファイルのバインド オプションをストアド プロシージャ内のコメントとして保持し、必要に応じてストアド プロシージャの拡張プロパティとして保持します。
バインドパッケージ作成制御
DRDA サービスは、バインド エラーをスキップするように MsDrdaService に指示する DRDA BGNBND BNDCRTCTL (バインド パッケージ作成コントロール) をサポートしています。 BNDCRTCTL コード ポイントでは、値の列挙がサポートされています。
BNDCHKONL(バインド チェックのみ)
BNDNERALW (バインドエラー不許可)
BNDERRALW (バインドエラー許可)
BNDNERALW (バインドでエラーが許可されない)
既定では、DRDA サービスの既定設定は BNDNERALW (Bind No Errors Allowed) です。 DRDA サービスは、次のいずれかのインスタンスが発生したときに、問題を示すエラーを含む BGNBNDRM (BGNBND 応答メッセージ) を返します。
DRDA から XML への変換の問題
XML から DDL への変換の問題
カスタム バインド リスナーがコールバック インターフェイスで DDL を返す
DRDA サービスで DDL ステートメントを実行できない
エラーを無視してパッケージの処理を続行するように DRDA サービスに指示するには、DRDA AR クライアントで BNDCRTCTL オプション BNDERRALW (バインド エラーが許可されます) を指定する必要があります。
DB2 for z/OS で DB2 管理ツールを使用する場合、DB2 管理者はオプション SQLERROR "C" (続行) を指定できます。 DB2 for z/OS で DB2 バインド・コピー・ツールを使用する場合、DB2 プログラマーは DB2 BIND PACKAGE パネルに移動し、CHANGE CURRENT DEFAULTS=YES を指定してから、SQLERROR PROCESSING=C を設定できます。
バインドパッケージの置換
DRDA サービスでは、DRDA BGNBND PKGRPLOPT (パッケージ置換オプション) がサポートされています。これにより、パッケージ ストアド プロシージャを削除して再作成するように MsDrdaService に指示します。 PKGRPLOPT コード ポイントはブール値をサポートしています。
現時点では、BGNBND (Begin Bind) BNDSQLSTT (Bind SQL ステートメント) を処理するときに、パッケージを追加しますが、置き換えるわけではありません。 このオプションは、パッケージの新しいコピーをドロップして作成するように DB2 for z/OS に指示します。
PKGRPLALW (パッケージ交換可)
PKGRPLNA (パッケージの置換は許可されていません)
既定では、DRDA サービスの既定値は PKGRPLALW (パッケージ置換可能) です。 DRDA サービスは、CREATE PROCEDURE ステートメントを実行する前に DROP PROCEDURE ステートメントを実行します。
バインド オプションの一覧
DB2 パッケージ XML ファイル用の静的 SQL で定義されているパッケージ バインド オプションの一覧を次に示します。 これらの要素、型、値の形式は、Host Integration Server のバージョンによって異なります。 HIS 2010 (V8.5) では、このテクノロジは、これらのバインド オプションのバージョン 8.5 形式をサポートしました。 HIS 2013 (V9.0) では、このテクノロジでは、これらのバインド オプションのバージョン 9.0 形式がサポートされています。これは、より詳細でわかりやすい形式です。 HIS 2013 テクノロジには、静的 SQL for DB2 パッケージ XML ファイルで使用するための XSD スキーマ ファイルが含まれています
DRDA サービスの静的 SQL カーソル
DRDA サービスは、DB2 用の静的 SQL パッケージを SQL Server ストアド プロシージャに変換します。DRDA の処理時に、SQL ステートメントのバインドとバインドを開始するコマンド (埋め込み SQL DECLARE CURSOR ステートメントを含む) が開始されます。 カーソルの種類に応じて、DRDA サービスは、追加の入力パラメーター ("INVOKE_TYPE") を含めるストアド プロシージャを定義して、カーソルに対するアクション (開く、フェッチ、閉じるなど) を定義します。 DRDA サービスには、バインド オプション (固定行プロトコルなど) とカーソルの種類 (更新、読み取り専用など) を示すコメントが SQL Server ストアド プロシージャに含まれています。
カーソルを宣言して開く
DRDA サービスは、コンシューマー プログラムの DECLARE CURSOR コマンドと OPEN CURSOR コマンドをサポートする DRDA AR OPNQRY (Open Query) に応答して、呼び出し型パラメーター引数 "@_INVOKE_TYPE\_ = 0" を指定して SQL Server ストアド プロシージャを呼び出してカーソルを開き、QRYDTA (クエリ応答データ セット) と呼ばれる DRDA OPNQRY コマンドへの応答で DRDA AR に 1 行を返します。
カーソルに対してフェッチ
DRDA サービスは、呼び出し型パラメーター引数 "@_INVOKE_TYPE\_ = 1" とパラメーター引数 @_FETCH_ROW_COUNT\_ = n" を指定して SQL Server ストアド プロシージャを呼び出すことによって、カーソルに対してフェッチします。 コンシューマー プログラムの FETCH コマンドをサポートする DRDA AR CNTQRY (Continue Query) に応答して、QRYDTA (Query Answer Data Set) と呼ばれる DRDA CNTQRY コマンドへの応答で 1 行または複数 (n) 行を DRDA AR に返します。
パフォーマンスを向上させるために、DRDA サービスは、同時更新をサポートするために単一行フェッチにパッケージまたはカーソルが定義されていない限り、フェッチごとに複数の行を返します。 以下の SQL 句の構文とバインド オプションの説明を参照してください。
カーソルを閉じる
DRDA サービスは、コンシューマー プログラムの CLOSE CURSOR コマンドをサポートする DRDA AR CLSQRY (Close Query) に応答して、呼び出し型パラメーター引数 "@_INVOKE_TYPE\_ = 2" を指定して SQL Server ストアド プロシージャを呼び出してカーソルを閉じ、ENDQRYRM (クエリ応答メッセージの終了) と呼ばれる DRDA CLSQRY コマンドへの応答を DRDA AR に返します。
DECLARE CURSOR ステートメントに SQL 句 WITH HOLD が含まれている場合、DRDA サービスは DECLARE CURSOR GLOBAL オプションを使用してストアド プロシージャを定義します。 この場合、SQL Server は、DRDA AR と DRDA サービスから SQL Server への接続の期間中、クローズ要請とコミット要請に対してカーソルを保持します。
SQL 句の構文
DECLARE CURSOR SQL ステートメントに DECLARE CURSOR FOR SELECT という SQL 句が含まれている場合、DRDA サービスはストアド プロシージャにRETURN_RESULTSETコメントを含めます。
DECLARE CURSOR SQL ステートメントに SQL 句 WITH HOLD が含まれている場合、DRDA サービスはストアド プロシージャにCURSOR_WITH_HOLDコメントを含めます。 DRDA サービスは DECLARE CURSOR GLOBAL オプションを使用してストアド プロシージャを定義し、SQL Server は DRDA AR から DRDA サービスを通じて SQL Server への接続期間中、閉じる要求とコミット要求中にカーソルを保持します。
DECLARE CURSOR SQL ステートメントに SQL 句 FOR UPDATE が含まれている場合、DRDA サービスはストアド プロシージャにCURSOR_FOR_UPDATEコメントを含めます。 DRDA サービスは、パラメーター引数 @_FETCH_ROW_COUNT\_ = n" を指定せずにストアド プロシージャを定義します。 DRDA サービスは、フェッチごとに 1 つの行のみを返します。
バインド オプションに応じて、DRDA サービスは SQL 句の構文 FOR READ ONLY と FOR FETCH ONLY を、更新不可能なカーソルを示すものとして解釈します。これに対して、DRDA サービスは CNTQRY ごとに複数の行をフェッチできます。 DRDA サービスは、パラメーター引数 @_FETCH_ROW_COUNT\_ = n" を使用してストアド プロシージャを定義します。 DRDA サービスは、バインド オプションに基づいて、フェッチごとに 1 つの行または複数の行を返します。
DECLARE C2 CURSOR WITH HOLD FOR SELECT SALESKEY FROM CONTOSO.DSN8910.BULKTST1 FOR READ ONLY
DECLARE C4 CURSOR WITH HOLD FOR SELECT SALESKEY FROM CONTOSO.DSN8910.BULKTST1 FOR FETCH ONLY DECLARE C8 CURSOR WITH HOLD FOR SELECT SALESKEY FROM CONTOSO.DSN8910.BULKTST1
フェッチ行数パラメーターを含む LMTBLKPRC を使用して定義された SELECT ステートメントの例。
パッケージ バインド オプション
DRDA サービスは、DRDA BGNBND (Begin Bind) オプション QRYBLKCTL (Query Block Protocol Control) をカーソルの種類と SQL 句構文のオーバーライドとして解釈し、更新不可能なカーソルでフェッチごとに 1 行またはフェッチごとに複数行を返すように DRDA サービスに指示します。
既定の QRYBLKCTL は LMTBLKPRC (制限付きブロック クエリ プロトコル) です。このプロトコルは、DRDA サービスに対して、クエリ ブロックごとに複数の行を返すように指示します。これは、列データ型を定義するために DRDA DSS (データ ストリーム構造) に必要なバイスを減らした 32K ブロックに平均で収まる数までです。
必要に応じて、DB2 プログラマは DB2 CURRENTDATA=YES バインド オプションを使用してパッケージをバインドできます。これは DRDA BGNBND (Begin Bind) オプション QRYBLKCTL (Query Block Protocol Control) FIXROWPRC (Fixed Row Query Protocol) に変換され、プログラムの SQL FETCH ステートメントに応答して CNTQRY (Continue Query) ごとに 1 つの (固定行) を返すように DRDA サービスに指示します。
カーソルは必要ありません
バインド オプションが既定の LMTBLKPRC の場合、ステートメントが明確に読み取り専用の場合、DATA Server は SELECT ステートメントを使用してストアド プロシージャを定義しますが、DECLARE CURSOR は定義しません。 以下の SQL 句の構文とバインド オプションの説明を参照してください。
DECLARE C1 CURSOR FOR SELECT SALESKEY FROM CONTOSO.DSN8910.BULKTST1 FOR READ ONLY
DECLARE C3 CURSOR FOR SELECT SALESKEY FROM CONTOSO.DSN8910.BULKTST1 FOR FETCH ONLY
DECLARE C7 CURSOR FOR SELECT SALESKEY FROM CONTOSO.DSN8910.BULKTST1
SQL Server カーソルを必要としない SELECT ステートメントの例。