Oracle數據的導入與導出


本文針對window操作系統與oracle12C的版本。

1.sqlplus執行單個sql文件

1.執行sqlplus登陸命令:sqlplus username/password@host:port/service_name as sysdba (其中普通用戶可以不加后面的 as sysdba)

2.在sqlplus下執行sql文件命令:@file_path

 

2.sqlplus執行多個sql文件

1.新建一個sql文件,在其添加需執行的sql文件路徑:

@file_path1

@file_path2

。。。。。

2.在sqlplus下執行新建的sql文件即可

 

3.oracle導出與導入工具expdp,impdp

使用expdp和impdp時應該注意的事項:

exp和imp是客戶端工具程序,它們既可以在客戶端使用,也可以在服務端使用。
expdp和impdp是服務端的工具程序,他們只能在oracle服務端使用,不能在客戶端使用。
imp只適用於exp導出的文件,不適用於expdp導出文件;impdp只適用於expdp導出的文件,而不適用於exp導出文件。

1.導出

1.以sysdba身份登陸sqlplus,如命令:sqlplus / as sysdba

2.創建邏輯目錄,該命令不會在操作系統創建真正的目錄,create or replace directory 目錄別名 as '操作系統上目錄的絕對路徑';

如:create directory xyy as 'D:\cowry\cj';

3.查看管理理員目錄(同時查看操作系統是否存在,因為oracle並不關心該目錄是否存在,如果不存在,后面會出錯)

select * from dba_directories;

4.賦予需要導出的用戶在指定目錄的操作權限。命令:grant read,write on directory 目錄別名 to user_name;

5.退出sqlplus,在cmd窗口執行以下命令:

1)導出用戶

 expdp user_name/pwd@host:port/service_name dumpfile=xxx.dmp [logfile=xxx.log] directory=xxx [schemas=xxx] [compression=xxx] [parallel=xxx]

 

2)導出指定表

 expdp user_name/pwd@host:port/service_name dumpfile=xxx.dmp directory=xxx tables=xxx,xxx1,...

 

還有其他導出表空間,整個數據庫等等模式,具體可查相關資料。

dumpfile:導出的數據文件的名稱。

logfile:日志文件

directory:導出的邏輯目錄,一定要在oracle中創建完成的,並授權用戶讀寫權限

schemas:使用dblink導出的用戶不是本地的用戶,需要加上schema來確定導出的用戶,類似於exp中的owner,但還有一定的區別。

compression:壓縮轉儲文件。有效的關鍵字值為: ALL, DATA_ONLY, [METADATA_ONLY] 和 NONE。

parallel:並行數量。

tables:指定導出的表。

network_link:源系統的遠程數據庫鏈接的名稱。使用的dblink來遠程導出,需要指定dblink的名稱。

 

2.導入

1)導入用戶

  impdp user_name/pwd@host:port/service_name dumpfile=xxx.dmp [logfile=xxx.log] directory=xxx [remap_schema=xxx] [parallel=xxx]

 

2)導入表

  impdp user_name/pwd@host:port/service_name dumpfile=xxx.dmp directory=xxx [remap_schema=xxx:xxx1] [parallel=xxx] tables=xxx,xxx1,...

 

remap_schema:將一個用戶的的數據遷移到另外一個用戶

 

4.oracle使用sqlloader導入批量數據

 

SQL * Loader功能

SQL * Loader將外部文件中的數據加載到Oracle數據庫的表中。

它具有強大的數據解析引擎,對數據文件中的數據格式幾乎沒有限制。您可以使用SQL * Loader執行以下操作:

  • 如果數據文件位於與數據庫不同的系統上,則通過網絡加載數據。

  • 在同一個加載會話期間從多個數據文件加載數據。

  • 在同一個加載會話期間將數據加載到多個表中。

  • 指定數據的字符集。

  • 有選擇地加載數據(您可以根據記錄的值加載記錄)。

  • 使用SQL函數在加載數據之前處理數據。

  • 在指定列中生成唯一的順序鍵值。

  • 使用操作系統的文件系統訪問數據文件。

  • 從磁盤,磁帶或命名管道加載數據。

  • 生成復雜的錯誤報告,極大地幫助排除故障。

  • 加載任意復雜的對象關系數據。

  • 使用輔助數據文件來加載LOB和集合。

  • 使用傳統的,直接的路徑或外部表負載。

 

您可以通過兩種方式使用SQL * Loader:帶或不帶控制文件。控制文件控制SQL * Loader的行為以及加載中使用的一個或多個數據文件。使用控制文件可以更好地控制加載操作,這對於更復雜的加載情況可能是理想的。但是對於簡單加載,您可以在不指定控制文件的情況下使用SQL * Loader; 這被稱為SQL * Loader express模式。

sqlloader參數說明,具體可在cmd輸入sqlldr查看

 1 有效的關鍵字:
 2 
 3     userid -- ORACLE 用戶名/口令
 4    control -- 控制文件名
 5        log -- 日志文件名
 6        bad -- 錯誤文件名
 7       data -- 數據文件名
 8    discard -- 廢棄文件名
 9 discardmax -- 允許廢棄的文件的數目         (全部默認)
10       skip -- 要跳過的邏輯記錄的數目  (默認 0)
11       load -- 要加載的邏輯記錄的數目  (全部默認)
12     errors -- 允許的錯誤的數目         (默認 50)
13       rows -- 常規路徑綁定數組中或直接路徑保存數據間的行數
14                (默認: 常規路徑 64, 所有直接路徑)
15   bindsize -- 常規路徑綁定數組的大小 (以字節計)  (默認 256000)
16     silent -- 運行過程中隱藏消息 (標題,反饋,錯誤,廢棄,分區)
17     direct -- 使用直接路徑                     (默認 FALSE)
18    parfile -- 參數文件: 包含參數說明的文件的名稱
19   parallel -- 執行並行加載                    (默認 FALSE)
20       file -- 要從以下對象中分配區的文件
21 skip_unusable_indexes -- 不允許/允許使用無用的索引或索引分區  (默認 FALSE)
22 skip_index_maintenance -- 沒有維護索引, 將受到影響的索引標記為無用  (默認 FALSE)
23 commit_discontinued -- 提交加載中斷時已加載的行  (默認 FALSE)
24   readsize -- 讀取緩沖區的大小               (默認 1048576)
25 external_table -- 使用外部表進行加載; NOT_USED, GENERATE_ONLY, EXECUTE
26 columnarrayrows -- 直接路徑列數組的行數  (默認 5000)
27 streamsize -- 直接路徑流緩沖區的大小 (以字節計)  (默認 256000)
28 multithreading -- 在直接路徑中使用多線程
29  resumable -- 對當前會話啟用或禁用可恢復  (默認 FALSE)
30 resumable_name -- 有助於標識可恢復語句的文本字符串
31 resumable_timeout -- RESUMABLE 的等待時間 (以秒計)  (默認 7200)
32 date_cache -- 日期轉換高速緩存的大小 (以條目計)  (默認 1000)
33 no_index_errors -- 出現任何索引錯誤時中止加載  (默認 FALSE)
34 partition_memory -- 開始溢出的直接路徑分區內存限制 (kb)  (默認 0)
35      table -- 用於快速模式加載的表
36 date_format -- 用於快速模式加載的日期格式
37 timestamp_format -- 用於快速模式加載的時間戳格式
38 terminated_by -- 由用於快速模式加載的字符終止
39 enclosed_by -- 由用於快速模式加載的字符封閉
40 optionally_enclosed_by -- (可選) 由用於快速模式加載的字符封閉
41 characterset -- 用於快速模式加載的字符集
42 degree_of_parallelism -- 用於快速模式加載和外部表加載的並行度
43       trim -- 用於快速模式加載和外部表加載的截取類型
44        csv -- 用於快速模式加載的 csv 格式數據文件
45     nullif -- 用於快速模式加載的表級 nullif 子句
46 field_names -- 用於快速模式加載的數據文件第一條記錄字段名設置
47 dnfs_enable -- 啟用或禁用輸入數據文件 Direct NFS (dNFS) 的選項  (默認 FALSE)
48 dnfs_readbuffers -- Direct NFS (dNFS) 讀緩沖區數  (默認 4)
49 sdf_prefix -- 要附加到每個 LOB 文件和輔助數據文件的開頭的前綴
50       help -- 顯示幫助消息  (默認 FALSE)
51 empty_lobs_are_null -- 將空白 LOB 設置為空值  (默認 FALSE)
52   defaults -- 直接路徑默認值加載; EVALUATE_ONCE, EVALUATE_EVERY_ROW, IGNORE, IGNORE_UNSUPPORTED_EVALUATE_ONCE, IGNORE_UNSUPPORTED_EVALUATE_EVERY_ROW
53 direct_path_lock_wait -- 當前已鎖定時, 等待表訪問權限  (默認 FALSE)
54 
55 PLEASE NOTE: 命令行參數可以由位置或關鍵字指定
56 。前者的例子是 'sqlldr
57 scott/tiger foo'; 后一種情況的一個示例是 'sqlldr control=foo
58 userid=scott/tiger'。位置指定參數的時間必須早於
59 但不可遲於由關鍵字指定的參數。例如,
60 允許 'sqlldr scott/tiger control=foo logfile=log', 但是
61 不允許 'sqlldr scott/tiger control=foo log', 即使
62 參數 'log' 的位置正確。

 

1.建立控制文件,后綴名為.ctl,在控制文件加入以下內容:

OPTIONS (SKIP=num,ROWS=num,DIRECT=true,BINDSIZE=num)

LOAD DATA

CHARACTERSET 字符集

INFILE "數據文件路徑" BADFILE "錯誤文件路徑,其文件后綴為.bad" DISCARDFILE "廢棄文件路徑,其文件后綴為.dis"

如有多個數據文件繼續添加
INFILE "xxx" BADFILE "xxx" DISCARDFILE "xxx"

......

[操作類型] INTO TABLE table_name
fields terminated by "xxx"

optionally enclosed by "xxx"
trailing nullcols
(col,col1,col2,...)

參數說明:

SKIP:跳過開始的行數,即不讀取的行數。

 

ROWS:對於傳統常規路徑導入的情況,代表一次提交的行數。

 

BINDSIZE:每次提交記錄的緩沖區的最大值(僅適用於傳統常規路徑加載),默認256000 Bytes。通過BINDSIZE的設定,要比默認值和通過參數ROWS計算的緩沖區大小更優先。

即BINDSIZE能夠制約ROWS,如果ROWS提交的數據需要的緩沖區大於BINDSIZE的設定,會以BINDSIZE的設定為准。

 

DIRECT:使用直接路徑(默認FALSE)。

 

CHARACTERSET:通常會出現中文亂碼問題。即數據文件的字符集編碼與oracle字符集編碼不一致導致中文亂碼問題。其值有:ZHS16GBK。。。

 

操作類型:

  insert     --為缺省方式,在數據裝載開始時要求表為空
  append  --在表中追加新記錄
  replace  --刪除舊記錄(用 delete from table 語句),替換成新裝載的記錄
  truncate --刪除舊記錄(用 truncate table 語句),替換成新裝載的記錄

 

fields terminated by:每行字段與字段之間的分隔符。

 

optionally enclosed by:數據中每個字段用 "" 框起,比如字段中有 "," 分隔符時。對於包裹的字段為中文,可能會出現導不進數據庫,那么可嘗試把源數據文件編碼格式修改為ASCII

 

trailing nullcols:如要導入源文件此列內容為空,在導入到數據庫表中,此列內容就是null。

 

2.在cmd窗口執行命令:

  sqlldr user_name/pwd@service_name control=控制文件路徑 log=日志文件路徑

 

5.oracle使用UTL_FILE包導出批量數據

文件I/O對於數據庫的開發來說顯得很重要,比如數據庫中的一部分數據來自於磁盤文件,那么就需要使用I/O接口把數據導入到數據庫中來。在PL/SQL中沒有直接的I/O接口,  

一般在調試程序時可以使用Oracle自帶的DBMS_OUTPUT包的put_line函數(即向屏幕進行I/O操作)即可,但是對於磁盤文件的I/O操作它就無能為力了。

其實Oracle同樣也提供了可以進行文件I/O的實用包-----UTL_FILE包,利用這個實用包提供的函數來實現對磁盤的I/O操作。

 

1.以sysdba身份創建目錄:CREATE OR REPLACE DIRECTORY 目錄別稱 AS '目錄路徑';

 

2.把路徑的讀寫權限賦予用戶:GRANT READ,WRITE ON DIRECTORY 目錄別稱 TO 用戶名;

 

3.在用戶中創建以下存儲過程:

 1 create or replace PROCEDURE SQL_TO_FILE(P_QUERY IN VARCHAR2,P_DIR IN VARCHAR2,P_FILENAME IN VARCHAR2)
 2 IS
 3   L_OUTPUT UTL_FILE.FILE_TYPE; 
 4   L_THECURSOR INTEGER DEFAULT DBMS_SQL.OPEN_CURSOR;
 5   L_COLUMNVALUE VARCHAR2(4000);
 6   L_STATUS INTEGER;
 7   L_COLCNT NUMBER := 0;
 8   L_SEPARATOR VARCHAR2(1);
 9   L_DESCTBL DBMS_SQL.DESC_TAB;
10   P_MAX_LINESIZE NUMBER := 32000;
11 BEGIN
12   L_OUTPUT := UTL_FILE.FOPEN(P_DIR, P_FILENAME, 'W', P_MAX_LINESIZE);
13   EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT=''YYYY-MM-DD HH24:MI:SS''';
14   DBMS_SQL.PARSE(L_THECURSOR, P_QUERY, DBMS_SQL.NATIVE);
15   DBMS_SQL.DESCRIBE_COLUMNS(L_THECURSOR, L_COLCNT, L_DESCTBL);
16   FOR I IN 1 .. L_COLCNT LOOP
17     UTL_FILE.PUT(L_OUTPUT,L_SEPARATOR || '"' || L_DESCTBL(I).COL_NAME || '"');
18     DBMS_SQL.DEFINE_COLUMN(L_THECURSOR, I, L_COLUMNVALUE, 4000);
19     L_SEPARATOR := ',';
20   END LOOP;
21   UTL_FILE.NEW_LINE(L_OUTPUT);
22   L_STATUS := DBMS_SQL.EXECUTE(L_THECURSOR);
23   WHILE (DBMS_SQL.FETCH_ROWS(L_THECURSOR) > 0) LOOP
24     L_SEPARATOR := '';
25     FOR I IN 1 .. L_COLCNT LOOP
26       DBMS_SQL.COLUMN_VALUE(L_THECURSOR, I, L_COLUMNVALUE);
27       UTL_FILE.PUT(L_OUTPUT,
28                   L_SEPARATOR || '"' ||
29                   TRIM(BOTH ' ' FROM REPLACE(L_COLUMNVALUE, '"', '""')) || '"');
30       L_SEPARATOR := ',';
31       END LOOP;
32     UTL_FILE.NEW_LINE(L_OUTPUT);
33   END LOOP;
34   DBMS_SQL.CLOSE_CURSOR(L_THECURSOR);
35   UTL_FILE.FCLOSE(L_OUTPUT);
36 EXCEPTION
37   WHEN OTHERS THEN
38     RAISE;
39 END;

 

4.執行上述過程

EXEC SQL_TO_FILE('para','para1','para2');

其中第一個參數為:查詢數據的SQL,第二個為:目錄別稱,第三個為:導出的文件名。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM