プロが教えるわが家の防犯対策術!

Oracle 11gを使用しているSQL初心者です。

テーブルの列名を取得する方法についての質問です。
テーブルの列名を取得するときは以下のSQLで取れると思っています。
select column_name from user_tab_columns where table_name = 'テーブル名';
--実行結果--
COLUMN_NAME
------------------------------
NAME1
NAME2

しかし、テーブルにTIMESTAMP型が含まれていると
「レコードが選択されませんでした。」
と表示されます。

TIMESTAMP型が含まれるテーブルは上記のSQLでは取得できないのでしょうか。
TIMESTAMP型が含まれるテーブルの列名の取得方法をご存知の方がいらっしゃいましたら、
ご教示ください。よろしくお願い致します。

A 回答 (1件)

こんにちわ。



> TIMESTAMP型が含まれるテーブルは上記のSQLでは取得できないのでしょうか。
通常、そのような事はありません。

問題のテーブルにアクセスできるユーザからuser_tab_columns ビューを
参照している前提で、考えられる原因が3つあります。

1) 別スキーマにテーブルがある。
  user_tab_columns ビューは、自スキーマに定義されているテーブルの
  列情報を持ちます。
  all_tab_columns ビューで情報が取得できるか確認して下さい。
  ※ all_tab_columns ビューのowner 列にテーブルの所有者名が
   格納されています。

2) テーブルが大文字/小文字混在で作成されている。
  テーブルを大文字/小文字混在でCreate table しても、大文字でテーブルが
  作成されますが、テーブル名をダブルクォーテーションで囲むと大文字/小文字
  混在で作成させる事ができます。
  その場合、ディクショナリにもテーブル名は大文字/小文字混在で格納されて
  います。
  where upper(table_name) = upper('テーブル名') で確認してみて下さい。

3) Synonym 経由で別の表にアクセスしている。
  Synonum 経由で別の表にアクセスしている場合も、user_tab_columns や
  all_tab_columns ビューには列情報は格納されません。
  select owner, object_type, object_name from all_objects
   where object_name = '先に指定したテーブル名';
  上のSQL で、どの所有者のどのようなオブジェクトにアクセスしているか
  確認してみて下さい。
    • good
    • 0
この回答へのお礼

丁寧な回答ありがとうございます。
おかげで解決することができました。なんと仕様書上大文字小文字が混ざっていたのですが、実際には全て大文字でテーブル名が作られていたことが原因でした。
回答を試している内に気付きました。

お礼日時:2013/07/20 00:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!