导出ORACLE中指定的程序包\视图等.

最近由于项目原因需要导出系统中有所的客户化程序包\视图\触发器等,试了不少办法,感觉使用dbms_metadata来导入ddl是最为方便的,代码中为了防止utl_file输出溢出采用了raw转换,如果大家觉得还有更好的方法也可以提出来一起讨论.

首先需要在服务器上创建好需要导出文件的文件路径,并在数据库中创建成directory并授权给apps用户(需要使用到system用户).

因为本次项目的所有客户化程序都是按照规范CUX或者是XXD开头的,可以根据自己的实际需求修改查询范围.

 

--服务器上创建目录
--例子中是在/usr/tmp/coa_out_put 目录下
--修改目录权限

--chmod 776 coa_out_put

--使用system用户 创建目录

--create or replace directory CUX_OUT_PATH as '/usr/tmp/coa_out_put/';

--授权目录读写给apps用户

--grant read, write on directory CUX_OUT_PATH to apps;

DECLARE

  l_limit          CONSTANT NUMBER := 2000;

 

  l_clob            CLOB;

  l_output_patch   VARCHAR2(30) := 'CUX_OUT_PATH';

  l_output         utl_file.file_type;

  l_file_name      VARCHAR2(360);

  

  CURSOR cur_program IS

  SELECT ds.owner, ds.name,ds.type

    FROM dba_source ds

   WHERE 1=1

     AND regexp_like(ds.name, '^(CUX|XXD)')

     AND ds.type NOT IN ('PACKAGE BODY','JAVA SOURCE')

   GROUP BY ds.owner,ds.name,ds.type

   ORDER BY ds.name;

  

  l_length         NUMBER;

  l_start          NUMBER;

  l_str_tmp        VARCHAR2(4000);

 

BEGIN

  FOR l_program IN cur_program LOOP

    

    l_clob   := dbms_metadata.get_ddl(object_type => l_program.type ,name => l_program.name,schema => l_program.owner); 

    l_length := dbms_lob.getlength(l_clob); 

  

    l_file_name := l_program.owner || '.' || l_program.name;

    l_output    := utl_file.fopen(l_output_patch, l_file_name, 'w','32767');  

    

    l_start := 1;

    LOOP

      

      l_str_tmp := to_char(dbms_lob.substr(l_clob,l_limit,l_start));

      

      utl_file.put_raw(l_output, utl_raw.cast_to_raw(l_str_tmp),TRUE);

      l_start := l_start + l_limit;

      

      EXIT WHEN l_start >= l_length;

      

    END LOOP;

    

    

    utl_file.fclose(l_output);

  END LOOP;

END;


 

阅读更多
个人分类: ORACLE EBS
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