加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 教程 > 正文

Shell脚本和Informix的交互实现方法

发布时间:2021-11-23 14:15:58 所属栏目:教程 来源:互联网
导读:在Linux/Unix下一些程序是命令行或者服务程序,一般都有一个配置文件来描述其运行规则,而这些规则通常会保存在数据库中,由其它应用程序来维护。这就牵涉一个问题,如何从数据库中获取最新的规则来驱动后台程序。同样后台程序运行结束后,生成的结果有时需

在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。

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读