oracle导出function,procedure
Oracle如何导出存储过程
昨天使用exp可以导出oracle数据库表,今天说下怎么导出存储过程。 首先看下使用pl/sql怎么导出存储过程。 导出步骤:
tools-->Export User Objects...-->选择存储过程(Procedure,Function,Trigger,Type,Type Body,Package)等-->在Output File选择导出位置-->Export
tools-->Import Tables-->选择标签页SQL Inserts-->在Import File中选择Sql文件位置-->Import 参考了文章: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 结果为: 只导出存储过程正确的方法为:
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,和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 dbms_metadata.get_ddl('VIEW','VW_TB_A','TMD') from dual; 可是我的直接报错了,如下:
以sysdba用户登陆以后执行以下语句: exec dbms_metadata_util.load_stylesheets; 可是我的直接报错: 晚上重装了数据库,果然是数据库有问题,现在使用
select dbms_metadata.get_ddl('VIEW','TMD') from dual; 已经可以正确的得到结果了,如下: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |