ここまで,Bronze SQL試験に必要なSQLやデータベースオブジェクトを学習してきましたが,今回は,これらに関連する情報を取得する方法を学習しましょう。

データ・ディクショナリでオブジェクト情報を取得する

 例えば,EMP表から特定の行や特定の列を検索しようと思ったときに,EMP表を構成している列の名前が分からなければ,SELECT文が記述できません。そこで,皆さんは「EMP表はなんと言う名前の列から構成されているのか」という情報を取得する必要があります。そんなとき,使用するのがSQL*PlusコマンドのDESC(DESCRIBE)でした(図1)。

図1●DESCコマンドを使用してEMP表の列構成を取得する
図1●DESCコマンドを使用してEMP表の列構成を取得する

 では,「EMP表のENAME列を検索条件に使用したいけれど,ENAME列には索引はついているのだろうか?」と思ったときに,この情報はどうすれば取得できるでしょうか?

 残念ながら,DESCコマンドや他のSQL*Plusコマンドでは取得できません。しかし,データ・ディクショナリを検索すると,「どのユーザーがなんと言う名前の表を所有していて,その表にはどんな制約や索引が定義されているのか」といった情報を取得することができます。

 データ・ディクショナリは,大まかに分けると,次のように3つに分類することができます。

・DBA_xxxxx : データベース内にあるすべてのオブジェクトの情報
・ALL_xxxxx : 自分がアクセス可能なオブジェクトの情報
・USER_xxxxx : 自分が所有するオブジェクトの情報


 Oracleのデータ・ディクショナリは,分かりやすい命名になっています。例えば,テーブルの情報が見たいと思う場合は,USER_TABLES。索引の情報が見たいと思う場合は,USER_INDEXES。制約の情報が見たいと思う場合は,USER_CONSTRAINTSのように,「見たい」と思うオブジェクトのタイプを複数形(最後にSを付ける)にして,接頭辞(DBA_,ALL_,USER_)の後に指定すればよいのです。

 もちろん,データ・ディクショナリも前述のDESCコマンドで列の定義を確認することができます。

 それでは,SCOTTさんが所有しているテーブル名の一覧をUSER_TABLESデータ・ディクショナリから取得してみましょう(図2)。

図2●SCOTTさんが所有する表の一覧
図2●SCOTTさんが所有する表の一覧

 では,EMP表の列情報は?見たい情報は「列」に関するものなので,列を複数形にして,「USER_COLUMNS」としたいところなのですが,列情報って「表に属する列情報」なのか,「制約が定義されている列情報」なのか「索引が定義されている列情報」なのか,考えてみるといろいろあります。

 そこで,見たいと思っているオブジェクトタイプを複数形にする前に,3~4文字で「修飾」をします。例えば,今回見たいのは「表に属する」列の情報なので,「TABLE」の頭文字を取って「USER_TAB_COLUMNS」とします。

 では,EMP表の列情報を「USER_TAB_COLUMNS」データ・ディクショナリから検索してみましょう(図3)。

図3●EMP表の列情報を表示する
図3●EMP表の列情報を表示する