ヘッダーをスキップ

Oracle Rdb SQLリファレンス・マニュアル リリース7.2 E06178-01 |
| 目次 | 索引

戻る | 次へ |

# 2.4 リテラル

リテラルは定数とも呼ばれ、値を指定します。

次の図はリテラルの書式を示しています。

リテラルは値式の一種です（第2.6節を参照）。通常の値式を受け入れないSQL句の多くで、リテラル値が求められます。リテラル値は、数値、文字列または日付として使用できます。また、SQLでは、次のようにリテラルを示すキーワードが提供されています。

- NULL

- CURRENT_DATE

- SYSTEM_USER

次の項では、それぞれのリテラルの種類について説明します。

## 2.4.1 数値リテラル

数値リテラルとは、SQLで10進数の値として解釈される数字の文字列のことです。数値リテラルは、次のものとして使用できます。

- 数字および任意の小数点で構成される10進数文字列。小数点を除いた最大長は19桁です。

- 文字Eによって区切られる、10進数文字列の仮数および符号付き整数の指数で構成される科学表記法（E表記）による10進数の値。E表記には、空白を埋め込むことはできません。

次の構文は、数値リテラルの書式を示しています。

SQLでは柔軟に数値を表現できます。単項の+および-を使用でき、またあらゆる書式の10進数表記を使用できます。有効な数値文字列の例を次に示します。

123
34.9
--123
.25
123.
0.33889909
6.03E+23
6.03E--23

数値リテラルを使用して列またはパラメータに値を代入する場合、列またはパラメータのデータ型によって、代入可能な最大値、および小数点の右側への値の代入が可能かどうかが決まります。列またはパラメータのデータ型が、数値リテラルにより示されるデータ型と異なる場合、リテラルが列またはパラメータのデータ型に変換されます。

第2.3節には、それぞれのSQLのデータ型に代入される数値リテラルの値の範囲が記載されています。

## 2.4.2 文字列リテラル

SQLでは、次の種類の文字列リテラルが認識されます。

- セッションのリテラル・キャラクタ・セットの印刷可能文字を示す、引用符付き文字列。

- キャラクタ・セット名で修飾された引用符付き文字列。文字列には、指定されたキャラクタ・セットの印刷可能文字が使用されます。

- 各国語キャラクタ・セットの印刷可能文字を示す、各国語文字列リテラル（引用符付き文字列の前にNを指定）。

- 印刷可能および印刷不可能なASCII文字を示す、16進数文字列（引用符付き文字列の前にXを指定）。

これらの文字列リテラルの種類の詳細は、第2.4.2.1項および第2.4.2.2項を参照してください。

### 2.4.2.1 引用符付き文字列リテラル

引用符付き文字列リテラルとは、一重引用符で囲まれた印刷可能文字で構成される文字列のことです。文字列の最大長は1,024オクテットです。修飾されていない文字列では、そのセッションのリテラル・キャラクタ・セットの文字のみを使用している必要があります。

印刷可能なASCII文字は、次の文字で構成されています。

- 大文字のアルファベット文字:
  A〜Z

- 小文字のアルファベット文字:
  a〜z

- 数字:
  0〜9

- 特殊文字:

      ! @ # $ % ^ & * ( ) - _ = + ` ~

      [ ] { } ; : " \ | / ? > < . ,

DEC_MCSの印刷可能文字のリストは、OpenVMSのユーザー向けドキュメントを参照してください。 サポート対象のその他のキャラクタ・セットの印刷可能文字のリストは、そのキャラクタ・セットの規格を参照してください。各キャラクタ・セットの規格については、第2.1節を参照してください。

一対の一重引用符を使用して文字列リテラルを囲みます。二重引用符を使用すると、二重引用符は規格外であることを示す情報メッセージが表示されます。引用ルールがANSI/ISO SQLに設定されている場合、二重引用符はデリミタ付き識別子として渡されます。引用ルール設定の詳細は、「SET QUOTING RULES文」を参照してください。引用符の使用時には、次のルールに従ってください。

- 文字列リテラルの最初と最後に、同じ種類の引用符を使用します。

- 二重引用符を文字列リテラルに含めるには、その文字列を一重引用符で囲みます。

- 引用符で囲む文字列リテラルの中に引用符が含まれている場合は、リテラルに含まれるそれぞれの引用符に対して、連続する2つの引用符を使用します。1つの引用符付き文字列内で両方の種類の引用符を使用する場合は、この技術を使用する必要があります。引用符の使用例は、表2-14を参照してください。

