LoginSignup
3
1

More than 5 years have passed since last update.

Oracle テーブル定義を取得するSQL

Last updated at Posted at 2018-04-14

Oracleのテーブル定義を取得するSQLメモ。

テーブル一覧

SELECT T.TABLE_NAME
     , C.COMMENTS
     , O.CREATED
     , O.LAST_DDL_TIME
  FROM ALL_TABLES T
  LEFT JOIN ALL_TAB_COMMENTS C
    ON T.OWNER=C.OWNER AND T.TABLE_NAME=C.TABLE_NAME
  LEFT JOIN ALL_OBJECTS O
    ON T.OWNER=O.OWNER AND T.TABLE_NAME=O.OBJECT_NAME
 WHERE T.OWNER=user 
 ORDER BY T.TABLE_NAME

テーブル定義1

SELECT T.COLUMN_ID
     , P.CONSTRAINT_TYPE PK
     , T.COLUMN_NAME
     , T.DATA_TYPE
     , CASE 
         WHEN T.DATA_TYPE IN ('VARCHAR2','NVARCHAR2','CHAR','NCHAR') THEN TO_CHAR(T.CHAR_LENGTH) || DECODE(T.CHAR_USED,'C',' CHAR',' BYTE')
         WHEN T.DATA_TYPE='NUMBER' THEN TO_CHAR(T.DATA_PRECISION) || ',' ||TO_CHAR(T.DATA_SCALE)
         WHEN T.DATA_TYPE='RAW' THEN TO_CHAR(T.DATA_LENGTH)
         ELSE NULL
       END  DATALENGTH 
     , T.DATA_DEFAULT
     , T.NULLABLE 
     , M.COMMENTS 
  FROM ALL_TAB_COLUMNS T
  LEFT JOIN ALL_COL_COMMENTS M
    ON T.OWNER=M.OWNER 
   AND T.TABLE_NAME=M.TABLE_NAME 
   AND T.COLUMN_NAME=M.COLUMN_NAME
  LEFT JOIN (SELECT S.OWNER
                  , S.TABLE_NAME
                  , COL.COLUMN_NAME
                  , S.CONSTRAINT_TYPE  
              FROM ALL_CONSTRAINTS S
             INNER JOIN ALL_CONS_COLUMNS COL
                ON S.OWNER=COL.OWNER 
               AND S.TABLE_NAME=COL.TABLE_NAME  
               AND S.CONSTRAINT_NAME=COL.CONSTRAINT_NAME 
               AND S.CONSTRAINT_TYPE='P') P
    ON T.OWNER=P.OWNER 
   AND T.TABLE_NAME=P.TABLE_NAME 
   AND T.COLUMN_NAME=P.COLUMN_NAME
 WHERE  T.OWNER= USER --current userの情報
   AND  T.TABLE_NAME=:table_name
 ORDER BY T.COLUMN_ID

結果例:
image.png

テーブル定義2 (UNIQUE制約 4つまでの情報取得)

WITH UK_lIST AS (
SELECT  * 
  FROM (
       SELECT S.OWNER
            , S.TABLE_NAME
            , COL.COLUMN_NAME
            , S.CONSTRAINT_TYPE  
            , S.CONSTRAINT_NAME
            , DENSE_RANK() OVER(ORDER BY S.CONSTRAINT_NAME) R
        FROM ALL_CONSTRAINTS S
       INNER JOIN ALL_CONS_COLUMNS COL
          ON S.OWNER = USER
         AND S.TABLE_NAME = :table_name 
         AND S.OWNER=COL.OWNER 
         AND S.TABLE_NAME=COL.TABLE_NAME  
         AND S.CONSTRAINT_NAME=COL.CONSTRAINT_NAME 
         AND S.CONSTRAINT_TYPE='U'
        )
       PIVOT (MAX(CONSTRAINT_NAME) FOR R IN (1 as UK1, 2 AS UK2,3 AS UK3,4 AS UK4))
       )
SELECT T.COLUMN_ID
     , P.CONSTRAINT_TYPE PK
     , T.COLUMN_NAME
     , T.DATA_TYPE
     , CASE 
         WHEN T.DATA_TYPE IN ('VARCHAR2','NVARCHAR2','CHAR','NCHAR') THEN TO_CHAR(T.CHAR_LENGTH) || DECODE(T.CHAR_USED,'C',' CHAR',' BYTE')
         WHEN T.DATA_TYPE='NUMBER' THEN TO_CHAR(T.DATA_PRECISION) || ',' ||TO_CHAR(T.DATA_SCALE)
         WHEN T.DATA_TYPE='RAW' THEN TO_CHAR(T.DATA_LENGTH)
         ELSE NULL
       END  DATALENGTH 
     , T.DATA_DEFAULT
     , T.NULLABLE 
     , M.COMMENTS
     , U.UK1
     , U.UK2
     , U.UK3
     , U.UK4
  FROM ALL_TAB_COLUMNS T
  LEFT JOIN ALL_COL_COMMENTS M
    ON T.OWNER=M.OWNER 
   AND T.TABLE_NAME=M.TABLE_NAME 
   AND T.COLUMN_NAME=M.COLUMN_NAME
  LEFT JOIN (SELECT S.OWNER
                  , S.TABLE_NAME
                  , COL.COLUMN_NAME
                  , S.CONSTRAINT_TYPE  
              FROM ALL_CONSTRAINTS S
             INNER JOIN ALL_CONS_COLUMNS COL
                ON S.OWNER=COL.OWNER 
               AND S.TABLE_NAME=COL.TABLE_NAME  
               AND S.CONSTRAINT_NAME=COL.CONSTRAINT_NAME 
               AND S.CONSTRAINT_TYPE='P') P
    ON T.OWNER=P.OWNER 
   AND T.TABLE_NAME=P.TABLE_NAME 
   AND T.COLUMN_NAME=P.COLUMN_NAME
  LEFT JOIN UK_lIST U
    ON T.OWNER=U.OWNER 
   AND T.TABLE_NAME=U.TABLE_NAME 
   AND T.COLUMN_NAME=U.COLUMN_NAME
 WHERE  T.OWNER= USER --current user
   AND  T.TABLE_NAME=:table_name
 ORDER BY T.COLUMN_ID

結果例:
image.png

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1