1. 程式人生 > >oracle匯出function,procedure

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可以看到: