情報センターのリンクがLUW 9.7に移動し、Javaでプログラミングしたとおっしゃっていますが、私がバインドした経験のほとんどは、COBOLを使用したメインフレーム上のDB2での経験です。そのため、説明を少し変更する必要がある場合があります(ただし、一般的には概念は同じである必要があります)。
バインドは、プリコンパイルされた埋め込みSQL(静的にバインドされたSQL)を含むプログラムをコンパイルする場合にのみ関係があると思います。たとえば、JDBCを使用している場合、BINDを実行する必要はありません。JDBCドライバーはPREPARE
ステートメントを動的に実行します。
DB2プリコンパイラーPRECOMPILE
を介してプログラムを実行し、プログラムを実行し、埋め込みSQL(COBOLでは、これらはからEXEC SQL
に移行するステートメントブロックEND-EXEC.
)を検出した場合、SQLを慎重に取り除き、それをCOBOL-DB2インターフェースの呼び出し。この後、の2つの出力、PRECOMPILE
すべての埋め込みSQLが削除された(A
これ以降)COBOLソースと、削除さDBRM
れたすべてのSQLが含まれる(B
)があります。
プリコンパイルはいくつかの基本的な構文チェックを行いますが、チェックはプログラム内のテーブル宣言にのみ基づいていることに注意してください。これらを検証するためにDB2に接続することはありません!
これら2つのファイルは完全に独立しており、COBOLプログラムを実行するときに、同時に生成されたとを見つける必要がA
ありB
ます。
この時点で、A
はコンパイルされて標準のCOBOLコンパイラーでにリンクされ、load module
後で使用するためにロードライブラリーに配置されます。
ただし、B
DBRMで行う作業はまだたくさんあります。これが登場する場所BIND
です。 BIND
は、組み込みSQLコードのコンパイラのようなもので、「コンパイル」の出力はpackage
です。
SQLを実行可能な「パッケージ」にバインドするために、BINDプロセスはDB2に接続し、いくつかのことを行います。
- 現在のAuthIDがバインドの実行を許可されていることを確認します。
- DB2カタログのデータを利用して、SQLの構文をチェックします。
- 最後に、そして最も重要なこととして、バインドはSQLを最適化します
最後のステップでは、すべてのSQLがオプティマイザーを介して実行されます。オプティマイザーは、データをフェッチするためにDB2エンジンが取る可能性のあるすべての統計とさまざまなパスを考慮します。次に、関連付けられたコストが最も低いパスを選択します(新しいバージョンのDB2 [DB2 10 for z / OS]では、「コストは高い」が「リスクは低い」パスを選択する場合があります)。パスが選択されると、それはコンパイルされてパッケージになり、カタログに格納されますSELECT * FROM SYSIBM.SYSPACKAGE
((z / OS)で現在のすべてのパッケージを表示できます)。
最後に、プログラムがパッケージと再統合できるようにする最後のピース、がありますPLAN
。別のBIND(BIND PLAN
)を実行して計画を作成します。プランは、プログラムが同じ名前を共有するパッケージを見つけるために調べることができるパッケージのコレクションです。COBOLでは、プログラムがJCLで検索するプランを指定します。
つまり、コンパイルされたコードは次の手順を実行して、使用可能なコードを生成しますBIND PLAN
。
プリコンパイル-> DBRMを作成します(C [++]を使用すると、プリコンパイラーはプリコンパイルされたSQLをHFSファイルに出力します。これはコマンドラインバインドプログラムを介して送信できます)-> DBRMが最適化され、アクセスパスのセット( a package
)が作成されます->パッケージがに追加されますBIND PLAN
。これは、プログラムが参照する「検索パス」を作成できるようにするパッケージのグループです。
これらのプログラムは静的にバインドされているため、テーブル統計が大幅に変化すると、バインド時にオプティマイザが選択したアクセスパスが最適パスではなくなる可能性があり、再バインドによってSQLを再評価して、おそらくより良い道。
編集(コメントの更新):コマンド行プロセッサーを使用している場合、単一のバインドパッケージ(.bnd
)またはバインドファイル名のリスト()のいずれかを渡すことができます.lst
。リストを渡す場合、ファイル名の前に@
(例:)を付ける必要があります/path/to/@packages.lst
。.lstファイル内では、各パッケージを個別の行に配置するか、次のようにしてそれらを分離できます+
。
package1.bnd
package2.bnd
package3.bnd+package4.bnd+package5.bnd