このすみノート

Webエンジニアが技術や趣味を書くブログです。

Oracle DBのテーブル名は、ダブルクォーテーションの有無によって挙動が違う

仕事でOracleを使っているのですが、ダブルクォーテーション("")の有無による挙動差にハマったのでメモします。

CREATE TABLE sample_table( 
  col1 number,
  col2 number
)

-- これが失敗する
SELECT * FROM "sample_table" 

CREATE TABLEのやり方に依存する

stackoverflowの『What exactly do quotation marks around the table name do?』を読んで原因が判明したので、ご確認ください。

stackoverflow.com

-- So if you do something like
CREATE TABLE my_table( 
  col1 number,
  col2 number
)

-- you can
SELECT * FROM my_table
SELECT * FROM MY_TABLE
SELECT * FROM My_Table
SELECT * FROM "MY_TABLE"

-- but something like
SELECT * FROM "my_table" 

-- will fail.

以上がCREATE TABLE名に、ダブルクオーテーション("")を付けなかったパターンです。

-- On the other hand, if you do something like
CREATE TABLE "my_other_table"( 
  col1 number,
  col2 number
)

-- you cannot do
SELECT * FROM my_other_table
SELECT * FROM MY_OTHER_TABLE
SELECT * FROM My_Other_Table
SELECT * FROM "MY_OTHER_TABLE"

-- but this
SELECT * FROM "my_other_table" 

-- will work

以上がCREATE TABLE名に、ダブルクオーテーション("")を付けたパターンです。 クオートも含めて、厳密にテーブル名を求められます。

具体的にどういうケースでハマるのか

スキーマ名やテーブル名にダブルクオーテーションをつけるタイプのORMを使うとハマります。 SequelizeというORMの場合、これを無効にするquoteIdentifiersというオプションがあり、こいつを制御したら動くようになりました。

stackoverflow.com

あとがき

Oracleを正しく扱うには、MySQLやPostgreSQLとの違いを意識しつつ、Oracle独特の挙動を理解する必要がありそう。