web-dev-qa-db-ja.com

OracleのALL_TAB_COLUMNSについて

私はOracleとデータベース管理全般に不慣れです。

コンテキストとして、私はDESC SOME_TABLEを使用して取得する情報を提供するJavaクラスを作成します。

Javaで特定の方法を見つけることはできませんが、ALL_TAB_COLUMNSで同様の情報が得られることがわかりました。 SQL Developerで試して、出力の違いを確認しました。結果は予想していたよりもはるかに異なることがわかりました。

私は誰かが次のことを解釈する方法を私に説明してくれることを望んでいました:

desc SOME_TABLE;

select 
       COLUMN_NAME
     , DATA_TYPE
     , DATA_LENGTH
     , NULLABLE
  from ALL_TAB_COLUMNS
 where TABLE_NAME='SOME_TABLE'
 order by column_id;

出力を提供します:

Name            Null    Type
--------------- ------- ----------------------
UIDPK                   NUMBER(20)
NAME                    VARCHAR2(255)

2 rows selected

COLUMN_NAME      DATA_TYPE     DATA_LENGTH    NULLABLE
--------------- -------------- -------------- -------- 
UIDPK            NUMBER        22              N
UIDPK            NUMBER        22              N
UIDPK            NUMBER        22              Y
NAME             VARCHAR2      255             N
NAME             VARCHAR2      255             Y
NAME             VARCHAR2      255             N

6 rows selected

各列が3回繰り返されるのはなぜですか? datatypelengthUIDPKで異なるのはなぜですか。また、NULLABLEが同じではないのはなぜですか。

5
keponk

ほとんどの場合、そのテーブルを含む3つのスキーマ(ユーザー)があります。 all_tab_columnsへのクエリに_OWNER = 'FOOBAR'_を含める必要があります(または_user_tab_columns_を使用します)。これを確認するために、選択リストにOWNER列を含めることもできます。

VARCHAR(およびその他の文字列)の場合、サイズはマニュアルに記載されているように_CHAR_LENGTH_に格納されます。また、_CHAR_USED_をチェックして、定義がバイトであるか文字であるかを確認する必要があることに注意してください(VARCHAR(10 Bytes)VARCHAR(10 Char))。

数値列の場合、定義は_DATA_SCALE_および_DATA_PRECISION_に格納されます。

これはすべてマニュアルに記載されています: http://docs.Oracle.com/cd/E11882_01/server.112/e25513/statviews_2103.htm#I1020277

