仕事で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?』を読んで原因が判明したので、ご確認ください。
-- 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というオプションがあり、こいつを制御したら動くようになりました。
あとがき
Oracleを正しく扱うには、MySQLやPostgreSQLとの違いを意識しつつ、Oracle独特の挙動を理解する必要がありそう。