6.2 LOBに対するSQL操作のセマンティクスの詳細
この項では、LOBに対するSQL操作のセマンティクスの詳細を説明します。
- LOBに対するSQL操作用の戻りデータ型
LOBに対するSQLファンクションの戻りデータ型は、入力パラメータに依存します。 - NULLとEMPTY LOB: LOBとVARCHAR2のセマンティクスの違い
VARCHAR2
データ型の場合、長さゼロの文字列は列のNULL
値と区別できません。 - WHERE句のLOBでの使用方法
WHERE
句の述語では、LOB値を比較する関数を除き、LOBを引数として使用するSQL関数を使用できます。 - CLOBおよびNCLOBはセッション照合設定に従わない
CLOB
およびNCLOB
の様々な演算子について説明し、この項のLOBに関するVARCHAR2
およびNVARCHAR2
変数の操作を比較します。 - コードポイント・セマンティクス
INSTR
、SUBSTR
、LENGTH
およびLIKE
関数のコードポイント・セマンティクスは、ファンクションに渡される引数のデータ型に応じて異なります。
親トピック: LOBに対するSQLセマンティクス
6.2.1 LOBに対するSQL操作の戻りデータ型
LOBに対するSQL関数の戻りデータ型は、入力パラメータによって異なります。
LOBまたはVARCHAR2
を取るファンクションまたは演算子の戻り型は、そのファンクションや演算子に渡された引数のデータ型と同じです。CONCAT
など、2つ以上の引数を取るファンクションは、1つ以上の引数がLOBであればLOBデータ型を戻します。
例6-1 CLOB
を返すCONCAT
関数
CONCAT(CLOB, VARCHAR2)
は、CLOB
を返します。
SQLファンクションから戻されるLOBインスタンスは、すべて一時LOBインスタンスです。SQLファンクションが問合せのSELECT
構文のリストに使用されている場合にも、そのファンクションにより表内のLOBインスタンス(永続LOB)が変更されることはありません。
親トピック: LOBに対するSQL操作のセマンティクスの詳細
6.2.2 NULLとEMPTY LOB: LOBとVARCHAR2のセマンティクスの違い
VARCHAR2
データ型の場合、長さゼロの文字列は列のNULL
値と区別できません。
LOB
データ型の列には、次の3つの状態が考えられます。
NULL
: 列にLOBロケータがないことを意味します。- 長さゼロの値: これを実現するには、
EMPTY LOB
を列に挿入するか、DBMS_LOB.TRIM()
などのAPIを使用して長さをゼロに切り捨てます。いずれの場合も、列には有効なLOBロケータがありますが、LOB値の長さはゼロです。 - ゼロ以外の長さの値。
LENGTH
関数は、渡される引数がLOB
であるか文字列であるかに応じて異なります。
- 長さがゼロの文字列の場合、
LENGTH
関数はNULL
を返します。 - 長さ0(ゼロ)の
CLOB
の場合、またはEMPTY_CLOB()
の戻り値のように空のロケータの場合、LENGTH
およびDBMS_LOB.GETLENGTH
ファンクションは0(ゼロ)を戻します。
IS NULL
およびIS NOT NULL
演算子によってLOBロケータが行に格納されているかどうかが判別されます。
IS NULL
関数に長さ0 (ゼロ)の初期化済LOBを渡すと、FALSE
が返されます。これらのセマンティクスは、SQL 92標準に準拠しています。IS NULL
関数に長さ0(ゼロ)のVARCHAR2
を渡すと、TRUE
が戻されます。
親トピック: LOBに対するSQL操作のセマンティクスの詳細
6.2.3 LOBでのWHERE句の使用方法
WHERE
句の条件には、LOB値を比較するファンクションを除き、引数としてLOBを取るSQLファンクションを使用できます。
たとえば、WHERE
句の条件にLENGTH
ファンクションを含めることができます。
CREATE TABLE t (n NUMBER, c CLOB); INSERT INTO t VALUES (1, 'abc'); SELECT * FROM t WHERE c IS NOT NULL; SELECT * FROM t WHERE LENGTH(c) > 0; SELECT * FROM t WHERE c LIKE '%a%'; SELECT * FROM t WHERE SUBSTR(c, 1, 2) LIKE '%b%'; SELECT * FROM t WHERE INSTR(c, 'b') = 2;
親トピック: LOBに対するSQL操作のセマンティクスの詳細
6.2.4 セッション照合設定に従わないCLOBおよびNCLOB
CLOB
およびNCLOB
の様々な演算子について学習し、この項のLOBに関するVARCHAR2
およびNVARCHAR2
変数の操作を比較します。
CLOB
およびNCLOB
を最初にVARCHAR2
またはNVARCHAR2
に変換せずに操作する標準演算子は、表7-1のSQL列またはPL/SQL列で「はい」とマークされます。これらの演算子は、REGEXP
関数を除き、言語的には動作しません。文字データのバイナリ比較は、NLS_COMP
およびNLS_SORT
パラメータ設定に関係なく実行されます。
次のREGEXP
ファンクションは、CLOB
またはNCLOB
データが渡され、言語的比較がVARCHAR2
およびNVARCHAR2
の値の比較と類似している場合に、例外です。
-
REGEXP_LIKE
-
REGEXP_REPLACE
-
REGEXP_INSTR
-
REGEXP_SUBSTR
-
REGEXP_COUNT
ノート:
CLOBとNCLOBはデフォルトのUSING NLS_COMPオプションをサポートします。関連項目:
NLS_COMP
の詳細は、Oracle Databaseリファレンスを参照してください。
親トピック: LOBに対するSQL操作のセマンティクスの詳細
6.2.5 コードポイント・セマンティクス
INSTR
、SUBSTR
、LENGTH
およびLIKE
関数のコードポイント・セマンティクスは、ファンクションに渡される引数のデータ型に応じて異なります。
これらのファンクションでは、次のように、引数がVARCHAR2
型かCLOB
型かに応じて、異なるコードポイント・セマンティクスが使用されます。
-
引数が
CLOB
の場合は、すべての文字セットにUCS2コードポイント・セマンティクスが使用されます。 -
引数が
VARCHAR2
などのキャラクタ・タイプの場合は、指定の文字セットにデフォルトのコードポイント・セマンティクスが使用されます。-
AL16UTF16およびUTF8文字セットにはUCS2コードポイント・セマンティクスが使用されます。
-
AL32UTF8など、他のすべての文字セットにはUCS4コードポイント・セマンティクスが使用されます。
-
-
文字データを
CLOB
またはNCLOB
に格納している場合、CLOB
やNCLOB
に対してデータの読取りまたは書込みを行うすべてのAPIの量パラメータとオフセット・パラメータが、UCS2コードポイントで指定されることに注意してください。一部の文字セットには、完全な1文字が、サロゲート・ペアと呼ばれる1つ以上のUCS2コードポイントで構成されるものがあります。この場合、指定した量またはオフセットが、完全な1文字に分かれないようにする必要があります。これは、文字の部分的な読取りや書込みを回避するためです。 -
Oracle Databaseは、SQL関数の場合やLOB APIを介して読取り/書込みを行う場合に、読取りまたは書込み境界で半サロゲート・ペアを検出するのに役立ちます。動作は次のとおりです。
-
開始オフセットがサロゲート・ペアの途中にある場合、読取り操作と書込み操作の両方でエラーが発生します。
-
読取り量で文字の一部のみが読み取られる場合は、1ずつ増分または減分して完全な文字を読み取ります。
ノート:
出力量が入力量と異なる場合があります。
-
書込み量によって文字の一部が上書きされる場合は、宛先
CLOB
またはNCLOB
の文字の一部が上書きされて既存のデータが破損しないようにするためにエラーが発生します。ノート:
このチェックは、
CLOB
またはNCLOB
の既存のデータにのみ適用されます。書込み操作で受け取るバッファの開始と終了が完全な文字になっていることは、ユーザーが確認する必要があります。
-
親トピック: LOBに対するSQL操作のセマンティクスの詳細