テーブル定義書をpl/sqlでつくってみた

SET SERVEROUT ON SIZE 1000000
SET LINESIZE 1000

DECLARE

CURSOR table_cur IS
	SELECT
		 t.table_name AS table_name
		,tc.comments AS comments
	FROM
		user_tables t
	LEFT JOIN
		user_tab_comments tc
	ON
		t.table_name = tc.table_name
	ORDER BY
		t.table_name;

CURSOR column_cur(b_table_name varchar2) IS

SELECT
	 c.column_name AS column_name_p
	,SUBSTR(cc.comments,1,INSTR(cc.comments,'|')-1) AS column_name_l
	,SUBSTR(cc.comments,INSTR(cc.comments,'|')+1,LENGTH(cc.comments)-INSTR(cc.comments,'|')) AS column_note
	,(SELECT
		'PK'
	 FROM
		user_constraints con
	 INNER JOIN
		user_cons_columns conc
	 ON
		con.table_name = conc.table_name
	 AND
		con.constraint_name = conc.constraint_name
	 WHERE
		con.constraint_type = 'P'
	 AND
		conc.table_name = c.table_name
	 AND
		conc.column_name = c.column_name) as primary_key
	,c.nullable
	,c.data_type
	,c.data_length
	,c.data_scale
	,c.data_default
FROM
	user_tab_columns c
LEFT JOIN
	user_col_comments cc
ON
	cc.table_name = c.table_name
AND
	cc.column_name = c.column_name
WHERE
	c.table_name = b_table_name
ORDER BY
	c.column_id;

BEGIN

DBMS_OUTPUT.PUT_LINE(
	    'PHYSICAL_TABLE_NAME'
	|| ',LOGICAL_TABLE_NAME'
	|| ',PHYSICAL_COLUMN_NAME'
	|| ',LOGICAL_COLUMN_NAME'
	|| ',PRIMARY_KEY'
	|| ',NULLABLE'
	|| ',DATA_TYPE'
	|| ',DATA_LENGTH'
	|| ',DATA_SCALE'
	|| ',DATA_DEFAULT'
	|| ',COLUMN_NOTE'
);

FOR rec_tab IN table_cur LOOP
	DBMS_OUTPUT.PUT_LINE(rec_tab.table_name || ',' || rec_tab.comments);

	FOR rec_col IN column_cur(rec_tab.table_name) LOOP
		DBMS_OUTPUT.PUT_LINE(
			   ',,' || rec_col.column_name_p
			|| ',' || rec_col.column_name_l
			|| ',' || rec_col.primary_key
			|| ',' || rec_col.nullable
			|| ',' || rec_col.data_type
			|| ',' || rec_col.data_length
			|| ',' || rec_col.data_scale
			|| ',' || rec_col.data_default
			|| ',' || rec_col.column_note
		);
	END LOOP;
END LOOP;

END;
/
QUIT;

テーブルコメントを テーブル論理名に
カラムコメントを カラム論理名+備考につかってみました。
カラムコメントは セパレータを「|」にして論理名と備考をわけてます。