通过脚本导出ORACLE数据库建表语句及注释
客户提出⼀个要求,编写⼀个脚本,输⼊表名后,实现导出表的建表语句及注释。查询资料后,实现如下:导出建表语句的SQL⽂件
set echo off
set pagesize 0
set long 90000
set feedback off
set termout off
set echo off
set heading off
set verify off
--数据库登录
--conn test/test@orcl
--导出⽂件名称
spool &2
--输出信息采⽤缩排或换⾏格式化
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'PRETTY', TRUE);
--确保每个语句都带分号
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'SQLTERMINATOR', TRUE);
--关闭表索引、外键等关联(后⾯单独⽣成)
--EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'CONSTRAINTS', FALSE);
-
-EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'REF_CONSTRAINTS', FALSE);
oracle数据库表结构怎么看
--EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'CONSTRAINTS_AS_ALTER', FALSE);
--关闭存储、表空间属性
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'STORAGE', FALSE);
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'TABLESPACE', FALSE);
--关闭创建表的PCTFREE、NOCOMPRESS等属性
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'SEGMENT_ATTRIBUTES', FALSE);
--导出表结构
select _ddl('TABLE', upper('&1'))
from dual;
--获取表注释
SELECT DBMS_LOB.substr(_dependent_ddl('COMMENT',upper('&1')))
FROM user_col_comments UCC
WHERE comments IS NOT NULL
AND UCC.TABLE_NAME = upper('&1')
and rownum = 1;
spool off;
quit;
最开始获取注释使⽤的是
SELECT DISTINCT DBMS_LOB.substr(_dependent_ddl('COMMENT',
p_table_name)) as table_comment
FROM (SELECT distinct table_name
FROM user_col_comments
WHERE comments IS NOT NULL)
由于没有进⾏表名的关联,发现如果表中存在没有注释的字段时候,会报错,报错信息如下:
ORA-31608: specified object of type COMMENT not found
ORA-06512: at"SYS.DBMS_METADATA", line 5805
ORA-06512: at"SYS.DBMS_METADATA", line 8436
ORA-06512: at line 1
31608.00000 -  "specified object of type %s not found"
*Cause:    The specified object was not found in the database.
*Action:  Correct the object specification and try the call again.
另导出表注释⼀份为html格式⽂件,便于查看
set echo off
set heading on
set term off
set pagesize 50000
set long 90000
set feedback off
set termout off
set trimout on
set trimspool on
set newpage none
set verify off
set markup html ON spool ON pre off entmap off spool &2
--获取表注释
select table_name, column_name, comments
from user_col_comments
where table_name = upper('&1');
spool off;
quit;
bat⼊⼝执⾏脚本
@echo off
title 导出表结构及注释脚本
@echo 导出表结构脚本程序
::读取db.ini配置⽂件
for /f  "tokens=1,2 delims=="%%b in (%~dp0/conf/db.ini) do (
if"%%b"=="user" set user=%%c
if "%%b"=="pass" set pass=%%c
if "%%b"=="dbsid" set dbsid=%%c
)
:param
::其中参数1为表名,参数2为路径
set table_name=
@echo 请输⼊需要导出结构和注释的表
set /p table_name=如ZSLP_TL_BATCH:
@echo 您输⼊的表名为:%table_name%
call :stringlenth"%table_name%" num1
if not %num1% == 0 (
goto export
) else goto param
:stringLenth
::字符串长度计算⼦程序
set thestring=%~1
:
:@echo 字符串 %thestring%
::参数%1为字符串"%str%",%~1则去掉"%str%"的双引号。
if not defined theString (
::设置如果字符串为空,长度为0
set Return=0
set %2=0
goto :eof
)
set Return=0
:stringLenth_continue
set /a Return+=1
set thestring=%thestring:~0,-1%
::偏移量为1,截取倒数第1位前的所有字符
if defined thestring goto stringLenth_continue
::参数%2为返回变量 num的名称,不能含空格或特殊字符
if not"%2"=="" set %2=%Return%
goto :eof
:export
::导出表结构及注释
::echo %~dp0
sqlplus %user%/%pass%@%dbsid%  @%~dp0/sql/exptab.sql %table_name% %~dp0/export/%table_name%.sql
::导出注释
sqlplus %user%/%pass%@%dbsid%  @%~dp0/sql/exptabcom.sql %table_name%  %~dp0/export/%table_name%_comment.html
@echo 导出表%table_name%结构及注释结束
@echo on
PAUSE
数据库配置⽂件
#数据库⽤户名
user=xiongf
#数据库⽤户密码
pass=xiongf
#数据库SID
dbsid=orcl
执⾏过程截图:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。