Oracle DatabaseのSQL*PlusでDESCRIBEを使う方法|テーブル構造・列名・データ型を確認する手順

Oracle

Oracle Databaseを操作していると、テーブルにどのような列があり、それぞれどのデータ型で定義されているのか確認したくなることがあります。SQL*Plusでは、そのようなテーブル構造を手軽に確認するためにDESCRIBEコマンドを利用できます。

DESCRIBEは短縮形の「DESC」でも実行でき、テーブルの列名、NULLを許可するかどうか、データ型などを一覧表示できます。SELECT文を書く必要がないため、既存テーブルの定義を素早く確認したい場面で便利です。

この記事では、SQL*PlusでDESCRIBEを使ってOracle Databaseのテーブル構造を確認する基本操作に加え、他スキーマのテーブル、ビュー、シノニム、制約や主キーまで詳しく調べたい場合の方法を解説します。

SQL*PlusではDESCRIBEでテーブル構造を確認できる

SQL*Plusには、指定したデータベースオブジェクトの定義情報を表示するDESCRIBEコマンドがあります。テーブルを指定すると、主に列名、NULL許可の有無、データ型が表示されます。

基本構文は次のとおりです。

DESCRIBE テーブル名;

「DESCRIBE」は「DESC」と省略することもできます。

DESC テーブル名;

そのため、SQL*Plusでテーブルの列構成やデータ型を確認したい場合は、DESCRIBEまたはDESCを使えば確認できます。

DESCRIBEを実行すると何が表示されるのか

例えばEMPLOYEESというテーブルがある場合、SQL*Plusで次のように入力します。

DESC EMPLOYEES;

すると、概ね次のような情報が表示されます。

Name              Null?    Type
----------------- -------- ----------------
EMPLOYEE_ID       NOT NULL NUMBER(6)
FIRST_NAME                  VARCHAR2(20)
LAST_NAME         NOT NULL VARCHAR2(25)
EMAIL             NOT NULL VARCHAR2(25)
HIRE_DATE         NOT NULL DATE
SALARY                     NUMBER(8,2)

この表示から、EMPLOYEE_IDという列がNUMBER(6)、FIRST_NAMEがVARCHAR2(20)、HIRE_DATEがDATEなど、各列の定義を確認できます。

Name・Null?・Typeの意味

DESCRIBEの出力には、主に「Name」「Null?」「Type」という項目が表示されます。それぞれの意味を理解しておくと、テーブル設計を読み取りやすくなります。

表示項目 意味
Name 列名
Null? NULLを許可するかどうか
Type データ型と桁数など

「Null?」欄にNOT NULLと表示されている列は、NULL値を格納できません。何も表示されていない列は、通常NULLを格納できます。

「Type」にはVARCHAR2(50)、NUMBER(10,2)、DATE、TIMESTAMPなど、その列へ格納できるデータの種類が表示されます。

DESCRIBEはSQL文ではなくSQL*Plusのコマンド

DESCRIBEについて重要なのは、Oracle Databaseへ送る通常のSQL文そのものではなく、SQL*Plusが提供するコマンドだという点です。

SELECT、INSERT、UPDATE、DELETEなどはSQLですが、DESCRIBEはSQL*Plusなどのクライアントツール側が提供する機能です。そのため、利用するツールによってDESCRIBEの扱いや対応状況が異なる場合があります。

Oracle系の開発ツールではDESCが利用できる場合もありますが、「Oracle DatabaseそのもののSQL構文としてDESCRIBEが存在する」と理解するより、「SQL*Plusのコマンドとして使える」と理解するほうが正確です。

セミコロンは付けても付けなくても扱える場合がある

SQL文では文末にセミコロンを付けることが一般的ですが、SQL*PlusコマンドのDESCRIBEでは、環境によってはセミコロンを付けずに入力する形もよく使われます。

DESC EMPLOYEES

