次の図はリテラルの書式を示しています。
リテラルは値式の一種です(第2.6節を参照)。通常の値式を受け入れないSQL句の多くで、リテラル値が求められます。リテラル値は、数値、文字列または日付として使用できます。また、SQLでは、次のようにリテラルを示すキーワードが提供されています。
次の項では、それぞれのリテラルの種類について説明します。
2.4.1 数値リテラル
数値リテラルとは、SQLで10進数の値として解釈される数字の文字列のことです。数値リテラルは、次のものとして使用できます。
次の構文は、数値リテラルの書式を示しています。
SQLでは柔軟に数値を表現できます。単項の+および-を使用でき、またあらゆる書式の10進数表記を使用できます。有効な数値文字列の例を次に示します。
123
34.9
--123
.25
123.
0.33889909
6.03E+23
6.03E--23
数値リテラルを使用して列またはパラメータに値を代入する場合、列またはパラメータのデータ型によって、代入可能な最大値、および小数点の右側への値の代入が可能かどうかが決まります。列またはパラメータのデータ型が、数値リテラルにより示されるデータ型と異なる場合、リテラルが列またはパラメータのデータ型に変換されます。
第2.3節には、それぞれのSQLのデータ型に代入される数値リテラルの値の範囲が記載されています。
2.4.2 文字列リテラル
これらの文字列リテラルの種類の詳細は、第2.4.2.1項および第2.4.2.2項を参照してください。
2.4.2.1 引用符付き文字列リテラル
引用符付き文字列リテラルとは、一重引用符で囲まれた印刷可能文字で構成される文字列のことです。文字列の最大長は1,024オクテットです。修飾されていない文字列では、そのセッションのリテラル・キャラクタ・セットの文字のみを使用している必要があります。
! @ # $ % ^ & * ( ) - _ = + ` ~ [ ] { } ; : " \ | / ? > < . , |
DEC_MCSの印刷可能文字のリストは、OpenVMSのユーザー向けドキュメントを参照してください。 サポート対象のその他のキャラクタ・セットの印刷可能文字のリストは、そのキャラクタ・セットの規格を参照してください。各キャラクタ・セットの規格については、第2.1節を参照してください。
一対の一重引用符を使用して文字列リテラルを囲みます。二重引用符を使用すると、二重引用符は規格外であることを示す情報メッセージが表示されます。引用ルールがANSI/ISO SQLに設定されている場合、二重引用符はデリミタ付き識別子として渡されます。引用ルール設定の詳細は、「SET QUOTING RULES文」を参照してください。引用符の使用時には、次のルールに従ってください。
表2-14は、文字列リテラルにおける引用符の使用方法を示しています。
文字列 | 解釈される文字列 |
---|---|
'UNQUOTED LITERAL' | UNQUOTED LITERAL |
'"A LITERAL WITH QUOTES"' | "A LITERAL WITH QUOTES" |
'''ANOTHER ONE''' | 'ANOTHER ONE' |
'RICHARD "RICK"SMITH''S' | RICHARD "RICK"SMITH'S |
'Richard ''Rick''Smith ''s' | Richard 'Rick'Smith's |
'''' ''''' ' | '''' |
'"' | " |
"JONES' | 無効 |
SQLでは、文字列リテラルの大文字と小文字が区別されます。つまり、NAME = 'JONES'とNAME = 'Jones'では結果が異なります。比較の詳細は、第2.7節を参照してください。 |
キャラクタ・セット名で修飾された引用符付き文字列リテラルを使用できます。文字列には、指定されたキャラクタ・セットの文字のみを使用する必要があります。
キャラクタ・セットで修飾された文字列リテラルは、アンダースコア(_)で始まり、その後にサポートされているキャラクタ・セット名および引用符付き文字列が続きます。リテラルの外側で空白は使用できません。
次の例は、DEC_MCSおよびDEC_KANJIで文字列を修飾する方法を示しています。
_ DEC_MCS 'Blue' _ DEC_KANJI 'Blue' |
サポートされているキャラクタ・セット名は、第2.1節を参照してください。
2.4.2.1.2 各国語キャラクタ・セットで修飾された引用符付き文字列リテラル
各国語文字列リテラル、つまり各国語キャラクタ・セットで修飾された引用符付き文字列リテラルを使用できます。文字列には、各国語キャラクタ・セットの文字のみを使用する必要があります。
各国語文字列リテラルは、文字Nで始まり、その後に引用符付き文字列が続きます。リテラルの外側で空白は使用できません。
次の例は、各国語キャラクタ・セットで文字列を修飾する方法を示しています。
N'Blue' |
各国語キャラクタ・セットの詳細は、第2.1.7項を参照してください。
2.4.2.2 16進数文字列リテラル
16進数文字列リテラルはXで始まり、その後に一重引用符で囲まれた最大16文字の文字列が続きます。この種類の文字列リテラルでは、引用符内で文字の16進値を指定することにより、印刷不可能なASCII文字を表すことができます。
ASCII文字を表すには、1文字ごとに2桁の16進数が必要となります。このため、引用符内の文字数は偶数にする必要があります。16進数文字列リテラルで有効な文字は、0〜9およびA〜F(大文字または小文字)のみです。
次の例では、16進数文字列リテラルで2つの削除文字が表されています。ASCIIの削除文字の16進値はFFです。
X'FFFF' |
SQL文でリテラルを使用した日時データ型を参照する場合は、リテラルの前にデータ型名を記述し、一重引用符でリテラルを囲む必要があります。すべてのフィールドに対して、それぞれのフィールドの有効範囲内にある値を指定する必要があります。
次の構文は、日時リテラルの書式を示しています。
構文記述子y、d、hおよびsは、それぞれ年、日、時間および秒を示すフィールド内の1桁の数字を表します。文字mは、yの後に続く場合は月を示す1桁の数字、それ以外の場合は分を示す1桁の数字を表します。小数秒は、小数点の後の数字で表します。 |
日時リテラルの構文は、次のとおりです。
Examples: DATE ANSI '1993-05-27' DATE VMS '27-MAY-1993 15:25:00.00' |
SQLでは、2月29日に対してうるう年検証が行われます。
Example: TIME '14:23:45.19' |
TIMEリテラルでは、24時間表記で時間を表します。
Example: TIMESTAMP '1993-1-4 14:12:01.00' TIMESTAMP '1993-1-4:14:12:01.00' |
TIMESTAMPリテラルでは、2種類の書式を使用できます。SQL92の書式では、前述の例のように、日付部分と時間部分を空白文字で区切ります。規格外の書式では、日付部分と時間部分をコロン文字で区切ります。次に例を示します。
SQL> SET DEFAULT DATE FORMAT 'SQL92'; SQL> -- SQL> -- Create a table and insert several rows using the SQL92 format and SQL> -- the nonstandard format for the TIMESTAMP literal. SQL> -- SQL> CREATE TABLE t (a INTEGER, b TIMESTAMP(2) cont> DEFAULT TIMESTAMP '1995-1-1 12:34:10.01'); SQL> INSERT INTO t (a) VALUE (0); 1 row inserted SQL> -- SQL> -- Insert a row using the nonstandard format for the TIMESTAMP SQL> -- literal. SQL> -- SQL> INSERT INTO t (a,b) VALUE (1, TIMESTAMP '1995-1-1:12:34:10.01'); 1 row inserted SQL> -- SQL> -- Insert a row using the SQL92 format for the TIMESTAMP literal. SQL> -- SQL> INSERT INTO t (a,b) VALUE (2, TIMESTAMP '1995-1-1 12:34:10.01'); 1 row inserted SQL> -- SQL> -- Select the rows. SQL uses the SQL92 format to display the SQL> -- TIMESTAMP literal for all selected rows. SQL> -- SQL> SELECT a, b, CAST (b AS CHAR(30)) FROM t ORDER BY a; A B 0 1995-01-01 12:34:10.01 1995-01-01 12:34:10.01 1 1995-01-01 12:34:10.01 1995-01-01 12:34:10.01 2 1995-01-01 12:34:10.01 1995-01-01 12:34:10.01 3 rows selected |
Examples: INTERVAL '-1-2' YEAR TO MONTH INTERVAL '1:4:30:0.0' DAY TO SECOND INTERVAL '1:10' DAY TO HOUR INTERVAL '235' MONTH(3) |
次の構文は、期間リテラルの書式を示しています。
SQL> -- Create a table with a field of interval month(4). SQL> CREATE TABLE TEST_TABLE (TEST_COL INTERVAL MONTH(4)); SQL> -- SQL> -- Insert into the field using the literal INTERVAL '200' MONTH. SQL> INSERT INTO TEST_TABLE (TEST_COL) VALUE (INTERVAL '200' MONTH); %SQL-F-DATCONERR, Data conversion error for string '200' -COSI-F-IVTIME, invalid date or time SQL> -- SQL> -- The INTERVAL literal used does not provide a large enough SQL> -- leading-field precision. The default leading-field precision is 2, SQL> -- and 200 requires a minimum of 3 because it is 3 digits. SQL> -- To avoid the error, specify 3 as the leading-field precision SQL> -- instead of relying on the default. SQL> INSERT INTO TEST_TABLE (TEST_COL) VALUE (INTERVAL '200' MONTH(3)); 1 row inserted |
これらのデフォルトの書式以外に、SET DATE FORMAT文を使用して、時間および日付値の出力表示に対する代替書式を指定できます。(これらの代替書式は、日付文字列リテラル、および日付文字列リテラルとバイナリ日付との変換にのみ適用されます。ホスト言語によって8バイト(64ビット)OpenVMSの日時で設定されている日付は、SET DATE FORMAT文の影響を受けません。)
SET DATE FORMAT文は、DATE VMSデータ型の列の書式設定にのみ使用できます。SET DATE FORMAT文では、日付または時間(あるいはその両方)の出力書式のみが変更されます。入力書式を変更する場合は、論理名LIB$DT_INPUT_FORMATを使用します。論理名LIB$DT_INPUT_FORMATの詳細は、OpenVMSのランタイム・ライブラリ・ドキュメントを参照してください。
SET DATE FORMAT文の詳細は、「SET文」を参照してください。
YESTERDAY、TODAYおよびTOMORROWは、DATE VMS書式(第2.4.3項で説明されている書式dd-mmm-yyyy 00:00:00.00)に変換される3つの文字列リテラルです。この変換は、コンパイル時に実行されます。対話型SQLでは、YESTERDAY、TODAYおよびTOMORROWの各リテラルは、そのリテラルを含む文が実行される日を基準にした日付に変換されます。 ただし、YESTERDAY、TODAYおよびTOMORROWの各リテラルが含まれているプログラムをプリコンパイラまたはSQLモジュール言語で処理する場合、実行時にリテラルが変換される日付は、コンパイル日時を基準にした日付になります。つまり、これらのリテラルが含まれているプログラムを2003年1月4日にコンパイルすると、プログラムが実行される日付に関係なく、YESTERDAYは03-JAN-2003に、TODAYは04-JAN-2003に、そしてTOMORROWは05-JAN-2003に変換されます。この方法はお薦めしません。 次の方法を使用することをお薦めします。
|
先行および後続の空白は無視されますが、DBKEYの数値には空白を入れないようにしてください。
DBKEYが別の表を指しているか、書式が不適切であるか、または行を参照していない場合は、エラーが返されます。エラーは、次の例のように報告されます。文字列内に疑問符が配置され、構文エラーの場所が強調されます。
SQL> select * from employees where dbkey = _dbkey'1,2,3'; %RDB-F-CONVERT_ERROR, invalid or unsupported data conversion -RDMS-E-DBKFORMAT, database key format incorrect "1,?2,3" - unexpected character SQL> select * from employees where dbkey = _dbkey'-1:+2:0'; %RDB-F-CONVERT_ERROR, invalid or unsupported data conversion -RDMS-E-DBKFORMAT, database key format incorrect "-1:+?2:0" - unexpected character SQL> select * from employees where dbkey = _dbkey'23:1:1'; %RDB-E-NO_RECORD, access by dbkey failed because dbkey is no longer associated with a record -RDMS-F-INVDBK, 23:1:1 is not a valid dbkey |