BLOB、CLOB、および DBCLOB のファイル参照変数は、 LOB の直接のファイル入出力に使用されるもので、すべてのホスト言語で定義可能です。
これらはネイティブのデータ・タイプではないため、 SQL 拡張機能が使用され、それぞれの変数を表現するのに必要なホスト言語構成をプリコンパイラーが生成します。 REXX の場合、LOB はストリングにマップされます。
LOB ロケーターは LOB バイトを含むものではなく LOB バイトを表すものであるのと同じように、 ファイル参照変数はファイルを含むものではなく間接的に指し示します。 データベースの照会、更新、および挿入では、 ファイル参照変数を使用して 1 つの列値を保管したり検索したりすることができます。
ファイル参照変数には以下の特性があります。
アプリケーション内では、 ファイルは 1 つのファイル参照変数でのみ参照する必要があります。
他のすべてのホスト変数と同様に、ファイル参照変数にも標識変数を対応させることができます。
EXEC SQL BEGIN DECLARE SECTION SQL TYPE IS CLOB_FILE hv_text_file; char hv_patent_title[64]; EXEC SQL END DECLARE SECTION
これを前処理した後は以下のようになります。
EXEC SQL BEGIN DECLARE SECTION /* SQL TYPE IS CLOB_FILE hv_text_file; */ struct { unsigned long name_length; // File Name Length unsigned long data_length; // Data Length unsigned long file_options; // File Options char name[255]; // File Name } hv_text_file; char hv_patent_title[64]; EXEC SQL END DECLARE SECTION
その後、以下のコードを使って、データベースの CLOB の列から選択し、 :hv_text_file で参照される新規ファイルに書き込むことができます。
strcpy(hv_text_file.name, "/u/gainer/papers/sigmod.94"); hv_text_file.name_length = strlen("/u/gainer/papers/sigmod.94"); hv_text_file.file_options = SQL_FILE_CREATE; EXEC SQL SELECT content INTO :hv_text_file from papers WHERE TITLE = 'The Relational Theory behind Juggling';
strcpy(hv_text_file.name, "/u/gainer/patents/chips.13"); hv_text_file.name_length = strlen("/u/gainer/patents/chips.13"); hv_text_file.file_options = SQL_FILE_READ: strcpy(:hv_patent_title, "A Method for Pipelining Chip Consumption"); EXEC SQL INSERT INTO patents( title, text ) VALUES(:hv_patent_title, :hv_text_file);
構造タイプ変数は、FORTRAN、REXX、および Java を除く、すべてのホスト言語で定義できます。 これらはネイティブのデータ・タイプではないため、SQL 拡張機能が使用され、 それぞれの変数を表現するのに必要なホスト言語構成をプリコンパイラーが生成します。
他のすべてのホスト変数と同様に、構造タイプ変数にも標識変数を対応させることができます。 構造タイプ・ホスト変数に対応する標識変数は、 他のデータ・タイプの標識変数と同じように動作します。 データベースからヌル値が戻されると、標識変数が設定され、 構造タイプ・ホスト変数は変更されません。
構造タイプ用の実際のホスト変数は、組み込みデータ・タイプとして定義されます。 構造タイプと関連した組み込みデータ・タイプは、以下のようなアクセスが可能でなければなりません。
ホスト変数の代わりにパラメーター・マーカーを使用している場合、 SQLDA に適切なパラメーター・タイプの特性を指定する必要があります。 この場合、SQLDA には SQLVAR 構造のセットが「2 つ」必要です。 また、2 番目の SQLVAR の SQLDATATYPE_NAME フィールドには、 構造タイプのスキーマおよびタイプ名を入れなければなりません。 SQLDA 構造でスキーマを省略すると、エラーが発生します (SQLSTATE 07002)。 このトピックの詳細は、付録 C, SQL 記述子域 (SQLDA)を参照してください。
C プログラムで、(組み込みタイプの BLOB(1048576) を使い、 タイプ POLYGON の) ホスト変数 hv_poly と hv_point を定義します。
EXEC SQL BEGIN DECLARE SECTION; static SQL TYPE IS POLYGON AS BLOB(1M) hv_poly, hv_point; EXEC SQL END DECLARE SECTION;