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
うーん、注意が必要ですね。