如何批量从库中导出DDL语句

        在平时开发过程中,需要先在开发环境中开发,开发完并测试无误后导出ddl语句投放到生产环境。如果开发变动涉及到的object比较多,如何快速而又准确地导出是一个值得我们探讨的问题。通常我们会选择在PL/SQL developer中附带的export user objects工具中选择导出,但是这样做缺点也是很明显的,纵然我们按照complied时间降序排列,但是有些最近编译的却并非需要导出,仍然需要人为的去选择确认需要导出的对象。因此本人就最近研究出的方法,整理成blog供大家一起探讨。

        本人想到的方法是将需要导出的对象名称整理合并到一个list文件中,在windows环境中依次读取作为入参循环执行sqlplus命令,sqlplus命令中利用spool方法将将要导出对象的ddl语句导出成单个文件,最后将导出的单个文件合并成一个sql文件,最终的sql文件即可投放到生产环境中。

       具体步骤如下:

      1.导出对象list:

         将导出对象list作为一个配置文件function_list.ini         

FN_TCK_CLIENT_INFO_QRY
p_tck_scope_data_sync

      2.windows下总控脚本export.bat

@echo off

echo null > export.log

for /f %%i in (function_list.ini) do (
sqlplus user_name/password@orcl @export_function.sql %%i >> export.log
)

::追加 / 
for %%i in (*.csv) do echo / >> %%i 

 
::合并文件
move function.sql dtl_file
move procedure.sql dtl_file
copy /b fn*.csv function.sql
copy /b p*.csv procedure.sql

move *.csv dtl_file


3.导出脚本 export_function.sql

set echo off
set feedback off
set heading  off
set verify off
set newpage none
set linesize 32767
set pagesize 0
set term off
set trims off
set trimspool on
set trimout on
set timing off
set long 90000 


spool &1..csv 

select DBMS_METADATA.GET_DDL(CASE
                               WHEN upper('&1') like 'FN%' THEN
                                'FUNCTION'
                               WHEN upper('&1') like 'P%' THEN
                                'PROCEDURE'
                             END,
                             upper('&1'))
  from dual;

spool off; 

exit



这样就可以实现基本功能了,但是本人却发现有一些问题:在导出的ddl语句中在某些行会自动换行,如下图


在网上也找了很多相关资料,却都并没有很好的解决办法。因此想着换一种方式导出。新的导出脚本export_function.sql如下:

set echo off
set feedback off
set heading  off
set verify off
set newpage none
set linesize 32767
set pagesize 0
set term off
set trims off
set trimspool on
set trimout on
set timing off
set long 90000 


spool &1..csv 

select case
         when line = 1 then
          (case
            when type = 'FUNCTION' then
             'CREATE OR REPLACE ' ||
             regexp_replace(replace(lower(TEXT), '"', ''), 'f', 'rome.f', 1, 2)
            when type = 'PROCEDURE' then
             'CREATE OR REPLACE ' ||
             regexp_replace(replace(lower(TEXT), '"', ''), 'p', 'rome.p', 1, 2)
            else
             ''
          END)
         else
          TEXT
       end
  From user_source
 where type = CASE
         WHEN upper('&1') like 'FN%' THEN
          'FUNCTION'
         WHEN upper('&1') like 'P%' THEN
          'PROCEDURE'
       END
   and NAME = upper('&1')
 order by line;


/*
--导出字段有自动换行
select DBMS_METADATA.GET_DDL(CASE
                               WHEN upper('&1') like 'FN%' THEN
                                'FUNCTION'
                               WHEN upper('&1') like 'P%' THEN
                                'PROCEDURE'
                             END,
                             upper('&1'))
  from dual;
*/  
--select DBMS_METADATA.GET_DDL('FUNCTION', upper('FN_TICKETS_LOCK_ORDER_V1')) from dual;

spool off; 

exit

至此基本可以规避自动换行的问题。至于为何自动换行,我用pl/sql中附带的cmd窗口(远程数据库是10g)中执行导出语句发现不换行,用本地客户端的sqlplus执行发现换行,问题初步定为在这,待后续验证。








你可能感兴趣的:(oracle)