oracle导出function,procedure
Oracle如何导出存储过程
昨天使⽤exp可以导出oracle数据库表,今天说下怎么导出存储过程。
⾸先看下使⽤pl/sql怎么导出存储过程。
导出步骤:
tools-->Export -->选择存储过程(Procedure,Function,Trigger,Type,Type Body,Package)等-->在Output File选择导出位置-->Export
使⽤上述步骤可以导出表,序列,存储过程,函数,触发器,Type,包等,导出结果为:
导出后,怎么使⽤pl/sql导⼊呢?步骤如下:
tools-->Import Tables-->选择标签页SQL Inserts-->在Import File中选择Sql⽂件位置-->Import
不使⽤pl/sql怎么导出存储过程呢?
⼀般⽤户导出存储过程脚本为:
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;
结果为:
另⼀种导出存储过程的脚本,参考了⽂章:
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 _ddl('VIEW','VW_TB_A','TMD') from dual;
function怎么记忆可是我的直接报错了,如下:
⽹上的解决⽅法是:
以sysdba⽤户登陆以后执⾏以下语句:
exec dbms_metadata_util.load_stylesheets;
可是我的直接报错:
电脑上rdbms下⾯根本没有xml⽂件夹:
⾃⼰也了很久的资料,⼀直没解决,可能是数据库版本太低所致,可能性较⼤的是我的数据库出现问题了。晚上重装了数据库,果然是数据库有问题,现在使⽤
select _ddl('VIEW','VW_TB_A','TMD') from dual;
已经可以正确的得到结果了,如下:
打开CLOB可以看到:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。