行内のある列の値がない場合、その列はNULLである、またはNULLを含むといいます。
NOTNULL整合性制約またはPRIMARYKEY整合性制約によって制限されていない列の場合 は、どのデータ型の列でもNULLを含むことができます。実際のデータ値が不定または値に 意味がない場合に、NULLを使用してください。
NULLは値0(ゼロ)と同じではないため、0(ゼロ)を表すためにNULL値を使用しない
でください。(現在、Oracleは、長さが0(ゼロ)の文字値をNULLとして処理します。た だし、この処理はOracleの将来のバージョンでも継続されるとは限らないため、空の文字 列をNULLとして処理しないことをお薦めします。)NULLを含む算術式は、必ずNULLに 評価されます。たとえば、NULLに10を加算しても結果はNULLです。実際、オペランド にNULLを指定した場合、(連結演算子を除く)すべての演算子はNULLを戻します。
表 表表
表2-13 Oracle形式マッチング形式マッチング形式マッチング形式マッチング 元の書式要素
元の書式要素元の書式要素
元の書式要素 元の書式要素のかわりに試行元の書式要素のかわりに試行元の書式要素のかわりに試行元の書式要素のかわりに試行 する書式要素
する書式要素する書式要素 する書式要素
'MM' 'MON'および'MONTH'
'MON 'MONTH'
'MONTH' 'MON'
'YY' 'YYYY'
'RR' 'RRRR'
SQL 関数での 関数での 関数での 関数での NULL
引数としてNULLを指定した場合、(REPLACE、NVLおよびCONCATを除く)すべてのスカ ラー関数ではNULLが戻されます。NVL関数を使用した場合、NULLが発生したときに値 を戻すことができます。たとえば、NVL(COMM,0)は、COMMがNULLの場合は0(ゼロ)
を戻し、COMMがNULLでなければCOMMの値を戻します。
ほぼすべての集計関数では、NULLは無視されます。たとえば、1000、NULL、NULL、
NULL、2000という5つの値の平均を得る問合せを考えます。そのような問合せではNULL
は無視され、平均は(1000+2000)/2=1500となります。
比較演算子での 比較演算子での 比較演算子での 比較演算子での NULL
NULLを検査するには、比較演算子IS NULLおよびIS NOT NULLのみを使用します。
NULLを他の演算子で使用して、その結果がNULLの値に依存する場合、結果はUNKNOWN になります。NULLはデータの欠落を表すため、任意の値や別のNULLとの関係で等号や 不等号は成り立ちません。ただし、OracleはDECODE式を評価するときに2つのNULLを 等しい値とみなします。
コンポジット・キーの場合、2つのNULLは等しいと判断されます。NULLを含む2つのコ ンポジット・キーは、そのキーのNULL以外の構成要素のすべてが等しい場合、同一である と判断されます。
条件での 条件での 条件での 条件での NULL
UNKNOWNとして評価される条件は、FALSEと評価される場合とほとんど同じ働きをします。
たとえば、UNKNOWNと評価される条件をWHERE句に持つSELECT文からは、行が戻されま せん。ただし、UNKNOWNと評価される条件はFALSE条件とは異なり、UNKNOWN条件をさ らに評価してもUNKNOWNと評価されます。したがって、NOTFALSEはTRUEと評価されま すが、NOTUNKNOWNはUNKNOWNと評価されます。
表2-14は、条件にNULLを含む評価の例です。SELECT文のWHERE句でUNKNOWNと評価 される条件が使用された場合、その問合せに対して行は戻されません。
参照 参照参照
参照: 構文および追加情報の詳細は、5-13ページの「DECODE式」を参 照してください。
NULLを含む論理式の結果を示した真理値表は、3-12ページの表3-6、表3-7および表3-8 を参照してください。
疑似列 疑似列 疑似列 疑似列
疑似列 疑似列疑似列
疑似列は表の列のように使用できますが、実際に表に格納されているわけではありません。
疑似列から値を選択できますが、疑似列に対して値の挿入、更新、削除はできません。この 項では、次の疑似列について説明します。
■ CURRVALとNEXTVAL
■ LEVEL
■ ROWID
■ ROWNUM
CURRVAL と と と と NEXTVAL
順序は、一意の連続値を生成できるスキーマ・オブジェクトです。これらの値は、主キーや 一意のキーによく使用されます。次の疑似列を使用したSQL文で、順序値を参照できます。
表 表表
表2-14 NULLを含む条件を含む条件を含む条件を含む条件
Aの値の値の値の値 条件条件条件条件 評価結果評価結果評価結果評価結果
10 a IS NULL FALSE
10 a IS NOT NULL TRUE
NULL a IS NULL TRUE
NULL a IS NOT NULL FALSE
10 a = NULL UNKNOWN
10 a != NULL UNKNOWN
NULL a = NULL UNKNOWN
NULL a != NULL UNKNOWN
NULL a = 10 UNKNOWN
NULL a != 10 UNKNOWN
CURRVALとNEXTVALは、順序の名前で修飾する必要があります。
sequence.CURRVAL sequence.NEXTVAL
別のユーザーのスキーマ内での順序の現在の値または次の値を参照するには、その順序に対 するSELECTオブジェクト権限またはSELECTANYSEQUENCEシステム権限のどちらかが必 要です。さらに、その順序は、次に示すとおり、順序を含むスキーマで修飾する必要があり ます。
schema.sequence.CURRVAL schema.sequence.NEXTVAL
リモート・データベース上の順序の値を参照するには、次のように、データベース・リンク の完全な名前または部分的な名前で順序を修飾する必要があります。
schema.sequence.CURRVAL@dblink schema.sequence.NEXTVAL@dblink
順序値の使用場所 順序値の使用場所 順序値の使用場所 順序値の使用場所
次の場所でCURRVALとNEXTVALを使用できます。
■ 副問合せ、スナップショットまたはビューに含まれていないSELECT文のSELECT構文 のリスト
■ INSERT文内の副問合せのSELECT構文のリスト
■ INSERT文のVALUES句
■ UPDATE文のSET句
CURRVAL 順序の現在の値を戻します。
NEXTVAL 順序を増加させて次の値を戻します。
参照参照参照
参照: データベース・リンクの参照方法の詳細は、2-88ページの「リ モート・データベース内のオブジェクトの参照」を参照してください。
制限事項 制限事項制限事項
制限事項: 次の場所では、CURRVALとNEXTVALを使用できません。
■ DELETE文、SELECT文またはUPDATE文内の副問合せ
■ ビューの問合せ、またはマテリアライズド・ビューの問合せ
■ DISTINCT演算子を持つSELECT文
■ GROUPBY句またはORDERBY句を持つSELECT文
■ 集合演算子UNION、INTERSECTまたはMINUSによって別のSELECT文と結合されてい るSELECT文
■ SELECT文のWHERE句
■ CREATETABLE文またはALTERTABLE文の列のDEFAULT値
■ CHECK制約の条件
また、CURRVALまたはNEXTVALを使用する単一のSQL文では、参照されたLONG列、更 新された表、ロックされた表がすべて同じデータベース上にある必要があります。
順序値の使用方法 順序値の使用方法 順序値の使用方法 順序値の使用方法
順序を作成するときに、初期値と増分値を定義できます。NEXTVALの最初の参照によって、
順序の初期値が戻されます。その後の参照によって、定義されたNEXTVAL増分値で順序が 増加され、その新しい値が戻されます。CURRVALを参照すると、NEXTVALへの最後の参照 で戻された値である、順序の現在の値が常に戻されます。なお、セッションの順序に対して CURRVALを使用する前に、まずNEXTVALで順序を初期化してください。
単一のSQL文の中では、Oracleは行ごとに1回のみ順序を増加させます。1つの文の中で順 序に対して複数回NEXTVALを参照している場合、Oracleは1回のみ順序を増加させ、
NEXTVALが現れるたびにすべて同じ値を戻します。1つの文の中でCURRVALとNEXTVAL の両方を参照している場合、Oracleは順序を増加させ、それらが文の中で現れる順序にかか わらず、CURRVALとNEXTVALの両方に対して同じ値を戻します。
順序には、待機またはロックすることなく多数のユーザーが同時にアクセスできます。
順序の現在の値の検索 順序の現在の値の検索順序の現在の値の検索
順序の現在の値の検索: 例例例例 この例は、従業員順序の現在の値を選択します。
SELECT empseq.currval FROM DUAL;
参照 参照参照
参照: トランザクションの詳細は、9-149ページの「CREATE SEQUENCE」を参照してください。
表への順序値の挿入 表への順序値の挿入表への順序値の挿入
表への順序値の挿入: 例例例例 この例は、従業員順序を増加させ、従業員表に挿入される新しい 従業員のためにその値を使用します。
INSERT INTO emp
VALUES (empseq.nextval, 'LEWIS', 'CLERK', 7902, SYSDATE, 1200, NULL, 20);
順序の現在の値の再使用 順序の現在の値の再使用順序の現在の値の再使用
順序の現在の値の再使用: 例例例例 この例は、次の注文番号を使用して新しい注文をマスター注 文表に追加します。その後、この番号を使用して関連する注文をディテール注文表に追加し ます。
INSERT INTO master_order(orderno, customer, orderdate) VALUES (orderseq.nextval, 'Al''s Auto Shop', SYSDATE);
INSERT INTO detail_order (orderno, part, quantity) VALUES (orderseq.currval, 'SPARKPLUG', 4);
INSERT INTO detail_order (orderno, part, quantity) VALUES (orderseq.currval, 'FUEL PUMP', 1);
INSERT INTO detail_order (orderno, part, quantity) VALUES (orderseq.currval, 'TAILPIPE', 2);