日期:2014-05-16  浏览次数:20472 次

Oracle如何导出存储过程

???? 昨天使用exp可以导出oracle数据库表,今天说下怎么导出存储过程。

???? 首先看下使用pl/sql怎么导出存储过程。

???? 导出步骤:

????

tools-->Export User Objects...-->选择存储过程(Procedure,Function,Trigger,Type,Type Body,Package)等-->在Output File选择导出位置-->Export

???

???? 使用上述步骤可以导出表,序列,存储过程,函数,触发器,Type,包等,导出结果为:

????

??? 导出后,怎么使用pl/sql导入呢?步骤如下

???

tools-->Import Tables-->选择标签页SQL Inserts-->在Import File中选择Sql文件位置-->Import

???

??? 不使用pl/sql怎么导出存储过程呢?

??? 参考了文章:http://bijian1013.iteye.com/blog/1830406

?

?

??? 一般用户导出存储过程脚本为:

?

???

SET echo off;
SET heading   off;
SET feedback   off;
spool f:/saveFile/tmp/my_proc.sql;
select   text   from   user_source;
spool   off;

?? Sys用户导出存储过程脚本为:

??

SET echo off;
SET heading   off;
SET feedback   off;
spool f:/saveFile/tmp/tmd_proc.sql;
select   text   from   dba_source   where   owner= 'TMD'    and   type   = 'PROCEDURE';
spool   off;

??? 导出发现三次导出的文件大小不一致,第二次普通用户spool导出的文件最大,怀疑是select时候没带条件导出来其他的Type,Trigger之类的数据,下面开始测试看下有那些类型:

??? 系统Sys用户:

???

select distinct type  from dba_source

??? 结果为:

???

?

??? 普通用户TMD:

???

select distinct type  from user_source

??? 结果为:

???

??? 可见类型有PROCEDURE,PACKAGE,PACKAGE BODY,TYPE BODY,TRIGGER,FUNCTION,TYPE,第二次导出没带Type参数导致导出结果不准确:

??? 只导出存储过程正确的方法为:

??

SET echo off;
SET heading   off;
SET feedback   off;
spool f:/saveFile/tmp/my_proc2.sql;
select   text   from   user_source where type   = 'PROCEDURE';
spool   off;

??? 使用pl/sql导出的数据(如存储过程)是带用户名的,上面写的使用spool是不带用户名的。

????导出结果和Sys用户导出结果比对,结果为:

??

??? 结果很正确,想要导什么数据,把Type修改下就OK了,表除外。举个例子

??? 普通用户导出Type,和Type Body

???

SET echo off;
SET heading   off;
SET feedback   off;
spool f:/saveFile/tmp/my_type.sql;
select   text   from   user_source where type   in('TYPE BODY','TYPE');
spool   off;

??? 结果为:

???

???

?? 另一种导出存储过程的脚本,参考了文章:

??? http://stackoverflow.com/questions/710290/oracle-exporting-procedures-packages-to-a-file

???

SET pages 0
spool f:/saveFile/tmp/c/my_procedure_2.sql
SELECT
CASE line
WHEN 1 THEN
'CREATE OR REPLACE ' ||