引用符

単一引用符(シングルクォート)と二重引用符(ダブルクォート)

多くの開発言語では単一引用符(') と二重引用符(") は以下の例のように相互に置き換え可能である。

vData = "文字列"
vData = '文字列'

しかし Oracle において二重引用符(") は リテラル をクォートするための文字ではなく、引用識別子をあらわす引用符である。
以下の代入文はエラーとなる。

vData := "無効な識別子となる文字列";
vData := "";

ORA-01741: 長さゼロの識別子は無効です。になるのが望ましいと思うが再帰SQLエラーになる。

引用識別子と非引用識別子

二重引用符(") は引用識別子をあらわすために使用する。

通常の利用では、ほとんどが二重引用符(") でクォートされない(囲まれていない)非引用識別子である。
一般的に、識別子=非引用識別子 といっても良いだろうと思う。それほどに引用識別子という言葉は浸透していないということである。

一方、引用識別子とは、非引用識別子で使用が認められていない文字や書式、予約語を使用する場合に用いられる。 開発者側からは、あまり使用したくない識別子の表記方法である。

非引用識別子

識別子を簡単に説明すると スキーマオブジェクト 、非スキーマオブジェクト、カラム名などにおいて、
あるネームスペース(名前空間≒スコープ)における固有の名前によって一意に識別している文字列(記号)のことである。

  • システム日付のカラムの別名に hizuke という識別子を付ける例
    SQL> SELECT SYSDATE hizuke FROM DUAL ;
    HIZUKE
    -----------------
    05-02-12 17:26:59
    別名で定義した 識別子 hizuke は自動的に大文字 HIZUKE に変換される。
    (=非引用識別子には大文字小文字による区別はないことを意味する)
  • カラムの別名にスペースを含む識別子(hizuke desu)を付ける例
    SQL> SELECT SYSDATE hizuke desu FROM DUAL ;
    SELECT SYSDATE hizuke desu FROM DUAL
                          *
    行1でエラーが発生しました。:
    ORA-00923: FROMキーワードが指定の位置にありません。
    非引用識別子にはネーミングルールがあり、そのひとつに識別子にスペースを含めることができないというルールがある。

引用識別子

  • 引用識別子の例
    SELECT SYSDATE "hizuke desu" FROM DUAL ;
    ... 結果は省略
  • 引用識別子が大文字小文字を区別している例
    SQL> SELECT SYSDATE "hizuke" FROM DUAL ORDER BY "HIZUKE";
    SELECT SYSDATE "hizuke" FROM DUAL ORDER BY "HIZUKE"
                                               * 
    行1でエラーが発生しました。:
    ORA-00904: "HIZUKE": 無効な識別子です。
    ちなみに 以下の SQL は非引用識別子が大文字に変換されるためにエラーにはならない。
    SQL> SELECT SYSDATE hizuke FROM DUAL order by "HIZUKE";

但し、引用識別子であっても二重引用符(")、NULL 文字は使用できない。パスワードにも二重引用符は使えない(旧バージョンでは二重引用符が使える場合があるらしい)

非引用識別子における命名規約

非引用識別子を宣言するには、いくつかの命名規約=制限事項がある。

  • データベースのキャラクタセットのアルファベットで開始する(大文字小文字どちらでもよい)。
  • 使用できる文字は 'a-z' 、 'A-Z' 、 アンダースコア(_)、ドル($)、番号記号(#) のみである。
    データベースリンク名には ピリオド(.)とアットマーク(@)をさらに加えることが可能。 (※日本語は含まれない)

以下の例は、すべて非引用識別子として使用できない、または使用が認められていない形式。
日本語の非引用識別子ではエラーは発生しないものの、このような認められていない形式で問題が発生した場合。
Oracle に問い合わせたとしても、引用識別子を使用してください。でサポートは終了だと思います。
口で言うのは非常に簡単ですが、修正には単純でつまらない作業と膨大なコストが掛かります。
( 認められていない形式での使用は、たとえ正常運用できてもバージョンアップなど、 しばらく後になって問題が表面化することがあり、非常にリスクが高い選択となるので絶対に避けるようにしてください。)

SQL> SELECT SYSDATE 1_hizuke FROM DUAL
 
行1でエラーが発生しました。:
ORA-00923: FROMキーワードが指定の位置にありません。
 
SQL> SELECT SYSDATE $_hizuke FROM DUAL;
SELECT SYSDATE $_hizuke FROM DUAL
               *
行1でエラーが発生しました。:
ORA-00911: 文字が無効です。
 
SQL> SELECT SYSDATE #_hizuke FROM DUAL;
SELECT SYSDATE #_hizuke FROM DUAL
               *
行1でエラーが発生しました。:
ORA-00911: 文字が無効です。
 
SQL> SELECT SYSDATE _hizuke FROM DUAL;
SELECT SYSDATE _hizuke FROM DUAL
               *
行1でエラーが発生しました。:
ORA-00911: 文字が無効です。
 
SQL> SELECT SYSDATE 日付 FROM DUAL;
 
日付
-----------------
05-02-12 18:14:46
 


関連事項

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ 会員制(無料)の公式技術サイト