oracle匯出function,procedure
昨天使用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可以看到: