1.创建记录表格
CREATE TABLE "MC$MSG"
("OWNER" VARCHAR2(30),
"TABLE_NAME" VARCHAR2(30),
"MSG_ID" NUMBER,
"MSG_NAME" VARCHAR2(200),
"MSG" VARCHAR2(4000)) ;
2.生成打印的脚本内容,红色字体部分可替换
用于指定业务表格所在用户,并生成脚本内容
declare
N NUMBER;
v_indcount number;
v_indlist varchar2(4000);
strings varchar2(4000);
begin
execute immediate 'truncate table mc$msg';
for i in ( select owner,table_name from dba_tables
where owner in ('ZC')
ORDER BY OWNER,TABLE_NAME) LOOP
n:=0;
insert into mc$msg values(i.owner,i.table_name,n,'用户.表格',
'
n:=n+1;
insert into mc$msg values(i.owner,i.table_name,n,'说明','
n:=n+1;
strings:='';
for j in ( select b.column_name from dba_cons_columns b
where b.constraint_name=( select a.constraint_name from dba_constraints a
where a.OWNER=i.owner
and a.table_name=i.table_name
and a.constraint_type='P')
order by b.POSITION) loop
strings:=strings||','||j.column_name;
end loop;
strings:=substr(strings,2);
insert into mc$msg values(i.owner,i.table_name,n,'主键','
n:=n+1;
v_indlist:='
for x in (select index_name from dba_indexes where table_owner=i.owner and table_name=i.table_name order by index_name) loop
strings:='';
for y in (select column_name from dba_ind_columns where table_owner=i.owner and table_name=i.table_name and index_name=x.index_name order by column_position) loop
strings:=strings||','||y.column_name;
end loop;
v_indlist:=v_indlist||'
'||'
';
end loop;
v_indlist:=v_indlist||'
select count(index_name) into v_indcount from dba_indexes where table_owner=i.owner and table_name=i.table_name ;
insert into mc$msg values(i.owner,i.table_name,n,'索引','
n:=n+1;
insert into mc$msg values(i.owner,i.table_name,n,'备注','
n:=n+1;
insert into mc$msg values(i.owner,i.table_name,n,'字段','
for j in ( select '
from dba_tab_columns a,dba_col_comments b
where a.TABLE_NAME=b.table_name
and a.COLUMN_NAME=b.column_name
and a.OWNER=b.owner
AND A.OWNER=I.OWNER
and a.table_name=I.TABLE_NAME
ORDER BY A.COLUMN_ID) loop
strings:=j.str;
n:=n+1;
insert into mc$msg values(i.owner,i.table_name,n,'字段定义',strings);
end loop;
n:=n+1;
insert into mc$msg values(i.owner,i.table_name,n,'表格结束','
');
用 户 '||i.owner||' 表 名 '||i.table_name||' ');
说 明 '||'&'||'nbsp; ');
主 键 '||nvl(strings,'&'||'nbsp;')||'
';
';
索引名 索引字段 '||x.index_name||' '||substr(strings,2)||' ');
索 引 '||decode(v_indcount,0,'&'||'nbsp;',v_indlist)||' ');
备 注 '||'&'||'nbsp; ');
字段名 中文名 类型 可空 备注 ' STR
'||A.COLUMN_NAME||' '||'&'||'nbsp; '||a.DATA_TYPE||'('||a.DATA_LENGTH||')'||' '||decode(a.NULLABLE,'Y','--','N','NOT NULL')||' '||nvl(b.comments,'&'||'nbsp;')||'
');
commit;
END LOOP;
--create sql script
--DBMS_OUTPUT.PUT_LINE('set markup html on entmap off') ;
DBMS_OUTPUT.PUT_LINE('set pagesize 0') ;
DBMS_OUTPUT.PUT_LINE('set serveroutput on size 800000') ;
DBMS_OUTPUT.PUT_LINE('set head off') ;
DBMS_OUTPUT.PUT_LINE('set feedback off') ;
DBMS_OUTPUT.PUT_LINE('set echo off') ;
DBMS_OUTPUT.PUT_LINE('set long 9999') ;
DBMS_OUTPUT.PUT_LINE('set linesize 9999') ;
DBMS_OUTPUT.PUT_LINE('col msg format a9999') ;
DBMS_OUTPUT.PUT_LINE('set trimout on') ;
DBMS_OUTPUT.PUT_LINE('set trimspool on') ;
DBMS_OUTPUT.PUT_LINE('spool E:\ZC.htm') ;
for i in ( select distinct owner,table_name from mc$msg
ORDER BY OWNER,TABLE_NAME) LOOP
DBMS_OUTPUT.PUT_LINE('exec dbms_output.put_line(chr(13));') ;
DBMS_OUTPUT.PUT_LINE('exec DBMS_OUTPUT.PUT_LINE('''||i.owner||'.'||i.table_name||''');') ;
DBMS_OUTPUT.PUT_LINE('select replace(wm_concat(msg),'','',chr(13)) msg from (select msg from mc$msg where owner='''||i.owner||''' and table_name='''||i.table_name||''' order by msg_id);');
END LOOP;
DBMS_OUTPUT.PUT_LINE('spool off') ;
--create finish
END;
/
3.将打印的结果拷贝到文本文件,后缀名改为.sql,红色字体部分可替换
之后再cmd下进入sqlplus,运行此sql脚本即可得到固定格式的数据字典信息
例如拷贝到e盘下,名为zc.sql
在cmd中
sqlplus "/ as sysdba"
SQL>@e:\zc.sql
等待完成即可
4.业务表格调研结果如下: