画像、音声クリップ、ビデオ・クリップなどのラージ・オブジェクトをアプリケーションと DB2 データベースの間で伝送する場合、いくつかの方法があります。 どの方法を使うかは、オブジェクトをファイルとの間で送受信するか、メモリー・バッファーとの間で送受信するかによって異なります。 さらにどの方法を使うかは、ファイルがクライアント・マシンにあるか、データベース・サーバー・マシンにあるかによっても異なります。
オブジェクトをデータベース表とサーバー・ファイルとの間で伝送する場合には、該当するエクステンダー UDF 要求にファイル・パスを指定します。 エクステンダー UDF とファイルは両方ともサーバーにあるので、エクステンダーはそのファイルを見つけることができます。 たとえば、次の SQL ステートメントでは、内容がサーバー・ファイルにある画像がデータベース表に保管されます。
EXEC SQL BEGIN DECLARE SECTION; long hvStorageType; EXEC SQL END DECLARE SECTION; hvStorageType=MMDB_STORAGE_TYPE_INTERNAL; EXEC SQL INSERT INTO EMPLOYEE VALUES( '128557', 'Anita Jones', DB2Image( CURRENT SERVER, '/employee/images/ajones.bmp', 'ASIS', :hvStorageType, 'Anita''s picture') );
エクステンダーがメモリー・バッファーに直接アクセスすることはできません。 クライアント・マシンのバッファーとの間でオブジェクトを送受信する場合には、バッファーの位置を指定する以外の方法でそれを行う必要があります。 バッファーとの間でオブジェクトを送受信する方法の 1 つは、ホスト変数を使う方法です。 アプリケーションと DB2 アプリケーションとの間でオブジェクトを伝送するには、通常この方法を使います。
ラージ・オブジェクトに対するホスト変数の定義や使用は、従来の文字や数値のオブジェクトの場合と同じようにして行います。 つまり、ホスト変数を DECLARE セクションに宣言し、伝送する値をそれに割り当てるか、そこに伝送された値にアクセスします。
画像、音声、ビデオのデータに対しホスト変数を宣言する場合には、データ・タイプとして BLOB を指定する必要があります。 UDF を使ってオブジェクトの保管や、取り出し、更新を行う場合には、適切なホスト変数を UDF 要求の引き数として指定します。 その形式は、SQL ステートメントに指定する他のホスト変数の場合と同じです。
たとえば、次の SQL ステートメントでは、hvaudio という LOB ロケーターを宣言して使用し、ビデオ・クリップをデータベース表から取り出します。
EXEC SQL BEGIN DECLARE SECTION; SQL TYPE IS BLOB (2M) hvaudio; EXEC SQL END DECLARE SECTION; EXEC SQL INSERT INTO EMPLOYEE VALUES( '128557', 'Anita Jones', DB2Audio( CURRENT SERVER, :hvaudio, 'WAVE', CAST(NULL as LONG VARCHAR), 'Anita''s voice') );
音声クリップやビデオ・クリップなどのラージ・オブジェクトは非常に大きい場合があるので、ホスト変数を使うのがそれらを操作する最も効率的な方法とは限りません。 アプリケーションで LOB を操作するときには、LOB ロケーターを使う方がよい場合があります。
LOB ロケーターはホスト変数に保管される小さな (4 バイトの) 値です。 プログラムではこれを使って、DB2 データベースのより大きな LOB を参照することができます。 LOB ロケーターを使えば、プログラムでは、LOB をそれが通常のホスト変数に保管されているかのように操作することができます。 違いは、LOB をクライアント・マシンのアプリケーションとデータベース・サーバーとの間で転送する必要がないということです。 たとえば、データベース表の LOB を選択すると、その LOB はサーバーに残り、LOB ロケーターがクライアントに移ります。
LOB ロケーターは、DECLARE セクションに宣言し、ホスト変数と同じようにして使用します。 LOB ロケーターを画像や、音声、ビデオのデータに対して宣言する場合には、データ・タイプとして BLOB_LOCATOR を指定する必要があります。 たとえば、次の SQL ステートメントでは、video_loc という LOB ロケーターを宣言して使用し、ビデオ・クリップをデータベース表から取り出します。
EXEC SQL BEGIN DECLARE SECTION; SQL TYPE IS BLOB_LOCATOR video_loc; EXEC SQL END DECLARE SECTION; EXEC SQL SELECT CONTENT(VIDEO) INTO :video_loc FROM EMPLOYEE WHERE NAME='Anita Jones';
UDF は LOB ロケーターを使用します: 画像、音声、ビデオのオブジェクトを保管、取り出し、および更新する DB2 エクステンダーの UDF は LOB ロケーターを使用します。 DB2 エクステンダー V1 の UDF は LOB ロケーターを使用しなかったので、2 MB より大きいオブジェクトを処理できませんでした。 この制限のため、ユーザーは 2 MB より大きなオブジェクトを複数のセグメントに分けて伝送しなければなりませんでした。 これらの UDF は現在、LOB ロケーターを使用するので、2 MB の制限は除去されました。
クライアント・ ファイル参照変数を使用すれば、アプリケーション・プログラムでラージ・オブジェクトのためのバッファー・スペースを割り振らずに済みます。 UDF でファイル参照変数を使用すると、DB2 は、BLOB 内容をファイルと UDF の間で直接渡します。
ファイル参照変数は、DECLARE セクションで宣言し、ホスト変数と同じようにして使用します。 画像、音声、ビデオのデータに対してファイル参照変数を宣言する場合には、データ・タイプとして BLOB_FILE を指定する必要があります。 しかし、オブジェクトの内容が入るホスト変数とは異なり、ファイル参照変数にはファイルの名前が入ります。 ファイルのサイズは、その UDF に定義された BLOB のサイズ以下でなければなりません。
入力や出力におけるファイル参照変数の使用方法については、各種のオプションがあります。 オプションを選択するには、プログラムのファイル参照変数の構造体において、FILE_OPTIONS フィールドの値を設定します。 その場合、次のオプションから選択できます。
入力オプション
SQL_FILE_READ。 このファイルは、オープン、読み取り、クローズが可能です。 ファイルのデータの長さ (バイト単位) は、ファイルのオープン時に判別されます。 ファイルの長さ (バイト単位) が、ファイル参照変数の構造体の data_length フィールドに入ります。
出力オプション
たとえば、次のステートメントでは、Img_file というファイル参照変数を宣言し、それを使って、画像 (その内容はクライアント・ファイルにある) をデータベース表に保管します。 FILE_OPTIONS フィールドに、SQL_FILE_READ が割り当てられていることに注目してください。
EXEC SQL BEGIN DECLARE SECTION; SQL TYPE IS BLOB_FILE Img_file; EXEC SQL END DECLARE SECTION; strcpy (Img_file.name,"/employee/images/ajones.bmp"); Img_file.name_length=strlen(Img_file.name); Img_file.file_options=SQL_FILE_READ; EXEC SQL INSERT INTO EMPLOYEE VALUES( '128557', 'Anita Jones', DB2Image( CURRENT SERVER, :Img_file, 'ASIS', CAST(NULL as LONG VARCHAR), 'Anita''s picture') );
DB2 エクステンダーでは、オブジェクトを保管、検索、または更新する際、ファイル名を指定する方法に柔軟性を持たせることができます。
保管、取り出し、および更新操作に対して、完全に修飾されたファイル名 (つまり、ファイル名の前に完全なパス) を指定できますが、相対ファイル名を指定した方が良いでしょう。 AIX、HP-UX、および Solaris では、相対ファイル名は、スラッシュで始まらない任意のファイル名です。 OS/2 および Windows では、相対ファイル名は、ドライブ文字とコロンと \ が先頭に付かない任意のファイル名です。
相対ファイル名を指定する場合、エクステンダーはさまざまなクライアントおよびサーバーの環境変数のディレクトリー指定を使用して、ファイル名を解決します。 全パス名は、先行部分 (通常はマウント・ポイントと関連付けられている) と、必要なファイルを一意的に識別する後続パス名から構成されます。 後続パス名は UDF で指定されます。 環境変数は、相対ファイル名を解決する際に検索する主要なパス名のリストを提供します。 ファイル名を解決するために DB2 エクステンダーが使用する環境変数については、付録 A, DB2 エクステンダー用の環境変数の設定を参照してください。
エクステンダーは、さらに、ファイル名の形式を適宜変更します。 ファイル名は、サーバーに渡されると、そのオペレーティング・システムにとって適切な形式に変換されます。 たとえば、c:\dir1\abc.bmp という OS/2 のファイル名は、AIX サーバーに渡されると /dir1/abc.bmp に変換されます。