歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> SHELL編程

Shell腳本和Informix的交互實現技巧

在Linux/Unix下一些程序是命令行或者服務程序,一般都有一個配置文件來描述其運行規則,而這些規則通常會保存在數據庫中,由其它應用程序來維護。這就牽涉一個問題,如何從數據庫中獲取最新的規則來驅動後台程序。同樣後台程序運行結束後,生成的結果有時需要寫回數據庫,以便其它應用程序讀取。

  通過閱讀本文章,讀者能了解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()

  {

  sqltxt="$1";

  pre_sql="output to pipe cat without headings ";

  sqltxt=$pre_sql"$sqltxt";

  echo "$sqltxt"|dbaccess test 2>/dev/null;

  }

  在清單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()

  {

  sqltxt="$1";

  unload_file="$2";

  temp_file="$3";

  pre_sql="unload to $unload_file delimiter ',' ";

  post_sql="";

  echo $pre_sql > $temp_file;

  echo "$sqltxt" >> $temp_file;

  echo $post_sql >> $temp_file;

  dbaccess testdb < $temp_file 2>/dev/null;

  rm -f $temp_file;

  }

  在清單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;

  INSERT INTO data_crm_list;

  清單3中的內容表示將crm.dat數據文件加載到data_crm_list表中,分隔符是'|', 數據字段個數為3。

Copyright © Linux教程網 All Rights Reserved