IBMのDB、Netezzaで、Oracleの user_tab_columns のように、テーブル一覧を取得する。
・_V_RELATION_COLUMN
OWNER : オーナー
NAME : テーブル名
ATTNUM : 項目番号
ATTNAME : 項目名
FORMAT_TYPE : 項目型(桁、小数桁)
ATTCOLLENG : 項目長
ATTNOTNULL : Null('t'=NotNull / 'f'=Null)
・_V_DOTNET_PRIMARYKEYS1
TABLE_SCHEMA : テーブルスキーマ
TABLE_NAME : テーブル名
COLUMN_NAME : 項目名
KEY_SEQ : プライマリーキー項目順
PK_NAME : プライマリーキー名
* プライマリーキーの情報がどこに格納されているか不明だったが、とりあえずデータを見つけられたので採用。他環境でも同様に取得できるかは不明。
select
A.OWNER
,A.NAME
,A.ATTNUM
,A.ATTNAME
,A.FORMAT_TYPE
,A.ATTCOLLENG
,A.ATTNOTNULL
,B.KEY_SEQ
from _V_RELATION_COLUMN A
left outer join _V_DOTNET_PRIMARYKEYS1 B
on A.NAME = B.TABLE_NAME
and A.ATTNAME = B.COLUMN_NAME
;
このままでは、桁と小数桁が項目型に混じってしまっているため切りだす。
select
A.OWNER
,A.NAME
,A.ATTNUM
,A.ATTNAME
,case
when position('(' in A.FORMAT_TYPE) != 0
then substr(A.FORMAT_TYPE,1,position('(' in A.FORMAT_TYPE)-1)
else A.FORMAT_TYPE
end as ATTFORMAT
,case
when substr(A.FORMAT_TYPE,1,4) = 'NUME'
then to_number(translate(substr(A.FORMAT_TYPE,9,2),',',''),'99')
else A.ATTCOLLENG
end as ATTLENGTH
,case
when substr(A.FORMAT_TYPE,1,4) = 'NUME'
then to_number(substr(A.FORMAT_TYPE,position(',' in A.FORMAT_TYPE) + 1 ,1),'9')
else 0
end as ATTSCALE
,case
when A.ATTNOTNULL = 't' then 'NotNull'
else 'Null'
end as ATTNULL
,B.KEY_SEQ
from _V_RELATION_COLUMN A
left outer join _V_DOTNET_PRIMARYKEYS1 B
on A.NAME = B.TABLE_NAME
and A.ATTNAME = B.COLUMN_NAME
;
0 件のコメント:
コメントを投稿