SELECTステートメントを使用して `DBMS_METADATAを使用し、テーブルの完全な定義を取得できることを知っていますか?

_SELECT dbms_metadata.get_ddl('TABLE', 'EMPLOYEE', 'SCOTT')
FROM dual;
_

ALL_TAB_COLUMNSは、所有しているテーブルだけでなく、アクセスできるすべてのテーブルを表示しています。アプリケーションデータベースが存在するサーバーには3つのスキーマがあると思います。

USER_TAB_COLUMNSは、所有しているテーブルのみを表示します(つまり、ログオンしているユーザーに属するスキーマ内のテーブルのみ)。

DBAログインとして接続すると、所有権に関係なく、インスタンス上のすべてのオブジェクトを持つDBA_*という別のデータディクショナリビューのセットが表示されます。

これは質問への回答ではなく、Java内のテーブル列に関する情報を直接取得する可能性を見つけられなかったというステートメントへのコメントです。Javaデータベースに依存しない方法でこの情報を提供します。

Javadoc:Java.sql、Interface DatabaseMetaData、getColumns

 
 ResultSet getColumns(String catalog、
 String schemaPattern、
 String tableNamePattern、
 String columnNamePattern)
 throws SQLExceptionRetrievesの説明指定されたカタログで使用可能なテーブル列。 
カタログ、スキーマ、テーブル、列名の基準に一致する列の説明のみが返されます。それらは、TABLE_CAT、TABLE_SCHEM、TABLE_NAME、およびORDINAL_POSITIONの順になっています。 
 
各列の説明には次の列があります:
 
 1.TABLE_CAT String =>テーブルカタログ(nullの可能性があります)
 2.TABLE_SCHEM String =>テーブルスキーマ(nullの可能性がある)
 3.TABLE_NAME文字列=>テーブル名
 4.COLUMN_NAME文字列=>列名
 5.DATA_TYPE int => JavaからのSQLタイプ.sql.Types 
 6.TYPE_NAME String =>データソースに依存するタイプ名。UDTの場合、タイプ名は完全修飾されています
 7.COLUMN_SIZE int =>列サイズ。 
 8.BUFFER_LENGTHは使用されません。 
 9.DECIMAL_DIGITS int =>小数桁数。 DECIMAL_DIGITSが適用されないデータ型の場合は、nullが返されます。 
 10.NUM_PREC_RADIX int =>基数(通常は10または2)
 11.NULLABLE int =>はNULLが許可されています。 
•columnNoNulls-NULL値を許可しない可能性があります
•columnNullable-確実にNULL値を許可します
•columnNullableUnknown-nullability不明
 12.REMARKS String =>コメント列( nullの可能性があります)
 13.COLUMN_DEF String =>列のデフォルト値。値が単一引用符で囲まれている場合、文字列として解釈されます(nullの可能性があります)
 14.SQL_DATA_TYPE int =>未使用
 15.SQL_DATETIME_SUB int =>未使用
 16.CHAR_OCTET_LENGTH int => char型の場合、列の最大バイト数
 17.ORDINAL_POSITION int =>のインデックステーブルの列(1から開始)
 18.IS_NULLABLE String => ISOルールを使用して、列のNULL可能性を決定します。 
•YES ---列にNULLを含めることができる場合
•NO ---列にNULLを含めることができない場合
•空の文字列---列のnull入力可能性が不明
 19.SCOPE_CATALOG String =>参照属性のスコープであるテーブルのカタログ(DATA_TYPEがREFでない場合はnull)
 20.SCOPE_SCHEMA String =>スコープであるテーブルのスキーマ参照属性(DATA_TYPEがREFでない場合はnull)
 21.SCOPE_TABLE String =>これが参照属性のスコープであるテーブル名(DATA_TYPEがREFでない場合はnull)
 22.SOURCE_DATA_TYPE short =>特殊タイプのソースタイプまたはユーザー生成Refタイプ、Java.sql.TypesからのSQLタイプ(DATA_TYPEがDISTINCTまたはユーザー生成REFでない場合はnull)
 23.IS_AUTOINCREMENT String =>この列が自動インクリメントされるかどうかを示します
•YES ---列が自動インクリメントされる場合
•NO ---列が自動インクリメントされない場合
•空の文字列---列が自動であるかどうかを判別できない場合増分
 24.IS_GENERATEDCOLUMN String =>これが生成された列かどうかを示します
•YES ---これが生成された列の場合
•NO ---これが生成された列でない場合
•空の文字列---これが生成された列であるかどうかを判断できない場合
 COLUMN_SIZE列は、指定された列の列サイズを指定します。数値データの場合、これは最大精度です。文字データの場合、これは文字の長さです。日時データ型の場合、これは文字列表現の文字単位の長さです(小数秒コンポーネントの最大許容精度を想定)。バイナリデータの場合、これはバイト単位の長さです。 ROWIDデータ型の場合、これはバイト単位の長さです。列のサイズが適用されないデータ型の場合は、nullが返されます。データベースに格納されるときのカタログ名と一致する必要があります。 ""はカタログのないものを取得します。 nullは、検索を絞り込むためにカタログ名を使用しないことを意味します
 schemaPattern-スキーマ名パターン。データベースに格納されるスキーマ名と一致する必要があります。 ""はスキーマのないものを取得します。 nullは、検索を絞り込むためにスキーマ名を使用しないことを意味します
 tableNamePattern-テーブル名パターン。データベースに保存されるときのテーブル名と一致する必要があります
 columnNamePattern-列名パターン。データベースに格納されている列名と一致する必要があります
戻り値:
 ResultSet-各行は列の説明です
スロース:
 SQLException-データベースアクセスの場合エラーが発生します
関連項目:
 getSearchStringEscape()
1
miracle173