Oracle怎么導出存儲過程網友分享于:2014-02-26瀏覽:115次Oracle如何導出存儲過程昨天使用exp可以導出oracle數據庫表,今天說下怎么導出存儲過程。首先看下使用pl/sql怎么導出存儲過程。導出步驟:tools--ExportUs
在碌曲等地區,都構建了全面的區域性戰略布局,加強發展的系統性、市場前瞻性、產品創新能力,以專注、極致的服務理念,為客戶提供做網站、網站建設 網站設計制作定制網站制作,公司網站建設,企業網站建設,成都品牌網站建設,全網整合營銷推廣,成都外貿網站建設,碌曲網站建設費用合理。
1 將數據庫TEST完全導出,用戶名system 密碼manager 導出到D:\daochu.dmp中\x0d\x0a exp system/manager@TEST file=d:\daochu.dmp full=y\x0d\x0a2 將數據庫中system用戶與sys用戶的表導出\x0d\x0a exp system/manager@TEST file=d:\daochu.dmp owner=(system,sys)\x0d\x0a3 將數據庫中的表table1 、table2導出\x0d\x0a exp system/manager@TEST file=d:\daochu.dmp tables=(table1,table2) \x0d\x0a4 將數據庫中的表table1中的字段filed1以"00"打頭的數據導出\x0d\x0a exp system/manager@TEST file=d:\daochu.dmp tables=(table1) query=\" where filed1 like '00%'\"\x0d\x0a \x0d\x0a 上面是常用的導出,對于壓縮我不太在意,用winzip把dmp文件可以很好的壓縮。\x0d\x0a 不過在上面命令后面 加上 compress=y 就可以了
迄今為止 導出/導入工具集仍是跨多個平臺轉移數據所需勞動強度最小的首選實用工具 盡管人們常常抱怨它速度太慢 導入只是將每條記錄從導出轉儲文件中讀出來 然后使用常見的 INSERT INTO 命令將其插入到目標表中 因此導入可能是個很慢的過程 這一點并不讓人感到吃驚
進入 Oracle Data Pump Oracle Database g 中的導出/導入工具包的更新更快的同類工具 它被設計來成倍地加速這個過程
Data Pump 反映了整個導出/導入過程的徹底革新 它不是使用常見的 SQL 命令 而是應用專用 API 來以更快得多的速度加載和卸載數據 在我的測試中 我看到導出性能比在直接模式下提高了 倍 導入過程性能提高了 倍 此外 與使用導出實用工具不同 它還能夠只取出特定類型的對象(如過程)
Data Pump 導出
這個新的實用工具稱為 expdp 以和原來的導出 exp 區分開 在本例中 我們將用 Data Pump 來導出一個大表 CASES 大小約為 GB Data Pump 在服務器端使用文件處理來創建和讀取文件 因此 目錄作為位置使用 在這種情況下 我們將使用文件系統 /u /dpdata 來保存轉儲文件
create directory dpdata as /u /dpdata ; grant read write on directory dpdata to ananda;
接下來 我們將導出數據
expdp ananda/abc tables=CASES directory=DPDATA dumpfile=expCASES dmp job_name=CASES_EXPORT
讓我們來分析該命令的各個部分 用戶 ID/口令組合 表和轉儲文件參數的意義是顯而易見的 與原來的導出不同 文件是在服務器(不是客戶端)上創建的 位置由目錄參數值 DPDATA 指定 它指向之前創建的 /u /dpdata 這個進程還在目錄參數指定的位置上創建一個日志文件(同樣在服務器上) 默認地 這個進程使用一個名稱為 DPUMP_DIR 的目錄 因此可以創建它來代替 DPDATA
注意上面的參數 job_name 這是個特殊的參數 在原來的導出中沒有 所有的 Data Pump 工作都通過作業來完成 Data Pump 作業 — 與 DBMS 作業不同 — 只是服務器進程 它代表主進程處理數據 主進程(稱為主控制進程)通過高級隊列 (AQ) 來協調這項工作 它通過在運行期內創建的一個特殊的表(稱為主表)來實現這個目的 在我們的例子中 如果您在 expdp 運行時檢查用戶 ANANDA 的模式 您將注意到一個表 CASES_EXPORT 的存在(對應參數 job_name) 當 expdp 結束時 這個表被丟棄
導出監控
當 Data Pump Export (DPE) 運行時 按 Control C 它將阻止消息在屏幕上顯示 但不停止導出進程本身 相反 它將顯示 DPE 提示符(如下所示) 進程現在被認為處于 交互式 模式
Export
這種方法允許在這個 DPE 作業上輸入幾條命令 要查看概要 在提示符下使用 STATUS 命令
Export status Job:CASES_EXPORT Operation:EXPORT Mode:TABLE State:EXECUTING Degree: Job Error Count: Dump file:/u /dpdata /expCASES dmp bytes written = Worker Status: State EXECUTING Object Schema:DWOWNER Object Name:CASES Object Type:TABLE_EXPORT/TBL_TABLE_DATA/TABLE/TABLE_DATA Completed Objects: Total Objects: Completed Rows:
記住 這只是狀態顯示 導出在后臺工作 要繼續在屏幕上查看消息 從 Export 提示符下使用命令 CONTINUE_CLIENT
并行操作
您可以通過 PARALLEL 參數為導出使用一個以上的線程來顯著地加速作業 每個線程創建一個單獨的轉儲文件 因此參數 dumpfile 應當擁有和并行度一樣多的項目 您可以指定通配符作為文件名 而不是顯式地輸入各個文件名 例如
expdp ananda/abc tables=CASES directory=DPDATA dumpfile=expCASES_%U dmp parallel= job_name=Cases_Export
注意 dumpfile 參數擁有一個通配符 %U 它指示文件將按需要創建 格式將為 expCASES_nn dmp 其中 nn 從 開始 然后按需要向上增加
在并行模式下 狀態屏幕將顯示四個工作進程 (在默認模式下 只有一個進程是可見的 )所有的工作進程同步取出數據 并在狀態屏幕上顯示它們的進度
分離訪問數據文件和轉儲目錄文件系統的輸入/輸出通道是很重要的 否則 與維護 Data Pump 作業相關的開銷可能超過并行線程的效益 并因此而降低性能 并行方式只有在表的數量多于并行值并且表很大時才是有效的
數據庫監控
您還可以從數據庫視圖獲得關于運行的 Data Pump 作業的更多信息 監控作業的主視圖是 DBA_DATAPUMP_JOBS 它將告訴您在作業上有多少個工作進程(列 DEGREE)在工作 另一個重要的視圖是 DBA_DATAPUMP_SESSIONS 當它與上述視圖和 V$SESSION 結合時將給出主前臺進程的會話 SID
select sid serial# from v$session s dba_datapump_sessions d where s saddr = d saddr;
這條指令顯示前臺進程的會話 更多有用的信息可以從警報日志中獲得 當進程啟動時 MCP 和工作進程在警報日志中顯示如下
kupprdp:master process DM started with pid= OS id= to execute SYS KUPM$MCP MAIN( CASES_EXPORT ANANDA ); kupprdp:worker process DW started with worker id= pid= OS id= to execute SYS KUPW$WORKER MAIN( CASES_EXPORT ANANDA ); kupprdp:worker process DW started with worker id= pid= OS id= to execute SYS KUPW$WORKER MAIN( CASES_EXPORT ANANDA );
它顯示為數據泵操作啟動的會話的 PID 您可以用以下查詢找到實際的 SID
select sid program from v$session where paddr in (select addr from v$process where pid in ( ));
PROGRAM 列將對應警報日志文件中的名稱顯示進程 DM (為主進程)或 DW (為工作進程) 如果一個工作進程使用了并行查詢 比如說 SID 您可以在視圖 V$PX_SESSION 中看到它 并把它找出來 它將為您顯示從 SID 代表的工作進程中運行的所有并行查詢會話
select sid from v$px_session where qcsid = ;
從視圖 V$SESSION_LONGOPS 中可以獲得其它的有用信息來預測完成作業將花費的時間
select sid serial# sofar totalwork from v$session_longops where opname = CASES_EXPORT and sofar != totalwork;
列 totalwork 顯示總工作量 該列的 sofar 數量被加和到當前的時刻 — 因而您可以用它來估計還要花多長時間
Data Pump 導入
不過 數據導入性能是 Data Pump 真正出色的地方 要導入先前導出的數據 我們將使用
impdp ananda/abc directory=dpdata dumpfile=expCASES dmp job_name=cases_import
導入進程的默認行為是創建表和所有相關的對象 然后在表已存在時產生一個錯誤 如果您想把數據添加到一個現有的表中 您可以在上述命令行中使用 TABLE_EXISTS_ACTION=APPEND
和使用 Data Pump 導入一樣 在進程中按 Control C 將進入 Date Pump Import (DPI) 的交互模式 同樣 提示符是 Import
處理特定對象
您是否有過只需要從一個用戶導出特定的過程 以在一個不同的數據庫或用戶中重新創建這些過程的情況?與傳統的導出實用工具不同 Data Pump 允許您只導出特定類型的對象 例如 以下命令讓您只導出過程 而不導出其它任何東西 — 不導出表 視圖 甚至函數
expdp ananda/iclaim directory=DPDATA dumpfile=expprocs dmp include=PROCEDURE
要只導出一些特定的對象 — 比如說 函數 FUNC 和過程 PROC — 您可以使用
expdp ananda/iclaim directory=DPDATA dumpfile=expprocs dmp include=PROCEDURE:\ =\ PROC \ \ FUNCTION:\ =\ FUNC \ \
這個轉儲文件充當了源對象的一個備份 您甚至可以用它來創建 DDL 腳本 以供之后使用 一個稱為 SQLFILE 的特殊參數允許創建 DDL 腳本文件
impdp ananda/iclaim directory=DPDATA dumpfile=expprocs dmp sqlfile=procs sql
該指令在 DPDATA 指定的目錄中創建一個名稱為 procs sql 的文件 并將對象的腳本包含在導出轉儲文件中 這種方法幫助您快速地在另一個模式中創建源對象
利用參數 INCLUDE 允許您從轉儲文件中定義要包含或排除的對象 您可以使用子句 INCLUDE=TABLE: LIKE TAB% 來僅導出那些名稱以 TAB 開頭的表 類似地 您可以使用結構 INCLUDE=TABLE: NOT LIKE TAB% 來排除所有名稱以 TAB 開頭的表 作為另一種選擇 您可以使用 EXCLUDE 參數來排除特定的對象
lishixinzhi/Article/program/Oracle/201311/17547
略微復雜,需要存儲過程實現。
1、創建輸出路徑,比如你要在d盤test目錄下輸出,你就先在d盤根目錄下建立一個test的目錄。
2、sqlplus下以sysdba登錄,執行以下語句
create?or?replace?directory?TMP?as?'d:\test';
grant?read,write?on?directory?TMP?to?scott;?--比如我用的scott用戶
alter?system?set?utl_file_dir='d:\test'?scope=spfile;
3、以上步驟執行完,需要重啟數據庫。
4、創建一個存儲過程,代碼如下(基本是不用改動,原封復制即可):
CREATE?OR?REPLACE?PROCEDURE?SP_OUTPUT_PROCEDURE?is
file_handle?????utl_file.file_type;
Write_content???VARCHAR2(1024);
Write_file_name?VARCHAR2(50);
v_name??????????varchar2(50);
v_text??????????varchar2(2000);
cursor?cur_procedure_name?is
select?distinct?name?from?user_source?where?type?=?'PROCEDURE';
cursor?cur_sp_out?is
select?t.text
from?(select?0?line,?'CREATE?OR?REPLACE?'?text
from?dual
union
select?line,?text
from?user_source
where?type?=?'PROCEDURE'
and?name?=?v_name)?t
order?by?line;
begin
open?cur_procedure_name;
loop
fetch?cur_procedure_name
into?v_name;
exit?when?cur_procedure_name%notfound;
write_file_name?:=?v_name?||?'.txt';
open?cur_sp_out;
loop
fetch?cur_sp_out
into?v_text;
exit?when?cur_sp_out%notfound;
file_handle???:=?utl_file.fopen('TMP',?write_file_name,?'a');
write_content?:=?v_text;
--write?file
IF?utl_file.is_open(file_handle)?THEN
utl_file.put_line(file_handle,?write_content);
END?IF;
--close?file
utl_file.fclose(file_handle);
end?loop;
close?cur_sp_out;
end?loop;
close?cur_procedure_name;
end;
5、創建完畢執行存儲過程,這個就不贅述了,執行完畢后,你會發現d盤test目錄下的文件名就是以存儲過程名命名的txt文件,如圖:
6、里邊內容(就是存儲過程創建時的代碼,可能排版看著難看點,但是不影響使用):
這樣試試:
在sqlplus 下:
set echo off;
set heading off;
set feedback off;
spool c:\proc.txt
--1、用sys用戶等陸的話:
select text from dba_source where owner='YOUR_USER' and type ='PROCEDURE';
--2、用一般用戶(要導出其下存儲過程的用戶):
select text from user_source;
spool off;
可以使用expdp,不過很麻煩
主要是看你的需求,如果只是一兩個存儲過程,例:
select text from all_source where name = '‘; --引號里面填寫要查看的存儲過程名字。
網頁題目:oracle如何導出存過 oracle 導出存儲過程的命令
網址分享:http://m.kartarina.com/article22/hgscjc.html
成都網站建設公司_創新互聯,為您提供App設計、關鍵詞優化、網站排名、網頁設計公司、商城網站、
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