SQL*Plusでは上記のような入力で実行できます。普段SQL文へセミコロンを付ける習慣がある場合でも、DESCRIBEがSQL*Plusコマンドであることを覚えておくと混乱しにくくなります。

操作方法は使用しているSQL*Plusや関連ツールのバージョンによって細部が異なる場合があるため、挙動に迷った場合はOracle公式ドキュメントのSQL*Plusコマンドリファレンスを確認すると確実です。

別スキーマのテーブルも指定できる

自分が接続しているスキーマ以外のテーブルを確認したい場合は、対象オブジェクトへの必要な権限があれば「スキーマ名.テーブル名」という形式で指定できます。

DESC HR.EMPLOYEES

この例ではHRスキーマにあるEMPLOYEESテーブルを確認しています。

ただし、対象テーブルを参照する権限がない場合には確認できません。別スキーマのオブジェクトを扱う場合は、オブジェクトの存在だけでなくアクセス権限も確認する必要があります。

ビューの構造もDESCRIBEで確認できる

DESCRIBEは通常のテーブルだけでなく、ビューについても列構成を確認できます。

DESC EMPLOYEE_VIEW

ビューを指定すると、そのビューから参照できる列名やデータ型などが表示されます。

ただし、DESCRIBEだけでは「そのビューがどのSELECT文で定義されているのか」までは確認できません。ビュー定義そのものを調べたい場合は、データディクショナリビューなど別の方法を利用します。

シノニムを指定して確認できる場合もある

Oracle Databaseでは、テーブルやビューなどに別名を付けるシノニムを利用できます。SQL*PlusのDESCRIBEでは、解決可能なシノニム経由でオブジェクトの構造を確認できる場合があります。

例えばEMPというシノニムがHR.EMPLOYEESを指している場合、次のように確認できます。

DESC EMP

ただし、シノニムがどのオブジェクトを指しているかまで確認したい場合は、USER_SYNONYMSやALL_SYNONYMSなどのデータディクショナリビューを調べる方法があります。

DESCRIBEでは主キーや外部キーまでは詳しく分からない

DESCRIBEは列構成を素早く確認するには便利ですが、テーブル設計に関するすべての情報を表示するわけではありません。

例えば、どの列がPRIMARY KEYなのか、どのFOREIGN KEYがどのテーブルを参照しているのか、CHECK制約がどう設定されているかといった詳細情報は、DESCRIBEだけでは十分に確認できません。

そのような場合はUSER_CONSTRAINTSやUSER_CONS_COLUMNSなどのデータディクショナリビューを利用します。

主キーを確認したい場合のSQL例

例えば自分のスキーマにあるEMPLOYEESテーブルの主キー列を調べる場合は、データディクショナリを利用して次のようなSQLを実行できます。

SELECT cols.column_name
FROM user_constraints cons
JOIN user_cons_columns cols
  ON cons.constraint_name = cols.constraint_name
WHERE cons.constraint_type = 'P'
  AND cons.table_name = 'EMPLOYEES';

Oracleでは通常、データディクショナリ上のオブジェクト名が大文字で格納されるため、一般的なテーブルであればEMPLOYEESのように大文字で指定します。

DESCRIBEで列を確認し、必要に応じてデータディクショナリで制約を詳しく調査するという使い分けが便利です。

列情報をSQLで取得するならUSER_TAB_COLUMNS

DESCRIBEではなく、SELECT文として列情報を取得したい場合にはUSER_TAB_COLUMNSなどのデータディクショナリビューが利用できます。

例えば次のように実行します。

SELECT column_name, data_type, data_length, nullable
FROM user_tab_columns
WHERE table_name = 'EMPLOYEES'
ORDER BY column_id;

この方法なら結果をさらに条件で絞ったり、別のSQL処理へ利用したりできます。

一方、単純に人間がその場でテーブル構造を見るだけなら、DESC EMPLOYEESのほうが短く簡単です。

DESCRIBEとUSER_TAB_COLUMNSの使い分け

両者の違いを整理すると次のようになります。

方法 向いている用途
DESCRIBE その場でテーブル構造を素早く確認
USER_TAB_COLUMNS 列情報をSQLで取得・加工したい
USER_CONSTRAINTS 主キー・外部キー・制約を調査
DBMS_METADATA CREATE TABLEなどDDLを確認

テーブルの調査では、目的に応じてこれらを使い分けると効率的です。

CREATE TABLE文そのものを確認する方法

テーブルが実際にどのようなDDLで作成されているか確認したい場合には、DBMS_METADATA.GET_DDLを利用できます。

例えば次のようなSQLです。

SELECT DBMS_METADATA.GET_DDL('TABLE', 'EMPLOYEES') FROM DUAL;

これにより、CREATE TABLE文に近い形でテーブル定義を取得できます。

列だけではなく制約やストレージ関連の情報も確認したい場合には、DESCRIBEよりこちらの方法が適しています。

テーブルが見つからないときに確認すること

DESCRIBEを実行してオブジェクトが存在しないというエラーになる場合は、テーブル名の間違い、接続しているスキーマ、アクセス権限などを確認します。

自分のスキーマにあるテーブルなら、次のSQLで一覧を確認できます。

SELECT table_name FROM user_tables ORDER BY table_name;

別スキーマのテーブルならALL_TABLESなどから確認できる範囲を調べることもできます。

引用符付きで作成された名前には注意

Oracle Databaseでは通常、引用符を付けずに作成したテーブル名や列名は内部的に大文字として扱われます。

例えば次のテーブルは通常EMPLOYEESとして扱われます。

CREATE TABLE employees (...);

一方、ダブルクォーテーションで名前を囲んで大文字・小文字を明示したオブジェクトでは、その大文字小文字を正確に指定する必要があります。

DESC "Employees"

一般的な設計では引用符付き識別子を多用しませんが、他人が作成したデータベースを調べる際には覚えておくと役立ちます。

DESCRIBEはテーブルのデータ内容を表示するコマンドではない

DESCRIBEで確認できるのは主にテーブルの構造です。テーブルに保存されている実際のレコードを確認したい場合はSELECT文を使います。

例えばEMPLOYEESのデータを見るなら次のようにします。

SELECT * FROM EMPLOYEES;

つまり「列名やデータ型を知りたいならDESCRIBE」「保存されているデータを見たいならSELECT」と区別すると分かりやすくなります。

Oracle学習ではDESCを覚えておくと便利

Oracle Databaseを学習していると、教材や実習で初めて見るテーブルを操作する機会が多くあります。その際、毎回テーブル定義を資料から探すより、DESCを実行するほうが素早く確認できます。

例えばSQLを書く前に「EMPLOYEE_IDはNUMBERなのか」「HIRE_DATEはDATEなのか」「この列はNULL可能なのか」といった点を確認できます。

SQL*Plusを使う実習では頻繁に利用できる基本コマンドの一つとして覚えておくと便利です。

まとめ|SQL*PlusのDESCRIBEでテーブルの列構造を確認できる

Oracle DatabaseをSQL*Plusから操作している場合、DESCRIBEコマンドを使うことでテーブルの構造を簡単に確認できます。

基本形は「DESCRIBE テーブル名」または省略形の「DESC テーブル名」で、列名、NULL許可の有無、データ型などを表示できます。

ただし、DESCRIBEはSQL*Plusのコマンドであり、主キー、外部キー、CHECK制約、CREATE TABLE文などの詳細まですべて確認できるわけではありません。列構造の簡易確認にはDESCRIBE、詳細な定義にはUSER_TAB_COLUMNSやUSER_CONSTRAINTS、DBMS_METADATAなどを使い分けることで、Oracle Databaseのテーブル構造を効率よく調査できます。

コメント

タイトルとURLをコピーしました