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

来源:互联网 发布:csgo优化cfg 编辑:程序博客网 时间:2024/05/18 20:48

最近由于项目原因需要导出系统中有所的客户化程序包\视图\触发器等,试了不少办法,感觉使用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;


 

原创粉丝点击