在Oracle數(shù)據(jù)庫表中加載多個(gè)數(shù)據(jù)文件的方法詳解
在本文中,我將展示 SQL 加載器 + Unix 腳本實(shí)用程序的強(qiáng)大功能,其中 SQL 加載器可以使用自動(dòng) shell 腳本加載多個(gè)數(shù)據(jù)文件。這在處理大量數(shù)據(jù)以及需要將數(shù)據(jù)從一個(gè)系統(tǒng)移動(dòng)到另一個(gè)系統(tǒng)時(shí)非常有用。
它適合涉及大量歷史數(shù)據(jù)的遷移項(xiàng)目。那么就不可能為每個(gè)文件運(yùn)行 SQL 加載程序并等待其加載。因此,最好的選擇是讓包含 SQL 加載命令的 Unix 程序始終運(yùn)行。一旦文件夾位置中有任何文件可用,它將從該文件夾位置拾取文件并立即開始處理。
設(shè)置
示例程序是我做的。在 Macbook 中,Oracle 的安裝與 Windows 機(jī)器上的安裝有所不同。
請(qǐng)觀看包含如何在 Mac 上安裝 Oracle 的詳細(xì)步驟的視頻。
讓SQL 開發(fā)人員遵守 Java 8。
現(xiàn)在讓我們來演示一下這個(gè)例子。
在 Oracle DB 表中加載多個(gè)數(shù)據(jù)文件
因?yàn)樗?Macbook,所以我必須在 Oracle 虛擬機(jī)內(nèi)完成所有操作。
讓我們看看下圖 SQL Loader 是如何工作的。
使用案例
需要使用 Shell 腳本 + SQL 加載器自動(dòng)化將數(shù)百萬學(xué)生的信息加載到學(xué)生表中。該腳本將始終在 Unix 服務(wù)器中運(yùn)行并輪詢。DAT 文件,一旦 DAT 文件就位,它將對(duì)其進(jìn)行處理。另外,如果存在任何不良數(shù)據(jù),則需要單獨(dú)識(shí)別它們。
此類示例在需要加載數(shù)百萬歷史記錄的遷移項(xiàng)目中非常有用。
- 從舊系統(tǒng),將定期生成實(shí)時(shí)源(DAT 文件)并將其發(fā)送到新系統(tǒng)服務(wù)器。
- 在新系統(tǒng)中,服務(wù)器文件可用,并將使用自動(dòng)化 Unix 腳本加載到數(shù)據(jù)庫中。
- 現(xiàn)在讓我們運(yùn)行腳本,該腳本可以在Unix服務(wù)器上一直運(yùn)行。為了實(shí)現(xiàn)這一點(diǎn),整個(gè)代碼被放入下面的 while 塊中。
while true [some logic] done
過程
1、我已復(fù)制以下文件夾中的所有文件+文件夾結(jié)構(gòu)。
/home/oracle/Desktop/example-SQLdr/
2、請(qǐng)參閱以下文件(ls -lrth)
rwxr-xr-x. 1 oracle oinstall 147 Jul 23 2022 student.ctl -rwxr-xr-x. 1 oracle oinstall 53 Jul 23 2022 student_2.dat -rwxr-xr-x. 1 oracle oinstall 278 Dec 9 12:42 student_1.dat drwxr-xr-x. 2 oracle oinstall 48 Dec 24 09:46 BAD -rwxr-xr-x. 1 oracle oinstall 1.1K Dec 24 10:10 TestSqlLoader.sh drwxr-xr-x. 2 oracle oinstall 27 Dec 24 11:33 DISCARD -rw-------. 1 oracle oinstall 3.5K Dec 24 11:33 nohup.out drwxr-xr-x. 2 oracle oinstall 4.0K Dec 24 11:33 TASKLOG -rwxr-xr-x. 1 oracle oinstall 0 Dec 24 12:25 all_data_file_list.unx drwxr-xr-x. 2 oracle oinstall 6 Dec 24 12:29 ARCHIVE
3、如下圖,student表中沒有數(shù)據(jù)。
4、現(xiàn)在使用以下命令運(yùn)行腳本nohup.out ./TestSqlLoader.sh 通過這樣做,它將始終在 Unix 服務(wù)器中運(yùn)行。
5、現(xiàn)在腳本將運(yùn)行,它將通過 SQL 加載器加載兩個(gè) .dat 文件。
6、該表應(yīng)加載兩個(gè)文件的內(nèi)容。
7、現(xiàn)在我再次刪除表數(shù)據(jù),只是為了證明腳本始終在服務(wù)器中運(yùn)行,我將僅將兩個(gè) DAT 文件從 ARCHIVE 放置到當(dāng)前目錄。
8、再次將這兩個(gè)數(shù)據(jù)文件放入當(dāng)前目錄中。
-rwxr-xr-x. 1 oracle oinstall 147 Jul 23 2022 student.ctl -rwxr-xr-x. 1 oracle oinstall 53 Jul 23 2022 student_2.dat -rwxr-xr-x. 1 oracle oinstall 278 Dec 9 12:42 student_1.dat drwxr-xr-x. 2 oracle oinstall 48 Dec 24 09:46 BAD -rwxr-xr-x. 1 oracle oinstall 1.1K Dec 24 10:10 TestSqlLoader.sh drwxr-xr-x. 2 oracle oinstall 27 Dec 24 12:53 DISCARD -rw-------. 1 oracle oinstall 4.3K Dec 24 12:53 nohup.out drwxr-xr-x. 2 oracle oinstall 4.0K Dec 24 12:53 TASKLOG -rwxr-xr-x. 1 oracle oinstall 0 Dec 24 13:02 all_data_file_list.unx drwxr-xr-x. 2 oracle oinstall 6 Dec 24 13:03 ARCHIVE
9、再次看到 Student 表已加載所有數(shù)據(jù)。
10、該腳本始終在服務(wù)器上運(yùn)行
[oracle@localhost example-sqldr]$ ps -ef|grep Test oracle 30203 1 0 12:53? 00:00:00 /bin/bash ./TestSqlLoader.sh oracle 31284 31227 0 13:06 pts/1 00:00:00 grep --color=auto Test
完整源代碼供參考
#!/bin/bash bad_ext='.bad' dis_ext='.dis' data_ext='.dat' log_ext='.log' log_folder='TASKLOG' arch_loc="ARCHIVE" bad_loc="BAD" discard_loc="DISCARD" now=$(date +"%Y.%m.%d-%H.%M.%S") log_file_name="$log_folder/TestSQLLoader_$now$log_ext" while true; do ls -a *.dat 2>/dev/null > all_data_file_list.unx for i in `cat all_data_file_list.unx` do #echo "The data file name is :-- $i" data_file_name=`basename $i .dat` echo "Before executing the sql loader command ||Starting of the script" > $log_file_name sqlldr userid=hr/oracle@orcl control=student.ctl errors=15000 log=$i$log_ext bindsize=512000000 readsize=500000 DATA=$data_file_name$data_ext BAD=$data_file_name$bad_ext DISCARD=$data_file_name$dis_ext mv $data_file_name$data_ext $arch_loc 2>/dev/null mv $data_file_name$bad_ext $bad_loc 2>/dev/null mv $data_file_name$dis_ext $discard_loc 2>/dev/null mv $data_file_name$data_ext$log_ext $log_folder 2>/dev/null echo "After Executing the sql loader command||File moved successfully" >> $log_file_name done ## halt the procesing for 2 mins sleep 1m done
CTL 文件如下。
OPTIONS (SKIP=1) LOAD DATA APPEND INTO TABLE student FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS ( id, name, dept_id )
SQL 加載器規(guī)范
1. control --> name of the .ctl file
2.errors=15000(SQL Loader 允許的最大錯(cuò)誤數(shù))
3.log=iiilog_ext(日志文件的名稱)
4.bindsize=512000000(綁定數(shù)組的最大大?。?/p>
5.readsize=500000(最大大?。?nbsp;
DATA=datafilenamedata_file_namedataf?ilen?amedata_ext(數(shù)據(jù)文件的名稱和位置)
BAD=datafilenamedata_file_namedataf?ilen?amebad_ext(壞文件的名稱和位置)
DISCARD=datafilenamedata_file_namedataf?ilen?amedis_ext(丟棄文件的名稱和位置)
綜上所述,這種方式可以通過SQL加載器+Unix腳本自動(dòng)化的方式加載數(shù)百萬條記錄,以上參數(shù)可以根據(jù)需要設(shè)置。
以上就是在Oracle數(shù)據(jù)庫表中加載多個(gè)數(shù)據(jù)文件的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Oracle加載多個(gè)數(shù)據(jù)文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
oracle數(shù)據(jù)庫中chr()函數(shù)和concat函數(shù)的使用說明
這篇文章主要介紹了oracle數(shù)據(jù)庫中chr()函數(shù)和concat函數(shù)的使用說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07Oracle數(shù)據(jù)庫數(shù)據(jù)遷移完整解決步驟
我們常常需要對(duì)數(shù)據(jù)進(jìn)行遷移,遷移到更性能配置更高級(jí)的主機(jī)OS上、遷移到遠(yuǎn)程的機(jī)房、遷移到不同的平臺(tái)下,這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)庫數(shù)據(jù)遷移的相關(guān)資料,需要的朋友可以參考下2024-02-02詳解Oracle 中實(shí)現(xiàn)數(shù)據(jù)透視表的幾種方法
這篇文章主要介紹了詳解Oracle 中實(shí)現(xiàn)數(shù)據(jù)透視表的幾種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04oracle創(chuàng)建一個(gè)數(shù)據(jù)庫三步走
這篇文章主要介紹了oracle如何創(chuàng)建數(shù)據(jù)庫和用戶,以及每一步所涉及到的代碼,需要的朋友可以參考下2015-08-08