スキーマ(ユーザ)同士の定義比較

開発と本番でスキーマが分かれていてテーブル定義に差異が出てしまうことって時たまあるとおもいます。
で、その差異を洗うにはこんな感じの一発で差異がとれたりします。

たとえば
current_schema
history_schema
っていう2つのスキーマがあって

current_schemaには
TABLE_A(ID,NAME)
history_schemaには
TABLE_A(ID,NAME,DIV),TABLE_B(ID,NAME)
があったとき

まずテーブル名の差異は

	SELECT
		TABLE_NAME
		,'CURRENT'
	FROM
		ALL_TABLES
	WHERE
		OWNER = 'CURRENT_SCHEMA'
MINUS
	SELECT
		TABLE_NAME
		,'CURRENT'
	FROM
		ALL_TABLES
	WHERE
		OWNER = 'HISTORY_SCHEMA'
UNION ALL
	SELECT
		TABLE_NAME
		,'HISTORY'
	FROM
		ALL_TABLES
	WHERE
		OWNER = 'HISTORY_SCHEMA'
MINUS
	SELECT
		TABLE_NAME
		,'HISTORY'
	FROM
		ALL_TABLES
	WHERE
		OWNER = 'CURRENT_SCHEMA'

でとれます。
上記のsqlでは、current_schemaにしかないテーブルは2カラム目にCURRENT,history_schemaにしかないテーブルは2カラム目にHISTORYで結果が帰ってきます。

さらにカラムまでチェックしたい場合は

	SELECT
		TABLE_NAME
		,COLUMN_NAME
		,'CURRENT'
	FROM
		ALL_TAB_COLUMNS
	WHERE
		OWNER = 'CURRENT_SCHEMA'
MINUS
	SELECT
		TABLE_NAME
		,COLUMN_NAME
		,'CURRENT'
	FROM
		ALL_TAB_COLUMNS
	WHERE
		OWNER = 'HISTORY_SCHEMA'
UNION ALL
	SELECT
		TABLE_NAME
		,COLUMN_NAME
		,'HISTORY'
	FROM
		ALL_TAB_COLUMNS
	WHERE
		OWNER = 'HISTORY_SCHEMA'
MINUS
	SELECT
		TABLE_NAME
		,COLUMN_NAME
		,'HISTORY'
	FROM
		ALL_TAB_COLUMNS
	WHERE
		OWNER = 'CURRENT_SCHEMA'

な感じでcurrentとhistoryのカラム名の比較ができます。
さらに、型や桁数などまで見たければ、ALL_TAB_COLUMNS.DATA_TYPE,DATA_LENGTHまで比較対象に加えればokです。

ここまでで ALL_TABLES とか ALL_TAB_COLUMNSとかあまり使わないテーブル名が出てきたかと思いますが
これはORACLEデータディクショナリビューといいます。
Oracleのオンラインドキュメントだといろんなとこに書かれていて見にくいので
下記のサイトなんかおすすめです。
http://luna.gonna.jp/oracle/ora_ddv.html

※ただし、SYSTEM権限のあるユーザでログインする必要がありますが、、、、