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

来源:互联网 发布:unity3d 就业 编辑:程序博客网 时间:2024/05/18 00:22

        在平时开发过程中,需要先在开发环境中开发,开发完并测试无误后导出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_QRYp_tck_scope_data_sync

      2.windows下总控脚本export.bat

@echo offecho null > export.logfor /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_filemove procedure.sql dtl_filecopy /b fn*.csv function.sqlcopy /b p*.csv procedure.sqlmove *.csv dtl_file


3.导出脚本export_function.sql

set echo offset feedback offset heading  offset verify offset newpage noneset linesize 32767set pagesize 0set term offset trims offset trimspool onset trimout onset timing offset 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 offset feedback offset heading  offset verify offset newpage noneset linesize 32767set pagesize 0set term offset trims offset trimspool onset trimout onset timing offset 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执行发现换行,问题初步定为在这,待后续验证。








原创粉丝点击