リテラルと定数値という用語の意味は同じで、固定データ値のことです。たとえば、'JACK'、'BLUE ISLAND'および'101'はすべて文字リテラルです。5001は数値リテラルです。文字リテラルは、一重引用符で囲みます。一重引用符を付けることで、Oracleは文字リテラルとスキーマ・オブジェクト名を区別します。
この項では、次の内容を説明します。
多くのSQL文とファンクションでは、文字リテラルと数値リテラルを指定する必要があります。式と条件の一部として、リテラルを指定できます。文字リテラルは'text
'の表記法を、各国文字リテラルはN'text'
の表記法を、数値リテラルはリテラルのコンテキストに応じてinteger
またはnumber
の表記法を使用して指定できます。これらの表記法の構文については、次の項で説明します。
Datetime(日時)またはInterval(期間)のデータ型をリテラルとして指定する場合は、データ型に含まれているオプションの精度を考慮する必要があります。Datetime(日時)およびInterval(期間)のデータ型をリテラルとして指定する場合の例は、「データ型」の関連する項を参照してください。
このマニュアルの他の箇所で、式、条件、SQLファンクションおよびSQL文の各構文に示されている'string'
に値を指定するときには、必ずこのテキスト・リテラルの表記法を使用してください。このマニュアルでは、テキスト・リテラル、文字リテラルおよび文字列は同じ用語として使用しています。テキスト、文字、文字列リテラルは必ず一重引用符で囲まれています。構文にchar
が使用されている場合、テキスト・リテラルを指定するか、または文字データに変換する他の式(たとえば、hr.employees
表のlast_name
列)を指定します。構文にchar
がある場合、一重引用符で囲む必要はありません。
string::=
ここで、N
またはn
は、各国語キャラクタ・セット(NCHAR
またはNVARCHAR2
データ)を使用してリテラルを指定します。デフォルトでは、この表記法を使用して入力したテキストは、サーバーで使用するときにデータベースのキャラクタ・セットによって各国語キャラクタ・セットに変換されます。テキスト・リテラルをデータベースのキャラクタ・セットに変換しているときにデータの消失を避けるためには、環境変数ORA_NCHAR_LITERAL_REPLACE
にTRUE
を設定してください。このように設定することで、n'
を透過的に内部で置き換え、SQLの処理中にテキスト・リテラルを保持します。
関連項目: N付き引用符で表されたリテラルの詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。 |
構文の上の方のブランチでは、次のようになります。
c
は、データベース・キャラクタ・セットの任意の要素です。リテラル内の一重引用符(')の前には、エスケープ文字を付ける必要があります。リテラル内で一重引用符を表すには、一重引用符を2つ使用します。
' 'は、テキスト・リテラルの始まりと終わりを示す2つの一重引用符です。
構文の下の方のブランチでは、次のようになります。
Q
またはq
は、代替引用メカニズムが使用されることを示します。このメカニズムを使用すると、様々なデリミタをテキスト文字列に使用できます。
一番外側の'
'
は、開始のquote_delimiter
の前と、終了のquote_delimiterの後に付ける2つの一重引用符です。
c
は、データベース・キャラクタ・セットの任意の要素です。c
で構成されるテキスト・リテラル内に引用符(")を含めることができます。また、一重引用符が直後に付かないquote_delimiter
も含めることができます。
quote_delimiter
は、空白、タブおよび改行文字を除く、任意のシングルバイト文字またはマルチバイト文字です。quote_delimiter
には一重引用符も使用できます。ただし、quote_delimiter
がテキスト・リテラル自体に使用されている場合は、一重引用符を直後に付けないようにしてください。
開始のquote_delimiter
が[
、{
、<
または(
のいずれかである場合、終了のquote_delimiter
も対応する]
、}
、>
または)
である必要があります。それ以外の場合は常に、開始および終了のquote_delimiter
は同じ文字である必要があります。
テキスト・リテラルは、次のようにCHAR
データ型とVARCHAR2
データ型の両方のプロパティを持ちます。
式と条件の中のテキスト・リテラルは、OracleによってCHAR
データ型として扱われ、空白埋め比較セマンティクスで比較されます。
テキスト・リテラルの最大長は4000バイトです。
有効なテキスト・リテラルの例を次に示します。
'Hello' 'ORACLE.dbs' 'Jackie''s raincoat' '09-MAR-98' N'nchar literal'
代替引用メカニズムを使用した場合の、有効なテキスト・リテラルの例を次に示します。
q'!name LIKE '%DBMS_%%'!' q'<'So,' she said, 'It's finished.'>' q'{SELECT * FROM employees WHERE last_name = 'Smith';}' nq'ï Ÿ1234 ï' q'"name like '['"'
固定小数点数および浮動小数点数を指定するには、数値リテラルの表記法を使用します。
このマニュアルの他の箇所で、式、条件、SQLファンクションおよびSQL文に示されているinteger
(整数)に値を指定するときには、必ずこの表記法を使用してください。
integer::=
digit
は、0、1、2、3、4、5、6、7、8、9のいずれかです。
有効なinteger(整数)の例を次に示します。
7 +255
このマニュアルの他の箇所で、式、条件、SQLファンクションおよびSQL文に示されているnumber
またはn
(数)に値を指定するときには、必ずこれらの表記法を使用してください。
number::=
それぞれの意味は、次のとおりです。
+または-は、正の値または負の値を示します。符号を指定しない場合、デフォルトは正の値です。
digit
は、0、1、2、3、4、5、6、7、8、9のいずれかです。
eまたはEは、数が科学表記法で指定されることを示します。Eの後の数字が指数を示します。指数は-130から125の範囲で指定します。
fまたはFは、数がBINARY_FLOAT
型の32ビットの2進浮動小数点数であることを示します。
dまたはDは、数がBINARY_DOUBLE
型の64ビットの2進浮動小数点数であることを示します。
f(F)およびd(D)を省略すると、数はNUMBER
型になります。
接尾辞f(F)およびd(D)は、浮動小数点数リテラルでのみサポートされます。文字列ではNUMBER
に変換されるため、サポートされません。たとえば、OracleがNUMBER
を想定している場合に、文字列'9'
を使用すると、文字列は数字の9に変換されます。ただし、文字列'9f'
を使用すると、変換は行われず、エラーが戻されます。
NUMBER
型の数値は、最大38桁の精度を記憶できます。NUMBER
、BINARY_FLOAT
またはBINARY_DOUBLE
で提供される精度以上の精度がリテラルに必要な場合、値は切り捨てられます。リテラルの範囲がNUMBER
、BINARY_FLOAT
またはBINARY_DOUBLE
でサポートされる範囲を超える場合、エラーが発生します。
数値リテラルはSQL構文要素であり、NLS設定の影響を受けません。数値リテラルの小数点区切り文字は常にピリオド(.)です。ただし、数値が想定されるテキスト・リテラルが指定されている場合、テキスト・リテラルはNLSの影響を受ける方法で暗黙的に数値に変換されます。テキスト・リテラルに含まれている小数点区切りは、初期化パラメータNLS_NUMERIC_CHARACTERS
で設定されたものである必要があります。SQLスクリプトで数値リテラルを使用して、NLS環境から独立して動作させることをお薦めします。
次の例では、数値リテラルおよびテキスト・リテラルの小数点区切りの動作を示します。これらの例では、次の文を使用し、現行のセッションで(,)をNLS小数点区切りとして確立したと想定ます。
ALTER SESSION SET NLS_NUMERIC_CHARACTERS=',.';
また、前述の文では、ピリオド(.)をNLSグループ区切りとして確立しますが、これらの例には関係しません。
この例では、必要な小数点区切り(.)を数値リテラル1.23
で使用し、確立されたNLS小数点区切り(,)をテキスト・リテラル'2,34'
で使用します。テキスト・リテラルは数値2.34に変換され、出力は小数点区切りにカンマを使用して表示されます。
SELECT 2 * 1.23, 3 * '2,34' FROM DUAL; 2*1.23 3*'2,34' ---------- ---------- 2,46 7,02
次の例では、カンマは数値リテラルの部分として扱われていません。カンマは、2つの数値式、2*1
および23
のリスト内のデリミタとして扱われます。
SELECT 2 * 1,23 FROM DUAL; 2*1 23 ---------- ---------- 2 23
次の例では、テキストから数値への明示的な変換が成功するために、テキスト・リテラル内の小数点区切りとNLS小数点区切りが一致する必要があります。小数点区切り(.)が確立されたNLS小数点セパレータ(,)と一致しないため、次の文は失敗します。
SELECT 3 * '2.34' FROM DUAL; * ERROR at line 1: ORA-01722: invalid number
有効なNUMBER
リテラルの例を次に示します。
25 +6.34 0.5 25e-03 -1
有効な浮動小数点数リテラルの例を次に示します。
25f +6.34F 0.5d -1D
値を数値リテラルとして表現できない場合は、次の浮動小数点リテラルを使用することもできます。
リテラル | 意味 | 例 |
---|---|---|
binary_float_nan |
IS NAN 条件がtrueであるBINARY_FLOAT 型の値 |
SELECT COUNT(*) FROM employees WHERE TO_BINARY_FLOAT(commission_pct) != BINARY_FLOAT_NAN; |
binary_float_infinity |
単精度の正の無限大 |
SELECT COUNT(*) FROM employees WHERE salary < BINARY_FLOAT_INFINITY; |
binary_double_nan |
IS NAN 条件がtrueであるBINARY_DOUBLE 型の値 |
SELECT COUNT(*) FROM employees WHERE TO_BINARY_FLOAT(commission_pct) != BINARY_FLOAT_NAN; |
binary_double_infinity |
倍精度の正の無限大 |
SELECT COUNT(*) FROM employees WHERE salary < BINARY_DOUBLE_INFINITY; |
Oracle Databaseは、DATE
、TIMESTAMP
、TIMESTAMP
WITH
TIME
ZONE
およびTIMESTAMP
WITH
LOCAL
TIME
ZONE
の4つの日時データ型をサポートしています。
日付リテラル DATE
値を文字列リテラルに指定するか、文字値や数値をTO_DATE
ファンクションによって日付値に変換できます。Oracle Databaseが文字列リテラルのかわりにTO_DATE
式を受け入れるのは、DATE
リテラルの場合だけです。
DATE
値をリテラルに指定する場合は、グレゴリオ暦を使用する必要があります。次の例に示すように、ANSIのリテラルを指定できます。
DATE '1998-12-25'
ANSIの日付リテラルには、時刻部分を含めず、書式'YYYY-MM-DD
'で指定する必要があります。また、次のように、Oracleの日付値を指定できます。
TO_DATE('98-DEC-25 17:30','YY-MON-DD HH24:MI')
OracleのDATE
値のデフォルトの日付書式は、初期化パラメータNLS_DATE_FORMAT
で指定します。この例は、日付としての2桁の数、月の名前の省略形、年の下2桁および24時間表記の時刻を含む日付書式です。
デフォルト日付書式の文字値が日付式で使用されると、Oracleは自動的にそれらを日付値に変換します。
日付値を指定する場合に時刻コンポーネントを指定しないと、デフォルト時刻の真夜中(24時間表記では00:00:00、12時間表記では12:00:00)が採用されます。日付値を指定する場合に日付を指定しないと、デフォルト日付である現在の月の最初の日が採用されます。
OracleのDATE
列には、常に、日付フィールドと時刻フィールドが含まれます。したがって、DATE
列を問い合せる場合は、問合せで時刻フィールドを指定するか、またはDATE
列の時刻フィールドが真夜中に設定されていることを確認する必要があります。そうでない場合、Oracleは、正しい結果を戻さない場合があります。時刻フィールドを真夜中に設定するには、TRUNC
日付ファンクションを使用します。また、問合せに、等価性や非等価性の条件のかわりに大/小条件を含めることもできます。
次の例では、数値列row_num
およびDATE
列datecol
を持つ表my_table
があると想定します。
INSERT INTO my_table VALUES (1, SYSDATE); INSERT INTO my_table VALUES (2, TRUNC(SYSDATE)); SELECT * FROM my_table; ROW_NUM DATECOL ---------- --------- 1 03-OCT-02 2 03-OCT-02 SELECT * FROM my_table WHERE datecol > TO_DATE('02-OCT-02', 'DD-MON-YY'); ROW_NUM DATECOL ---------- --------- 1 03-OCT-02 2 03-OCT-02 SELECT * FROM my_table WHERE datecol = TO_DATE('03-OCT-02','DD-MON-YY'); ROW_NUM DATECOL ---------- --------- 2 03-OCT-02
DATE
列の時刻フィールドが真夜中に設定されている場合は、前述の例に示すように、DATE
列に対して問い合せるか、DATE
リテラルを使用して問い合せることができます。
SELECT * FROM my_table WHERE datecol = DATE '2002-10-03'; ROW_NUM DATECOL ---------- --------- 2 03-OCT-02
ただし、DATE
列が真夜中以外の値を含む場合、正しい結果を得るためには、問合せで時刻フィールドを排除する必要があります。次に例を示します。
SELECT * FROM my_table WHERE TRUNC(datecol) = DATE '2002-10-03'; ROW_NUM DATECOL ---------- --------- 1 03-OCT-02 2 03-OCT-02
Oracleは、問合せの各行にTRUNC
ファンクションを適用します。これによって、データの時刻フィールドが真夜中である場合、パフォーマンスが向上します。時刻フィールドを真夜中に設定するには、挿入および更新時に次のいずれかの操作を行います。
TO_DATE
ファンクションを使用して、時刻フィールドをマスクします。
INSERT INTO my_table VALUES (3, TO_DATE('3-OCT-2002','DD-MON-YYYY'));
DATE
リテラルを使用します。
INSERT INTO my_table VALUES (4, '03-OCT-02');
TRUNC
ファンクションを使用します。
INSERT INTO my_table VALUES (5, TRUNC(SYSDATE));
日付ファンクションSYSDATE
は、現在のシステムの日付および時刻を戻します。CURRENT_DATE
ファンクションは、現在のセッションの日付を戻します。SYSDATE
、TO_*
日時ファンクションおよびデフォルト日付書式の詳細は、「日時ファンクション」を参照してください。
TIMESTAMPリテラル TIMESTAMP
データ型は、年、月、日、時、分、秒、および秒の小数部の値を格納します。TIMESTAMP
をリテラルに指定する場合、fractional_seconds_precision
値には最大9桁を指定できます。次に例を示します。
TIMESTAMP '1997-01-31 09:26:50.124'
TIMESTAMP WITH TIME ZONEリテラル TIMESTAMP
WITH
TIME
ZONE
データ型は、タイムゾーン地域名またはタイムゾーン・オフセットを含むTIMESTAMP
の変形です。TIMESTAMP
WITH
TIME
ZONE
をリテラルに指定する場合、fractional_seconds_precision
値には最大9桁を指定できます。次に例を示します。
TIMESTAMP '1997-01-31 09:26:56.66 +02:00'
2つのTIMESTAMP
WITH
TIME
ZONE
値がUTCで同じ時刻を表す場合は、データに格納されたTIME
ZONE
オフセットにかかわらず、同一であるとみなされます。次に例を示します。
TIMESTAMP '1999-04-15 8:00:00 -8:00'
前述の例文は次の例文と同じです。
TIMESTAMP '1999-04-15 11:00:00 -5:00'
太平洋標準時の午前8時は、東部標準時の午前11時と同じです。
UTCオフセットをTZR
(タイムゾーン地域名)書式要素に置換できます。次の例では、前述の例と同じ値を持ちます。
TIMESTAMP '1999-04-15 8:00:00 US/Pacific'
夏時間に切り替えられる境界のあいまいさを排除するには、TZR
および対応するTZD
書式要素の両方を使用します。次の例では、前述の例が確実に夏時間の値を戻します。
TIMESTAMP '1999-10-29 01:30:00 US/Pacific PDT'
タイムゾーン・オフセットは日時式を使用して表記することもできます。
SELECT TIMESTAMP '2009-10-29 01:30:00' AT TIME ZONE 'US/Pacific' FROM DUAL;
ERROR_ON_OVERLAP_TIME
セッション・パラメータをTRUE
に設定しておくと、TZD
書式要素を追加しなかったために日時値があいまいな場合、Oracleはエラーを戻します。パラメータをFALSE
に設定しておくと、Oracleはあいまいな日時を、指定した地域の標準時刻として解析します。
TIMESTAMP WITH LOCAL TIME ZONEリテラル TIMESTAMP
WITH
LOCAL
TIME
ZONE
データ型は、TIMESTAMP
WITH
TIME
ZONE
とは異なり、データベースに格納されるデータはデータベースのタイムゾーンに正規化されます。タイムゾーン・オフセットは、列データの一部として格納されません。TIMESTAMP
WITH
LOCAL
TIME
ZONE
にはリテラルはありません。他の有効な日時リテラルを使用してこのデータ型の値を示してください。次の表には、TIMESTAMP
WITH
LOCAL
TIME
ZONE
列に値を挿入するときに使用できる一部の書式と、問合せによって戻される対応する値を示します。
INSERT文の中で指定する値 | 問合せによって戻される値 |
---|---|
'19-FEB-2004' |
19-FEB-2004.00.00.000000 AM |
SYSTIMESTAMP |
19-FEB-04 02.54.36.497659 PM |
TO_TIMESTAMP('19-FEB-2004', 'DD-MON-YYYY') |
19-FEB-04 12.00.00.000000 AM |
SYSDATE |
19-FEB-04 02.55.29.000000 PM |
TO_DATE('19-FEB-2004', 'DD-MON-YYYY') |
19-FEB-04 12.00.00.000000 AM |
TIMESTAMP'2004-02-19 8:00:00 US/Pacific' |
19-FEB-04 08.00.00.000000 AM |
指定した値に時刻コンポーネントがない場合(明示的または暗黙的に)、デフォルトの午前0時の値が戻されます。
期間リテラルは期間を指定します。年および月、または日付、時間、分および秒の違いを指定できます。Oracle Databaseは、YEAR
TO
MONTH
およびDAY
TO
SECOND
の2種類の期間リテラルをサポートします。各リテラルは先行フィールドを含み、後続フィールドを含むこともあります。先行フィールドは、計測する日付または時刻の基本単位を定義します。後続フィールドは、考慮する基本単位の最小増分値を定義します。たとえば、YEAR
TO
MONTH
期間では、最も近い月に対する年との期間が考慮されます。DAY
TO
MINUTE
期間では、最も近い分に対する日との期間が考慮されます。
数値形式の日付データがある場合、NUMTOYMINTERVAL
またはNUMTODSINTERVAL
変換ファンクションを使用して、数値データを期間値へ変換できます。
期間リテラルは、主に分析ファンクションとともに使用します。
次の構文を使用して、YEAR
TO
MONTH
期間リテラルを指定します。
interval_year_to_month::=
それぞれの意味は、次のとおりです。
'integer [-integer]'
には、リテラルの先行フィールドおよびオプションの後続フィールドの整数値を指定します。先行フィールドがYEAR
で、後続フィールドがMONTH
の場合、MONTHフィールドの整数値の範囲は0から11です。
precision
は、先行フィールドの桁数です。先行フィールド精度の有効範囲は0から9で、デフォルトは2です。
先行フィールドの制限事項: 後続フィールドを指定する場合は、その桁数を先行フィールドの桁数より少なく設定する必要があります。たとえば、INTERVAL
'0-1
' MONTH
TO
YEAR
は無効です。
次のINTERVAL
YEAR
TO
MONTH
リテラルは、intervalが123年2か月であることを示しています。
INTERVAL '123-2' YEAR(3) TO MONTH
このリテラルの他の書式の例を次に示します。省略バージョンも含みます。
期間リテラルの書式 | 説明 |
---|---|
INTERVAL '123-2' YEAR(3) TO MONTH |
123年2か月のintervalを示します。先行フィールド精度がデフォルトの2桁より大きい場合、その精度を指定してください。 |
INTERVAL '123' YEAR(3) |
123年0か月のintervalを示します。 |
INTERVAL '300' MONTH(3) |
300か月のintervalを示します。 |
INTERVAL '4' YEAR |
INTERVAL '4-0' YEAR TO MONTH へマップし、4年を示します。 |
INTERVAL '50' MONTH |
INTERVAL '4-2' YEAR TO MONTH へマップし、50か月(4年2か月)を示します。 |
INTERVAL '123' YEAR |
デフォルト精度は2ですが、123が3桁のため、エラーを戻します。 |
あるINTERVAL
YEAR
TO
MONTH
リテラルを別のリテラルに加算または減算して、新しいINTERVAL
YEAR
TO
MONTH
リテラルを作成できます。次に例を示します。
INTERVAL '5-3' YEAR TO MONTH + INTERVAL'20' MONTH = INTERVAL '6-11' YEAR TO MONTH
次の構文を使用して、DAY
TO
SECOND
期間リテラルを指定します。
interval_day_to_second::=
それぞれの意味は、次のとおりです。
integer
は日数を指定します。ここで指定した値の桁数が先行精度で指定した桁数より大きい場合、Oracleはエラーを戻します。
time_expr
には、HH
[
:MI
[
:SS
[
.n
]]]
、MI
[
:SS
[
.n
]]
またはSS
[
.n
]
の形式で時間を指定します(ここで、n
は秒の小数部を指定します)。n
の桁数が、fractional_seconds_precision
で指定した数より多い場合、n
はfractional_seconds_precision
値で指定した数に丸められます。先行フィールドがDAYの場合にのみ、1桁の整数および1つの空白の後に
time_exprを指定できます。
leading_precision
は、先行フィールドの桁数です。有効範囲は0から9です。デフォルトは2です。
fractional_seconds_precision
は、SECOND
日時フィールドの小数部の桁数です。有効範囲は1から9です。デフォルトは6です。
先行フィールドの制限事項: 後続フィールドを指定する場合は、その桁数を先行フィールドの桁数より少なく設定する必要があります。たとえば、INTERVAL
MINUTE
TO
DAY
は無効です。このため、SECOND
が先行フィールドの場合、期間リテラルは後続フィールドを持つことができません。
後続フィールドの有効範囲は次のとおりです。
HOUR
: 0から23
MINUTE
: 0から59
SECOND
: 0から59.999999999
様々なINTERVAL
DAY
TO
SECOND
リテラルの書式の例を次に示します。省略バージョンも含みます。
期間リテラルの書式 | 説明 |
---|---|
INTERVAL '4 5:12:10.222' DAY TO SECOND(3) |
4日5時間12分10.222秒を示します。 |
INTERVAL '4 5:12' DAY TO MINUTE |
4日5時間12分を示します。 |
INTERVAL '400 5' DAY(3) TO HOUR |
400日5時間を示します。 |
INTERVAL '400' DAY(3) |
400日を示します。 |
INTERVAL '11:12:10.2222222' HOUR TO SECOND(7) |
11時間12分10.2222222秒を示します。 |
INTERVAL '11:20' HOUR TO MINUTE |
11時間20分を示します。 |
INTERVAL '10' HOUR |
10時間を示します。 |
INTERVAL '10:22' MINUTE TO SECOND |
10分22秒を示します。 |
INTERVAL '10' MINUTE |
10分を示します。 |
INTERVAL '4' DAY |
4日を示します。 |
INTERVAL '25' HOUR |
25時間を示します。 |
INTERVAL '40' MINUTE |
40分を示します。 |
INTERVAL '120' HOUR(3) |
120時間を示します。 |
INTERVAL '30.12345' SECOND(2,4) |
30.1235秒を示します。精度は4のため、秒の小数部'12345'は'1235'に丸められます。 |
DAY
TO
SECOND
期間リテラルを別のDAY
TO
SECOND
期間リテラルに加算または減算できます。次に例を示します。
INTERVAL'20' DAY - INTERVAL'240' HOUR = INTERVAL'10-0' DAY TO SECOND