通過閱讀本文章,讀者能了解Shell腳本和Informix交互的一些常用技巧和方法,實現諸如查詢、增加、刪除、修改數據功能,最終實現數據庫、後台程序之間的信息交互。
1. Informix簡要介紹
Informix是IBM公司出品的關系數據庫管理系統(RDBMS)家族。作為一個集成解決方案,它被定位為作為IBM在線事務處理(OLTP)旗艦級數據服務系統。 IBM對Informix和DB2都有長遠的規劃,兩個數據庫產品互相吸取對方的技術優勢。目前最新版本的是Informix 11.7,這個最新的版本在未來十年對IBM Informix繼續提供力量,其引擎有效的解決OLTP,決定了可以更好的支持各種規模的企業和合作伙伴的決策支持應用。
2.Linux/Unix Shell簡要介紹
Linux/Unix Shell也叫做命令行界面,是一種控制系統的腳本語言。它是Linux/Unix操作系統下傳統的用戶和計算機的交互界面。用戶直接輸入命令來執行各種各樣的任務,隱藏了操作系統低層的細節。
Shell的主要功能:命令執行、輸入/輸出重定向、環境控制、後台處理、Shell腳本。
3.Shell與Informix交互的基本方法
Shell通過調用dbaccess在Informix上執行各種SQL,而通過調用dbload可以將文件加載到數據庫中。
3.1. 通過dbaccess連接數據庫
dbaccess提供了用於輸入、執行和調試結構化查詢語言(SQL)語句與存儲過程語言(SPL)例程的用戶界面。假設聯機的數據庫服務器包含一個名為mystores的數據庫,要使mystores數據庫成為當前數據庫,可以通過db2access mystores來啟動DB-Access.也可以通過命令dbaccess //xyz/newstores 連接到xyz數據庫服務器上的newstores數據庫(未聯機)。
3.2. 通過dbaccess執行SQL
當從命令行調用dbaccess時,可以指定某個數據庫作為當前的數據庫、執行包含一個或多個SQL語句的文件以及顯示多個級別的錯誤信息。
例1:dbaccess test insert.sql
表示:在test數據庫執行名為insert.sql的文件中SQL語句的命令。
例2:dbaccess - insert.sql
表示:在insert.sql上文件中指定的數據庫上執行文件中的SQL語句的命令。
下面函數被調用後,調用dbaccess來執行相關的SQL並將結果輸出到標准輸出中。
清單1
ExecuteSqlSelect()在清單1的代碼中,$1 表示函數的第1個參數,在這裡第1個參數為要執行的SQL語句;pre_sql變量中的代碼是用來屏蔽dbaccess執行時輸出的運行日志信息,如果不加此設置,不會影響函數執行結果,只是執行過程中出現很多dbaccess運行日志信息。
echo "$sqltxt"|dbaccess test 2>/dev/null表示用dbaccess命令連接test數據庫,然後執行$sqltxt語句,並將錯誤輸出到/dev/null。
上面函數在Shell中調用方式如下:
User_name=`ExecuteSqlSelect "select user_name from t_test;"`;3.3. 利用Shell調用dbaccess導出記錄
下面函數被調用後,會執行傳入的SQL並將結果導出到一個文件中。
清單2
ExecuteSqlUnloadFile()在清單2的代碼中,$1 、$2 、$3表示函數的第1個、第2個、第3個參數。
第1個參數為SQL語句。
第2個參數為輸出文件名稱。
第3個參數為臨時文件名稱(執行結束會被刪除)。
unload to $unload_file delimiter ',' 表示記錄導出時存為文件名為$unload_file的文件,在這裡記錄之間的分隔符用逗號表示。
$temp_file文件為臨時文件,用來保存SQL語句,在函數執行末尾其內容將被刪除。
dbaccess testdb < $temp_file 2>/dev/null表示用dbaccess命令連接testdb數據庫,然後執行$temp_file文件中的SQL語句,並將錯誤輸出到/dev/null。
上面函數在Shell中調用方式如下:
ExecuteSqlUnloadFile "select c1,c2 from t_test" "t_test.dat" "t_test.tmp";
3.4. 利用dbload導入文件
dbload的功能是將一至多個ASCII文件中的數據傳送到一至多個已有的表中。
語法為:dbload [-d dbname ] [-c cfilename] [-l logfile] [-e errnum] [-n nnum] [-i inum] [-s] [-p] [-r] [-k] [-X]。
其中主要選項說明如下:
-d dbname 指定接收數據的數據庫名
-c cfilename 指定指定dbload命令文件的文件名
-l logfile 指定錯誤日志文件的文件名
-r 在裝入數據期間允許其他用戶修改表中數據(裝入數據期間不封鎖表)
-s 指示dbload 檢查命令文件中語句的語法,而不插入數據
-i inum 指示dbload忽略指定數目的行數
-n nnum 指示dbload在插入指定數目的新行後提交操作
-e errnum 指定dbload 中止前可讀入的壞行數
-p 如果壞行數超過了極限,給出提示信息,請用戶指定解決方法
例如: dbload -d testdb -c load.ctl -n 10000 -l error.log。這個命令表示將按照load.ctl控制文件的指示,加載數據到testdb 數據庫中, 每10000條記錄提交一次,錯誤數據將寫入error.log文件。以下是load.ctl控制文件的內容。
清單3
FILE crm.dat DELIMITER '|' 3;清單3中的內容表示將crm.dat數據文件加載到data_crm_list表中,分隔符是'|', 數據字段個數為3。