2.22.1 WRITE指定の形式と規則
- 〈この項の構成〉
(1) 機能
BLOBデータをシングルサーバ,又はフロントエンドサーバのユニットのファイルに出力し,出力したユニットのIPアドレスとファイル名を返却します。
(2) 形式
WRITE(出力BLOB値,ファイル接頭辞,ファイル出力オプション)
(3) オペランド
-
出力BLOB値
出力BLOB値には,次の項目を指定できます。なお,出力BLOB値はBLOB型にしてください。
-
列指定
-
コンポネント指定
-
関数呼出し
-
結果のデータ型がBLOBとなるスカラ関数SUBSTR
出力BLOB値についての規則を次に示します。
-
出力BLOB値に指定した関数呼出しの引数,又はスカラ関数SUBSTRの第2引数,第3引数には,埋込み変数及び?パラメタを指定できます。
-
出力BLOB値にBLOB列を指定した場合,そのBLOB列を選択式に単独で指定,又はほかのWRITE指定の出力BLOB値に指定できません。
指定できない例を次に示します。
SELECT WRITE(C1,…),C1 FROM … SELECT WRITE(C1,…),WRITE(C1,…) … FROM …
-
FOR READ ONLY句を指定した場合,出力BLOB値には列指定だけ指定できます。
-
出力BLOB値に指定した関数呼出し,又はスカラ関数SUBSTRの引数中には,副問合せを指定できません。
-
ファイル接頭辞
ファイル接頭辞には,HiRDBが組み立てるファイル名の先頭部分を指定します。ファイル接頭辞はVARCHAR型で,かつ222バイト以内で指定してください。
ファイル接頭辞には,次の項目を指定できます。
-
定数(文字列)
-
埋込み変数又は?パラメタ
ファイル接頭辞についての規則を次に示します。
-
ファイル接頭辞は,接続しているシングルサーバ,又はフロントエンドサーバのユニットで有効なディレクトリを含む絶対パス名で指定してください。また,ファイルの利用者は,そのディレクトリに対して,すべての操作ができる権限(アクセス権の種類:フルコントロール)をHiRDB管理者から与えられていなければなりません。UNIX版の場合は,読み取り,書き込み,及びディレクトリ内のサーチ権限をHiRDB管理者から与えられていなければなりません。
-
ファイル接頭辞に指定するファイルセパレータは,HiRDBサーバがUNIXの場合は/を,Windowsの場合は\を指定してください。また,ファイル名に指定できる文字は,HiRDBサーバのプラットフォームの規則に従います。ただし,pdntenvコマンド(UNIX版の場合はpdsetupコマンド)で文字コード種別にutf-8,utf-8_ivs,又はchinese-gb18030を指定した場合は,ASCIIコードの範囲で指定してください。
-
ファイル接頭辞に埋込み変数,又は?パラメタだけを指定する場合,その埋込み変数,又は?パラメタは単純構造にしてください。
-
ファイル接頭辞の文字集合は既定文字集合にしてください。
-
ファイル出力オプション
ファイル出力オプションには,ファイル出力のモードを指定します。ファイル出力オプションは数データ型で指定してください(DESCRIBE INPUT文実行時にはINTEGER型を返却します)。
ファイル出力オプションには,次の項目を指定できます。
-
数定数
-
埋込み変数,又は?パラメタ
また,指定できる値を次に示します。
機能 |
値 |
---|---|
再作成(ファイルがある場合は上書きします) |
0 |
追加書き(ファイルがある場合は終端に追加します) |
1 |
上書き禁止(ファイルがある場合はエラーとします) |
2 |
非同期出力(OSに対して非同期出力を要求します) |
4 |
- 注
-
非同期出力は,再作成,追加書き,及び上書き禁止と組み合わせて指定できます。組み合わせる場合は,ほかの指定値と論理和をとった値を指定してください。また,非同期出力を指定しない場合は,OSに対して同期出力(即書き)を要求します。
ファイル出力オプションに埋込み変数,又は?パラメタだけを指定する場合,その埋込み変数,?パラメタは単純構造にしてください。
(4) WRITE指定の結果についての規則
-
WRITE指定の結果は,非ナル値制約なし(ナル値を許す)のVARCHAR型,定義長は255バイト,文字集合は既定文字集合となります。
-
WRITE指定の結果は,次のような形式になります。
IPアドレス:ファイル接頭辞−列番号−行カウンタ ←−−−− ファイル名 −−−−→
注 IPアドレスとファイル接頭辞の間には,コロン(:)が付きます。また,ファイル接頭辞,列番号,行カウンタの間には,それぞれハイフン(−)が付きます。
[説明]
- IPアドレス:
-
クライアントの接続先のシングルサーバ,又はフロントエンドサーバのユニットのIPアドレスを返却します。IPアドレスは,XXX.XXX.XXX.XXXの形式で,7〜15バイトの長さになります(XXXは0〜255の数値文字)。
- ファイル接頭辞:
-
WRITE指定の第2引数に指定したファイル接頭辞を返却します。
- 列番号:
-
導出表の指定位置を示す番号を返却します。列番号は,1から始まり,先頭を0パディングした5けたの数値文字列となります。
- 行カウンタ:
-
検索した行数に対応した,昇順の番号を返却します。行カウンタは,1から始まり,先頭を0パディングした10けたの数値文字列となります。2,147,483,646行を超えると,1に戻ります。
-
WRITE指定を使用できないクライアントから検索をした場合,IPアドレスは設定されないで,コロンから始まる文字列を返却します。
-
出力BLOB値,ファイル接頭辞,及びファイル出力オプションのどれかがナル値の場合,結果もナル値になります。また,埋込み変数へのナル値の既定値設定機能を使用している場合は,IPアドレスだけを返却します。
-
通常の文字データの検索と同様に,WRITE指定の結果を受け取る埋込み変数が結果の長さよりも短い場合は,あふれた分を切り捨てて,実際の長さを標識変数に設定します。ただし,切り捨てる処理では,埋込み変数の長さはIPアドレスの最大長分を除いた(埋込み変数長−15)バイトとして処理するため,IPアドレスを付けた長さでは,埋込み変数に格納できる場合でも切り捨てが発生することがあります。
-
WRITE指定の結果を受け取る埋込み変数が15バイト未満の場合,エラーとなります。
(5) 出力するBLOBデータのファイルについての規則
-
出力BLOB値に指定したBLOBデータを,シングルサーバ,又はフロントエンドサーバのユニットのファイルに出力します。
-
WRITE指定の結果がナル値の場合,ファイルを作成しません。
-
WRITE指定のBLOBデータの実長が0バイトの場合は,0バイトの大きさのファイルを作成します。
-
出力したファイルは,BLOBデータだけを含む形式となります。実長の長さ情報は含みません。
-
UNIX版の場合,作成したファイルの所有者,及びモードは次のようになります。
所有者 :HiRDB管理者
グループ:HiRDB管理者と同じグループ
モード :rw-rw-rw-
-
検索結果の列数よりその検索結果を受け取る埋込み変数の指定数が少なく,かつWRITE指定の結果を受け取る埋込み変数がない場合は,ファイルを作成しません。
(6) 共通規則
-
WRITE指定は,最も外側の問合せ指定の選択式に単独で指定できます。
-
ORDER BY指定時のソートのキーになる項目には,WRITE指定は指定できません。
-
WITH句中の導出問合せ式では,選択式にWRITE指定は指定できません。
-
集合演算をする場合,対象となる導出表の列にWRITE指定は指定できません。
-
副問合せ(FROM句の導出表も含む)中の選択式には,WRITE指定は指定できません。
-
ビュー定義の導出問合せ式の選択式には,WRITE指定は指定できません。
-
INSERT文の問合せ指定の選択式には,WRITE指定は指定できません。
-
ルーチン中のSQL手続き文の問合せ指定では,WRITE指定は指定できません。
(7) 留意事項
-
作成したファイルの削除は,ユーザが行ってください。検索結果としてUAPにファイル名を返却した後,HiRDBは作成したファイルの操作(読み書き)はしませんが,次の点を留意する必要があります。
-
FETCH直後に削除する場合,同じカーソル検索の直前のFETCH結果とBLOB値が同じときは,同じファイル名を返却してファイルを再作成しないことがあります。この場合,直前のファイル名を記憶しておいて,ファイル名が変わったときに削除するような制御が必要となります。
-
カーソルクローズ後に削除する場合,無条件に削除できます。
-
トランザクション解決後は,無条件に削除できます。
-
-
障害,又はロールバックが発生しても,HiRDBは作成したファイルを削除しません。
-
通常,SQLエラーが発生した場合,該当するSQLで作成したファイルは削除されます。しかし,HiRDBサーバ内のファイル出力処理が完了した後にエラーが発生した場合は,ファイルを削除しないことがあります。例えば,HiRDBサーバからHiRDBクライアントへの結果返却の通信エラーなどがあります。
-
配列を使用したFETCH機能を使用している場合は,1回のFETCHで配列用要素数分のファイルが作成されるので,ディスク容量に留意してください。
-
ブロック転送機能を使用している場合は,最初のFETCHでブロック転送行数分のファイルを作成し,以降ブロック転送行数分のFETCH終了後の次のFETCHのたびにブロック転送行数分のファイル作成を繰り返すので,ディスク容量に留意してください。
-
ファイルを削除しないでいると,ディスク容量などOSの資源を圧迫することになるので注意してください。
-
ほかのトランザクションやカーソル検索とファイル名が重複すると,ファイルを互いに破壊する可能性があるので注意してください。例えば,トランザクションごと,カーソルごとにファイル接頭辞のディレクトリ名やファイル名を変えて,名前が重複しないようにすることをお勧めします。
-
WRITE指定の結果の文字列で切り捨てが発生した場合,完全なファイル名を取得できませんが,ファイルは作成するため,ディスク容量を圧迫しないように注意してください。
-
ファイル出力オプションに非同期出力を指定すると,OSに対して同期出力(即書き)を指定しないでBLOBデータファイルへ出力します。そのため,HiRDB内のファイル出力処理が終了しても,出力デバイスの高負荷などによってOSによるファイル出力処理が完結しないことがあります。その結果,クライアント側にファイル名が返却されても,タイミングによってはファイルが作成されていない場合や,作成が途中の状態になる場合があります。
ファイル出力オプションに非同期出力を指定しない場合は,上記のような状態は回避できますが,入出力のオーバヘッドが応答時間に大きく影響することに注意してください。
(8) 使用例
BLOBデータのファイル出力機能を使用した検索例を次に示します。
(a) BLOB列を検索する場合
表T1から,列C1,C2を検索します。このとき,C1のBLOBデータをファイル出力し,そのファイル名を取得します。
(b) BLOB属性の抽象データ型を検索する場合
表T2から,CONTAINS()が真となるADT1列を検索します。このとき,列値をEXTRACTS()の引数に渡した結果のBLOB値をファイルに出力し,ファイル名を取得します。なお,この例は全件ヒットした場合を示しています。