- 引用符付き文字列の文字列部分には、文字の整数が、指定されたキャラクタ・セットで必要な最小オクテット数と等しくなるようにします。たとえば、漢字では最小2オクテット（または2バイト）が必要です。したがって、引用符付き文字列の合計オクテット数は、2の倍数である必要があります。文字列部分が3オクテットの引用符付き文字列を挿入しようとすると、次の例のように、SQLでは最後の一重引用符（'）が文字列の終端文字ではなく第4オクテットとして解釈され、エラーが返されます。

表2-14は、文字列リテラルにおける引用符の使用方法を示しています。

表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節を参照してください。

#### 2.4.2.1.1 キャラクタ・セットで修飾された引用符付き文字列リテラル

キャラクタ・セット名で修飾された引用符付き文字列リテラルを使用できます。文字列には、指定されたキャラクタ・セットの文字のみを使用する必要があります。

キャラクタ・セットで修飾された文字列リテラルは、アンダースコア（_）で始まり、その後にサポートされているキャラクタ・セット名および引用符付き文字列が続きます。リテラルの外側で空白は使用できません。

次の例は、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'

## 2.4.3 日時リテラル

SQL文でリテラルを使用した日時データ型を参照する場合は、リテラルの前にデータ型名を記述し、一重引用符でリテラルを囲む必要があります。すべてのフィールドに対して、それぞれのフィールドの有効範囲内にある値を指定する必要があります。

次の構文は、日時リテラルの書式を示しています。

注意 構文記述子y、d、hおよびsは、それぞれ年、日、時間および秒を示すフィールド内の1桁の数字を表します。文字mは、yの後に続く場合は月を示す1桁の数字、それ以外の場合は分を示す1桁の数字を表します。小数秒は、小数点の後の数字で表します。

日時リテラルの構文は、次のとおりです。

- DATEリテラル
  DATE 'yyyy-mm-dd'
  または
  DATE 'dd-mmm-yyyy hh:mm:ss.ss'

      Examples: DATE ANSI '1993-05-27'
                DATE VMS '27-MAY-1993 15:25:00.00'

  SQLでは、2月29日に対してうるう年検証が行われます。

- TIMEリテラル
  TIME 'h:m:s'
  TIME 'h:m:s.s'

      Example: TIME '14:23:45.19'

  TIMEリテラルでは、24時間表記で時間を表します。

- TIMESTAMPリテラル
  TIMESTAMP 'y-m-d h:m:s'
  または
  TIMESTAMP 'y-m-d:h:m:s'

      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

- INTERVALリテラル
  INTERVAL '±y-m' YEAR TO MONTH
  INTERVAL '±d:h:m:s.s' DAY TO SECOND

      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)

  次の構文は、期間リテラルの書式を示しています。

  期間では符号付きの値を使用できるため、リテラルの前に加算演算子または減算演算子を指定して、正（+）または負（--）の期間を指定できます。
  期間リテラルごとに、適切な時間隔修飾子を指定する必要があります。次の例のINSERT文では、精度の不足している時間隔修飾子が指定されています。

      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に変換されます。この方法はお薦めしません。 次の方法を使用することをお薦めします。 YESTERDAYの場合: CURRENT_DATE - INTERVAL '1' DAY TODAYの場合: CURRENT_DATE TOMORROWの場合: CURRENT_DATE + INTERVAL '1' DAY 必要に応じてCAST (...AS DATE VMS)を使用

- DBKEY文字列リテラル
  DBKEYリテラルは主に、エラー・メッセージまたはRMU/SHOW STATISTICSに表示されたデータベース・キーに関連付けられている行を確認するために、データベース管理者が使用します。
  dbkey文字列リテラルでは、接頭辞_DBKEYまたは_ROWIDが使用され、特別なDBKEYリテラルとして識別されます。有効なDBKEYリテラルの例は、次のとおりです。

  - _DBKEY'23:5628:0'
    Oracle Rdbの表のdbkeyには、論理領域（この例では23）、ページ番号（この例では5628）および行番号（この例では0）の3つの部分があります。これらの3つの部分をすべて指定する必要があります。

  - _ROWID'23:5628:0, 45:345:15'
    DBKEY文字列リテラルは、ビュー表の参照に使用される場合、カンマ区切りで複数のdbkeyを指定できます。各DBKEYは、表からのコンポーネント行で構成されているビューの行を参照します。
    ROWIDキーワードはDBKEYのシノニムです。

  先行および後続の空白は無視されますが、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