在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 如果坏行数超过了极限,给出提示信息,请用户指定解决方法