No Programming, No Life

新しいNPNLです。http://d.hatena.ne.jp/fumokmm/ から引っ越してきました。

Oracleの列名のダブルクォート

テスト用にまだ追加されてないテーブルを
ローカルでちゃちゃっと作成することになったんですが、
これまでCREATE TABLE文を使ったことがなかった私は
典型的なミス(なのかな?)を犯してしまいました。

以下のようなCREATE TABLE文を実行

CREATE TABLE "TB_XXX"
(
    "ftkt_jgyb_cd" CHAR(2),
    "hst_nm"       VARCHAR2(255),
       :
       :
       :
);

で、こんな感じのSQLを実行してみたんですが…

SQL>
select ftkt_jgyb_cd from tb_xxx

SQLを実行中です...

SQL実行中に以下のエラーが発生しました。
ORA-00904: "FTKT_JGYB_CD": 無効な識別子です。

ん??項目名はぴったりあってるのになぁ…ちなみに

select * from tb_xxx

だとちゃんと取得できます。
何が問題なんだろうと思ってネットで調べてみたら
分かりました。

Oracle SQL では、ダブルクォート(")で囲まない英小文字は大文字に変換されて処理されます。ダブルクォート(")で囲んだ場合は、この変換は行われません。

Oracle雑記帳:☆ダブルクォート(")使用上の注意点

つまり、私がCREATEしたテーブルの項目名は
ダブルクォートで囲んでしまったために、
ダブルクォートで囲まないSQLを書いてしまうと
Oracleの方で勝手に大文字に変換してしまうので

select ftkt_jgyb_cd from tb_xxx

は勝手に

select FTKT_JGYB_CD from tb_xxx

と解釈されてしまうということですね。

実際にダブルクォートで囲ってみたら、うまく取得できました。

select "ftkt_jgyb_cd" from tb_xxx

うーん、注意が必要ですね。