ORACLE - 将过程/包导出到文件

时间:2009-04-02 15:41:28

标签: oracle file export database procedure

我想以编程方式将我的过程/函数和包导出到单个文件中(作为备份)并使用Oracle 9.2。

我发现最接近的解决方案是使用DBMS_METADATA.GET_DDL,但是如何将CLOB输出到文本文件,而不会丢失任何部分(由于长度或缩进)?

或许您可以单独备份软件包或其他功能的其他解决方案(只有我想要的,而不是全部)?

由于

4 个答案:

答案 0 :(得分:3)

尝试从SQL * Plus等命令行实用程序获取CLOBS(和LONGS)似乎总是给我格式化/截断问题。我的解决方案是用非类型检查语言(Perl)编写一个简单的实用程序,它使用DBMS_METADATA将CLOB带回一个字符串。

段:

...

$sthRef = $dbhRef->prepare("select dbms_metadata.get_ddl(?,?) from dual");

$sthRef->execute('PACKAGE', $thisName);

while (($thisDDL) = $sthRef->fetchrow()) {

  print $thisDDL;

}

$sthRef->finish;

...

答案 1 :(得分:1)

如果你想获得DDL,除了你已经说过的DBMS_METADATA之外别无他法。

通常,这种备份是使用exp(或expdp)完成的,尽管这不会像大多数其他DBMS系统那样创建SQL文件。

答案 2 :(得分:1)

SET pages 0
spool proclist.sql
SELECT
CASE line
WHEN 1 THEN
'CREATE OR REPLACE ' || TYPE || ' ' || NAME || CHR(10) || text
ELSE
text
END
FROM user_source
WHERE TYPE IN ( 'PROCEDURE','FUNCTION')
ORDER BY name, line;
spool OFF
exit 

答案 3 :(得分:0)

谢谢RAS,客人回答他的问题, 我只需要获取某些程序的代码,所以我尝试了代码,发现这段代码在代码的第一行中删除了程序名后面的代码,并用三个点代替'...'

所以我将代码更改为以下内容:

   SELECT CASE line
      WHEN 1 THEN 'CREATE OR REPLACE ' -- || TYPE || ' ' || NAME || --CHR(10) || ' (' 
            || text
   ELSE
      text
   END
   FROM user_source
   WHERE TYPE IN ( 'PROCEDURE') and name like 'SomeThing%'
   ORDER BY name, line;

和这个页面 export procedures & triggers 有一个非常usefaul代码:

   connect fred/flintstone;

   spool procedures_punch.lst

   select
      dbms_metadata.GET_DDL('PROCEDURE',u.object_name)
      from
      user_objects u
   where
      object_type = 'PROCEDURE';

   spool off;

使用Toad Schema Browser完成此操作的最终方法,然后选择所有需要的步骤并单击鼠标右键,然后从菜单中选择导出。