我想以编程方式将我的过程/函数和包导出到单个文件(作为备份)并使用 Oracle 9.2。
我找到的最接近的解决方案是使用 DBMS_METADATA.GET_DDL ,但是我如何将 CLOB 输出到文本文件而不丢失任何部分(由于长度或缩进)?
或者您是否有其他解决方案来单独备份包或其他功能(只有我想要的一个,而不是全部)?
谢谢
尝试从 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;
...
DBMS_METADATA
如果你想获得 DDL,除了你已经说过的,真的没有办法。
通常,这种备份是使用exp
(or expdp
) 完成的,尽管这不会像大多数其他 DBMS 系统那样创建 SQL 文件。
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
感谢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;
这个页面 导出程序和触发器 有一个非常有用的代码:
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 ,然后选择所有需要的程序并单击鼠标右键,然后从菜单中选择导出。