アルファベット順に文を説明します。databaseは、すべての文でデータベース接続を表しています。
用途
この文はLOB値を別のLOBの最後に追加します。
構文
EXEC SQL [AT [:]database] LOB APPEND :src TO :dst ;
ホスト変数
src (IN)
一意にソースLOBを参照する内部LOBロケータです。
dst (IN OUT)
一意に宛先LOBを参照する内部LOBロケータです。
使用上の注意
ソースLOBのデータが宛先LOBの最後にコピーされると、宛先LOBが最大4GBまで拡張されます。LOBが4GBを超えて拡張される場合は、エラーが発生します。
ソースおよび宛先LOBは、すでに存在している必要があります。また、宛先LOBは初期化されている必要があります。
ソースおよび宛先LOBの両方が、同じ内部LOB型であることが必要です。どちらのロケータに対しても、LOBバッファリングを有効にすると、エラーとなります。
用途
LOBまたはBFILEロケータを、別のロケータに割り当てます。
構文
EXEC SQL [AT [:]database] LOB ASSIGN :src to :dst ;
ホスト変数
src (IN)
コピー元のLOBまたはBFILEロケータ・ソース。
dst (IN OUT)
コピー先のLOBまたはBFILEロケータ。
使用上の注意
割当て後は、両方のロケータは同じLOB値を参照します。宛先LOBロケータは、初期化された有効な(ALLOCATEで割り当てられた)ロケータにしてください。
内部LOBでは、宛先ロケータが表に格納されている場合にのみ、ソース・ロケータのLOB値が宛先ロケータのLOB値にコピーされます。Pro*C/C++の場合は、宛先ロケータを含むオブジェクトに対してFLUSHを発行すると、LOB値がコピーされます。
BFILEロケータが内部LOBロケータに割り当てられている場合、またはその逆の場合には、エラーが戻されます。src LOBとdst LOBが同じ型でない場合にもエラーになります。
バッファリングが使用可能な内部LOBに対するソース・ロケータの場合、そのソース・ロケータがLOBバッファリング・サブシステム経由でLOB値を修正するために使用され、WRITE後にバッファに対してFLUSHしていないときは、ソース・ロケータを宛先ロケータに割り当てることはできません。これは、LOBバッファリング・サブシステムを介してLOB値を修正する場合、1つのLOBに対してロケータは1つしか使用できないためです。
用途
オープンされているLOBまたはBFILEをクローズします。
構文
EXEC SQL [AT [:]database] LOB CLOSE :src ;
ホスト変数
src (IN OUT)
クローズされるLOBまたはBFILEのロケータ。
使用上の注意
異なるロケータまたは同一ロケータを使用した場合でも、同一LOBを2回クローズするとエラーになります。外部LOBの場合は、BFILEが存在して一度もオープンされていない状態であれば、エラーは発生しません。
オープンしていたLOBをすべてクローズする前に、トランザクションをCOMMITするとエラーになります。トランザクションのROLLBACK時にオープンしているLOBは、クローズされず、すべて破棄されます。
用途
LOB値の全部または一部を別のLOBにコピーします。
構文
EXEC SQL [AT [:]database] LOB COPY :amt FROM :src [AT :src_offset] TO :dst [AT :dst_offset] ;
ホスト変数
amt (IN)
コピーするBLOBの最大バイト数またはCLOBおよびNCLOBの最大文字数。
src (IN)
ソースLOBのロケータ。
src_offset (IN)
CLOBまたはNCLOBの場合は、文字数。BLOBの場合は、バイト数。LOBの先頭で1から始まります。
dst (IN)
宛先LOBのロケータ。
dst_offset (IN)
宛先オフセット。src_offsetと同じルールが適用されます。
使用上の注意
データが宛先のオフセット以降にあらかじめ存在する場合は、ソース・データで上書きされます。宛先のオフセットがカレント・データの最後を超えている場合は、宛先LOBのカレント・データの最後から新しく書き込まれたソース・データの先頭まで、ゼロバイト充填文字(BLOB)または空白(CLOB)が書き込まれます。
新規に書き込むデータが宛先LOBの現行の長さよりも大きい場合、宛先LOBは、そのデータにあわせて拡張されます。4GBを超えてLOBが拡張されると、ランタイム・エラーが発生します。
初期化されていないLOBからコピーすると、エラーになります。
ソースLOBおよび宛先LOBは、同じ型である必要があります。LOBバッファリングは、ロケータのどちらに対しても使用可能にしないでください。
amt
変数は、コピーの最大量です。指定した量がコピーされる前にソースLOBの最後に到達した場合、操作はORA-22993
エラーで終了します。
テンポラリLOBを永続LOBにするには、COPY文を使用して、テンポラリLOBを永続LOBに明示的にCOPYする必要があります。
用途
一時LOBを作成します。
構文
EXEC SQL [AT [:]database] LOB CREATE TEMPORARY :src ;
ホスト変数
src (IN OUT)
実行前はINで、src
は、以前にALLOCATEされたLOBロケータです。
実行後でOUTになったときは、src
は新しい空の一時LOBをポイントするLOBロケータです。
使用上の注意
実行が正常に終了すると、ロケータはデータベース・サーバーに新しく作成された、表に依存しない一時LOBをポイントします。一時LOBは空で、長さゼロです。
セッション終了時に、すべての一時LOBは解放されます。テンポラリLOBに対するREADおよびWRITEでは、バッファ・キャッシュは経由されません。
用途
LOBロケータのLOBバッファリングを使用禁止にします。
構文
EXEC SQL [AT [:]database] LOB DISABLE BUFFERING :src ;
ホスト変数
src (IN OUT)
内部LOBロケータ。
使用上の注意
この文は、BFILEをサポートしていません。後続の読取りまたは書込みは、LBS経由では行われません。
注意:
この文では、LOBバッファリング・サブシステムの変更は暗黙的にフラッシュされないため、変更を有効にするにはFLUSH BUFFERコマンドを使用します。
用途
LOBロケータのLOBバッファリングを使用可能にします。
構文
EXEC SQL [AT [:]database] LOB ENABLE BUFFERING :src ;
ホスト変数
src (IN OUT)
内部LOBロケータ。
使用上の注意
この文は、BFILEをサポートしていません。後続の読取りおよび書込みは、LBSを経由して行われます。
用途
指定されたオフセットから始まる、指定された量のLOBデータを消去します。
構文
EXEC SQL [AT [:]database] LOB ERASE :amt FROM :src [AT :src_offset] ;
ホスト変数
amt (IN OUT)
入力は、消去するバイト数または文字数です。戻される出力は、実際に消去されたバイト数または文字数です。
src (IN OUT)
内部LOBロケータ。
src_offset (IN)
LOBの先頭からのオフセット。1から始まります。
使用上の注意
この文は、BFILEをサポートしていません。
実行後に消去された実際の文字/バイト数がamt
から戻されます。要求した文字数またはバイト数を消去する前にLOB値の最後に到達した場合は、実際の消去数と要求した消去数は異なります。LOBが空の場合は、amt
には、0文字/バイトが消去されたことを示します。
BLOBの場合は、消去とはゼロバイト充填文字で既存のLOB値を上書きすることです。CLOBの場合は、空白で既存のLOB値を上書きすることです。
用途
カレント・セッションでオープンしているBFILESをすべてクローズします。
構文
EXEC SQL [AT [:]database] LOB FILE CLOSE ALL ;
使用上の注意
クローズ処理が正常に終了しなかったためにセッションにオープンしているファイルが存在する場合は、FILE CLOSE ALL文を使用して、セッション内でオープンしているファイルをすべてクローズし、最初からファイル操作を再開できます。
用途
BFILEロケータのDIRECTORY別名およびFILENAMEを設定します。
構文
EXEC SQL [AT [:]database] LOB FILE SET :file DIRECTORY = :alias, FILENAME = :filename ;
ホスト変数
file (IN OUT)
DIRECTORY別名およびFILENAMEが設定されているBFILEロケータ。
alias (IN)
設定するDIRECTORY別名。
filename (IN)
設定するFILENAME。
使用上の注意
指定したBFILEロケータは、この文で使用する前に、ALLOCATEされている必要があります。
DIRECTORY別名およびFILENAMEは必須項目です。
DIRECTORY別名の最大長は30バイトです。FILENAMEの最大長は255バイトです。
DIRECTORY別名およびFILENAME属性は、CHARZ、STRING、VARCHAR、VARCHAR2およびCHARF以外の外部データ型ではサポートされません。
この文を外部LOBロケータ以外で使用すると、エラーになります。
用途
LOBのバッファをデータベース・サーバーに書き込みます。
構文
EXEC SQL [AT [:]database] LOB FLUSH BUFFER :src [FREE] ;
ホスト変数
src (IN OUT)
内部LOBロケータ。
使用上の注意
入力ロケータが参照するLOBからサーバーのデータベースLOBに、バッファ・データを書き込みます。
LOBバッファリングは、入力LOBロケータに対してすでに有効になっている必要があります。
デフォルトでのFLUSH操作では、バッファ・リソースの解放および別のバッファされたLOB操作への再割当ては行われません。ただし、バッファを明示的に解放する場合は、オプションのFREEキーワードを使用して指定できます。
用途
LOBロケータ用に一時領域を解放します。
構文
EXEC SQL [AT [:]database] LOB FREE TEMPORARY :src ;
ホスト変数
src (IN OUT)
テンポラリLOBをポイントしているLOBロケータ。
使用上の注意
入力ロケータは、一時LOBをポイントしている必要があります。出力ロケータは、初期化されずに、後続のLOB文で使用されます。
用途
BFILEの一部または全部を、内部LOBにコピーします。
構文
EXEC SQL [AT [:]database] LOB LOAD :amt FROM FILE :file [AT :src_offset] INTO :dst [AT :dst_offset] ;
ホスト変数
amt (IN)
ロードされる最大バイト数。
file (IN OUT)
BFILEロケータのソース。
src_offset (IN)
ファイルの先頭からのオフセットのバイト数。1から始まります。
dst (IN OUT)
宛先LOBロケータ。BLOB、CLOBまたはNCLOBになります。
dst_offset (IN)
書込みが開始される宛先LOBの先頭からのバイト数(BLOBの場合)または文字数(CLOBおよびNCLOBの場合)。1から始まります。
使用上の注意
データは、ソースBFILEから宛先内部LOBにコピーされます。BFILEデータをCLOBまたはNCLOBにコピーする場合、キャラクタ・セットは変換されません。このため、BFILEデータは、あらかじめデータベース内のCLOBまたはNCLOBと同じキャラクタ・セットになっている必要があります。
ソースおよび宛先LOBは、すでに存在している必要があります。宛先の開始位置にすでにデータがある場合は、ソース・データで上書きされます。宛先の開始位置が現行のデータの最後を超える場合は、ゼロバイトの充填文字(BLOB)または空白(CLOBおよびNCLOB)が宛先LOBに書き込まれます。充填文字は、宛先LOBのデータの最後から、ソースから新しく書き込まれたデータの始まりまでに書き込まれます。
新規に書き込むデータが宛先LOBの現行の長さよりも大きい場合、宛先LOBは、そのデータにあわせて拡張されます。4GBを超えてLOBが拡張されると、エラーになります。
また、初期化されていないBFILEからコピーをすると、エラーになります。
amountパラメータは、ロードする最大量を示します。指定した量がロードされる前にソースBFILEの最後に到達した場合は、処理はORA-22993
エラーで終了します。
用途
読取り、または読取り/書込みアクセスのために、LOBまたはBFILEをオープンします。
構文
EXEC SQL [AT [:]database] LOB OPEN :src [ READ ONLY | READ WRITE ] ;
ホスト変数
src (IN OUT)
LOBまたはBFILEのLOBロケータ。
使用上の注意
LOBまたはBFILEをOPENできるデフォルト・モードは、READ ONLYアクセスです。
内部LOBの場合は、OPENはロケータではなくLOBに対応付けられます。すでにOPENされているロケータを別のロケータに割り当てても、新しいLOBをOPENしたとはみなされません。両方のロケータから同じLOBが参照されます。BFILEの場合は、OPENはロケータに対応付けられます。
同時にOPENできるLOBの最大数は32個です。33個目のLOBをOPENするとエラーが戻されます。
書込み可能なBFILEは、サポートしていません。このため、BFILEをREAD WRITEモードでOPENすると、エラーが戻されます。
LOBをREAD ONLYモードでオープンした後にWRITEすると、エラーになります。
用途
LOBまたはBFILEの一部または全部をバッファに読み込みます。
構文
EXEC SQL [AT [:]database] LOB READ :amt FROM :src [AT :src_offset] INTO :buffer [WITH LENGTH :buflen] ;
ホスト変数
amt (IN OUT)
入力は、読み込まれる文字数またはバイト数です。出力は、読み込まれた実際の文字数またはバイト数です。
読み込まれたバイト数がバッファ長より大きい場合は、LOBはポーリング・モードで読み込まれているとみなされます。入力時にこの値がゼロの場合は、データは入力オフセットからLOBの最後までポーリング・モードで読み込まれます。
実際に読み込まれるバイト数または文字数はamt
で戻されます。データがピース単位で読み込まれる場合、amt
には常に最後に読み込まれたピースが含まれます。
LOBの最後に到達した場合は、「ORA-01403: データが見つかりません。
」というエラーが発生します。
ポーリング・モードで読み込むときは、アプリケーションからLOB READを繰り返しコールし、データがなくなるまでLOBのピースを読み込む必要があります。ORA-01403
エラーを捕捉するには、WHENEVERディレクティブのNOT FOUND条件を使用してポーリング・モードの使用を制御します。
src (IN)
LOBまたはBFILEロケータ。
src_offset (IN)
読込みを開始する、LOB値の先頭からの絶対オフセットです。キャラクタLOBにおいては、これはLOBの先頭からの文字数を意味します。バイナリLOBまたはBFILEにおいては、これはバイト数を意味します。先頭位置は1です。
buffer (IN/OUT)
LOBデータが読み込まれるバッファ。バッファの外部データ型は、ソースLOBの型によって一定の型に制限されます。バッファの最大長は、LOB値を格納するために使用される外部データ型によって決まります。次の表では、有効な外部データ型および対応する最大長を、ソースLOB型単位に分類したものです。
表16-2 ソースLOBおよびプリコンパイラ・データ型
外部LOB(1) | 内部LOB | プリコンパイラの外部データ型 | プリコンパイラの最大長(2) | PL/SQLデータ型 | PL/SQL最大長 |
---|---|---|---|---|---|
BFILE |
BLOB |
RAW VARRAW LONG RAW LONG VARRAW |
65535 65533 2147483647 2147483643 |
RAW |
32767 |
BFILE |
CLOB |
VARCHAR2 VARCHAR LONG VARCHAR |
65535 65533 2147483643 |
VARCHAR2 |
32767 |
BFILE |
NCLOB |
NVARCHAR2 |
4000 |
NVARCHAR2 |
4000 |
脚注 1 これらの外部データ型は、BFILEで使用できます。
脚注 2 長さは、文字単位ではなく、バイト単位で計算されています。
buflen (IN)
他の方法で指定できないときは、指定したバッファ長が指定されます。
使用上の注意
BFILEはデータベース・サーバーにあらかじめ存在し、入力ロケータを使用してオープンされている必要があります。データベースにはファイルを読み込む権限が、またユーザーにはディレクトリの読取り権限が必要です。
初期化されていないLOBまたはBFILEからの読込みは、エラーとなります。
バッファの長さは、次のように決定されます。
WITH LENGTH句を指定した場合の、buflen
の値。
WITH LENGTH句がない場合は、OUTモードのバッファ・ホスト変数の指定によって決定されます。
用途
LOB値を切り捨てます。
構文
EXEC SQL [AT [:]database] LOB TRIM :src TO :newlen ;
ホスト変数
src (IN OUT)
内部LOBのLOBロケータ。
newlen (IN)
LOB値の新しい長さ。
使用上の注意
この文はBFILEには使用できません。新規の長さは、現行の長さより大きくは設定できません。大きく設定した場合は、エラーが戻されます。
用途
バッファの内容をLOBに書き込みます。
構文
EXEC SQL [AT [:]database] LOB WRITE [APPEND] [ FIRST | NEXT | LAST | ONE ] :amt FROM :buffer [WITH LENGTH :buflen] INTO :dst [AT :dst_offset] ;
ホスト変数
入力は、書き込まれる文字数またはバイト数です。
出力は、書き込まれた実際の文字数またはバイト数です。
ポーリング・メソッドを使用して書込みをした場合は、WRITE LAST文の実行後に、WRITE文実行時に書き込まれた累積合計長がamt
から戻されます。WRITE文が中断された場合は、amt
は定義されません。
LOBデータが書き込まれるバッファ。
関連項目:
データ型の長さは、READを参照してください。
LOBロケータ。
CLOBおよびNCLOBの場合は文字数単位、BLOBの場合はバイト数単位の、LOBの先頭からのオフセット(1から始まります)。
他の方法で計算できないときのバッファ長。
使用上の注意
LOBデータがすでに存在する場合は、バッファに格納されているデータで上書きされます。指定されたオフセットが、現在LOB内にあるデータの最後を超える場合は、ゼロバイト充填文字または空白がLOBに挿入されます。
WRITE文にキーワードAPPENDを指定すると、LOBの最後にデータが自動的に書き込まれます。APPENDを指定すると、宛先オフセットがLOBの最後とみなされます。WRITE文にAPPENDオプションを指定したときに、宛先オフセットを指定するとエラーになります。
バッファは、LOBに対して1ピースで書き込まれるか(デフォルトのONE方向変換を使用します)、標準のポーリング・メソッドを使用してピース単位で書き込むことができます。
FIRSTを使用してポーリングを開始し、NEXTで後続のピースを書き込みます。LASTキーワードは、書込みを終了する最後のピースの書込みに使用します。
このピース単位の書込みモードを使用すると、各ピースのサイズおよび場所が異なる場合に、バッファおよびバッファ長をコール単位に指定できます。
すべての書込みの終了後に渡される合計データ量が、amt
パラメータで指定した量よりも少ない場合は、エラーになります。
同じルールが、READ文のバッファ長の決定にも適用されます。
用途
この文は複数のOCIおよびPL/SQL文に相当します(このため最後に保存します)。LOB DESCRIBE SQL文を使用してLOBから属性を取り出します。この機能は、OCIおよびPL/SQLプロシージャに似ています。LOB DESCRIBE文の書式は次のとおりです。
構文
EXEC SQL [AT [:]database] LOB DESCRIBE :src GET attribute1 [{, attributeN}] INTO :hv1 [[INDICATOR] :hv_ind1] [{, :hvN [[INDICATOR] :hv_indN] }] ;
次の属性を指定できます。
CHUNKSIZE | DIRECTORY | FILEEXISTS | FILENAME | ISOPEN | ISTEMPORARY | LENGTH
ホスト変数
src (IN)
内部または外部LOBのLOBロケータ。
hv1 ... hvN ... (OUT)
属性値を受け取るホスト変数。属性名リストで指定した順に指定します。
hv_ind1 ... hv_indN ... (OUT)
インジケータNULL状態を受け取るオプションのホスト変数。属性名リストで指定した順に指定します。
この表では、属性、対応付けられるLOBおよび読み込まれるC言語のデータ型を説明します。
表16-3 LOB属性
LOB属性 | 属性の説明 | 制約 | C言語のデータ型 |
---|---|---|---|
CHUNKSIZE |
LOB値を格納するLOBチャンクに使用される領域の量(BLOBの場合はバイト数単位、CLOBまたはNCLOBの場合は文字数単位)。このチャンク・サイズの倍数でREADまたはWRITE要求を発行すると、パフォーマンスが向上します。すべてのWRITEを1つのチャンクで行うと、余分なバージョン化が実行されることも重複されることもありません。同一CHUNKに対してWRITEコールを複数回発行するかわりに、1つのチャンク内でWRITEコールを十分な数だけまとめることができます。 |
BLOB、CLOBおよびNCLOBのみ |
unsigned int |
DIRECTORY |
BFILEの場合は、DIRECTORY別名。最大長は30バイトです。 |
FILE LOBのみ |
char * Foot 3 |
FILEEXISTS |
サーバーのオペレーティング・システムのファイル・システム上に、BFILEが存在するかどうかを決定します。ゼロ以外の場合は、FILEEXISTは真、ゼロの場合は、偽です。 |
FILE LOBのみ |
signed int |
FILENAME |
BFILEの名前。最大長は255バイトです。 |
FILE LOBのみ |
char * |
ISOPEN |
BFILEの場合は、入力BFILEロケータがOPEN文で使用されなかった場合は、このロケータからはOPENされていないものとみなされます。ただし、別のBFILEロケータによって、BFILEがOPENされていることもあります。複数のロケータを使用して、同一BFILE上で複数のOPENを実行することもできます。LOBの場合は、別のロケータによりLOBがOPENされた場合も、その入力ロケータによってOPENされているとみなされます。ゼロ以外の場合は、ISOPENは真、ゼロの場合は、偽です。 |
- |
signed int |
ISTEMPORARY |
入力LOBロケータが一時LOBを参照するかどうかを決定します。ゼロ以外の場合は、ISTEMPORARYは真、ゼロの場合は、偽です。 |
BLOB、CLOBおよびNCLOBのみ |
signed int |
LENGTH |
BLOBおよびBFILEの長さはバイト数単位、CLOBおよびNCLOBの長さは文字数単位で表されます。BFILEの場合、EOFが存在するときは、EOFも長さに含まれます。空の内部LOBは、ゼロ長になります。初期化されていないLOBおよびBFILEの長さは、定義されません。 |
- |
unsigned int |
脚注3
DIRECTORY属性およびFILENAME属性の場合は、CHARZ、STRING、VARCHAR、VARCHAR2およびCHARF以外の外部データ型はサポートされません。
使用上の注意
標識変数は、short型で宣言します。実行が完了すると、sqlca.sqlerrd[2]にはエラーなしで取り出された複数の属性が戻されます。実行エラーが発生した場合、エラーが発生した属性は、sqlca.sqlerrd[2]の内容より1つ多くなります。
DESCRIBEの例
ここで、任意のBFILEからDIRECTORYおよびFILENAME属性を抽出する、簡単なPro*C/C++の例を示します。
次のOCIBFileLocator宣言で型の解決およびコンパイルを正しく行うには、oci.hヘッダー・ファイルが必要です。
#include <oci.h> ... OCIBFileLocator *bfile ; char directory[31], filename[256] ; short d_ind, f_ind ;
最後に、LOB表からBFILEロケータを選択し、DESCRIBEを実行します。
EXEC SQL ALLOCATE :bfile ; EXEC SQL SELECT a_bfile INTO :bfile FROM lob_table WHERE ... ; EXEC SQL LOB DESCRIBE :bfile GET DIRECTORY, FILENAME INTO :directory:d_ind, :filename:f_ind ;
標識変数は、DIRECTORYおよびFILENAME属性で使用するときにのみ有効です。属性値の保存に使用されるホスト変数バッファの大きさが不足している場合は、これらの属性値の文字列が切り捨てられることがあります。切捨てが発生した場合は、インジケータの値には属性の元の長さが設定されます。