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 ' || TYPE || ' ' || NAME || CHR(10) || text
ELSE
text
END
FROM user_source
WHERE TYPE ='PROCEDURE'
ORDER BY name, line;
spool OFF
exit 

        和上面那个没什么区别。

        眼尖的朋友可能看出来了,如果我想导出视图怎么办呢,上面的类型中可是没有VIEW这一类的。

    使用pl/sql导出是一种方法:

   

     没有像上面的从数据库中select出来呢?

     网上说可以使用:

    

select dbms_metadata.get_ddl('VIEW','VW_TB_A','TMD') from dual;

    可是我的直接报错了,如下:

   

     网上的解决方法是:

     

以sysdba用户登陆以后执行以下语句:
exec dbms_metadata_util.load_stylesheets;

    可是我的直接报错:

    电脑上rdbms下面根本没有xml文件夹:

   

     自己也找了很久的资料,一直没解决,可能是数据库版本太低所致,可能性较大的是我的数据库出现问题了。

     晚上重装了数据库,果然是数据库有问题,现在使用

    

select dbms_metadata.get_ddl('VIEW','VW_TB_A','TMD') from dual; 

    已经可以正确的得到结果了,如下:

   

     打开CLOB可以看到:

    

    如何导出view我在捣腾下,出结果后再写篇博客,看来以前那个数据库被我折腾的不浅,今后继续折腾,大不了重装下,反正导数据我已经会了,后续的折腾结果我会写博客的,谢谢大家。

 

  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle导出表结构可以使用数据字典视图和expdp命令实现。 1. 使用数据字典视图导出表结构 可以使用Oracle的数据字典视图来导出表结构,例如: ``` SELECT dbms_metadata.get_ddl('TABLE', '表名') FROM dual; ``` 其中,'表名'是要导出结构的表的名称。此命令将返回一个包含表结构的DDL语句。 2. 使用expdp命令导出表结构 也可以使用Oracle的expdp命令来导出表结构。例如: ``` expdp 用户名/密码 directory=目录名 dumpfile=导出文件名.dmp logfile=日志文件名.log content=metadata_only tables=表名 ``` 其中,'用户名'和'密码'是要导出结构的表所属的用户的凭据,'目录名'是导出文件和日志文件所在的目录,'导出文件名.dmp'是导出文件的名称,'日志文件名.log'是日志文件的名称,'表名'是要导出结构的表的名称。 要同时导出多个表的结构,可以在'tables'参数中使用逗号分隔表名。 Oracle导出存储过程可以使用PL/SQL Developer等工具,或者使用数据字典视图和expdp命令。 1. 使用PL/SQL Developer等工具导出存储过程 可以使用PL/SQL Developer等工具来导出存储过程。例如,在PL/SQL Developer中,可以按照以下步骤操作: - 打开PL/SQL Developer并连接到数据库。 - 在"对象浏览器"中选择要导出存储过程。 - 右键单击所选存储过程并选择"导出"。 - 在"导出对象"对话框中选择要导出的对象类型和文件格式,并指定导出文件的路径和名称。 - 单击"确定"以开始导出过程。 2. 使用数据字典视图导出存储过程 可以使用Oracle的数据字典视图来导出存储过程。例如: ``` SELECT dbms_metadata.get_ddl('PROCEDURE', '存储过程名') FROM dual; ``` 其中,'存储过程名'是要导出存储过程的名称。此命令将返回一个包含存储过程定义的DDL语句。 3. 使用expdp命令导出存储过程 也可以使用Oracle的expdp命令来导出存储过程。例如: ``` expdp 用户名/密码 directory=目录名 dumpfile=导出文件名.dmp logfile=日志文件名.log content=metadata_only procedures=存储过程名 ``` 其中,'用户名'和'密码'是要导出存储过程所属的用户的凭据,'目录名'是导出文件和日志文件所在的目录,'导出文件名.dmp'是导出文件的名称,'日志文件名.log'是日志文件的名称,'存储过程名'是要导出存储过程的名称。 要同时导出多个存储过程,可以在'procedures'参数中使用逗号分隔存储过程名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值