加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

oracle导出function,procedure

发布时间:2020-12-12 15:18:17 所属栏目:百科 来源:网络整理
导读:Oracle如何导出存储过程 昨天使用exp可以导出oracle数据库表,今天说下怎么导出存储过程。 首先看下使用pl/sql怎么导出存储过程。 导出步骤: tools--Export User Objects...--选择存储过程(Procedure,Function,Trigger,Type,Type Body,Package)等--在Output
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','TMD') from dual; 

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



打开CLOB可以看到:


(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读