我想以编程方式将我的过程/函数和包导出到单个文件中(作为备份)并使用Oracle 9.2。
我发现最接近的解决方案是使用DBMS_METADATA.GET_DDL,但是如何将CLOB输出到文本文件,而不会丢失任何部分(由于长度或缩进)?
或许您可以单独备份软件包或其他功能的其他解决方案(只有我想要的,而不是全部)?
由于
答案 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完成此操作的最终方法,然后选择所有需要的步骤并单击鼠标右键,然后从菜单中选择导出。