科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网服务器频道INformIX-OnLine客户服务器结构的建立互联网

INformIX-OnLine客户服务器结构的建立互联网

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文介绍了INformIX-OnLine的原理和配置的方法。

2006年10月23日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共2页)

  2.3 用ESQL/C生成存储过程

  因为OnLine 5.0不能用isql直接使用SQL语句生成存储过程,所以一般要使用ESQL/C编写专门的C语言程序来增加或更换一个存储过程。

  $drop procedure tb2;

  $create procedure from "/usr/icbacct/proc/tb2.sql";

  上面两条语句先删除已存在的存储过程tb2,然后再生成新的存储过程,否则无法生成。因为我们不可能为每一个存储过程都编写一个专用的C语言程序,但由于drop语句不能带可变参数运行,比如不支持下面这样的语句:$drop procedure $spname;,所以只好编写一个删除全部存储过程的程序和一个生成全部存储过程的程序,每次要更换一个存储过程都不得不删除全部存储过程然后再重新生成,笔者认为这是一种不好的方法。为此笔者编写了一个C语言程序用来增加或更换一个存储过程,可以带命令行参数运行。方法是在客户机或单机上直接运行aproc <存储过程名> ,就可增加或更换服务器上的一个存储过程。如tb2u.sql生成存储过程tb2,则命令行如下:aproc tb2 tb2u。SQL文件是生成存储过程的*.sql文件,文件名可以省略后缀“.sql”且固定存放在某一目录中。

  其中的sqlcmdtxt结构来源于esql编译时产生的aproc.c中间文件,这也给我们一个启示,在C语言中间程序中有不少值得学习和研究的东西,当遇到用ESQL/C难以解决的问题时不妨看看C语言中间程序,或许会受到启发。比如打开数据库的语句是:

  $datebase icbdb@acct_qz;

  也可直接写成:_iqdbase("icbdb@acct_qz",0);,这就意味着当客户机程序要对多台服务器上的数据库进行操作时可以灵活地选择数据库名。单机上的ESQL/C程序也可用下面语句打开数据库:$database icbdb@acct_qz;,这时使用的就是数据库名的第二种格式,当程序在客户机上运行时又成了第一种格式,此时acct_qz就不再是数据库服务器的名字(DBSERVERNAME)而是服务器的主机名。源程序aproc.ec如下:

  #include

  $include sqlca;

  $include sqlda;

  $char s_sql[50],s_spname[50];

  static char *sqlcmdtxt[ ]={

  " drop procedure tb2",0

  };

  static _SQSTMT _SQ0=;

  main(argc,argv)

  char *argv[ ];

  {

  $database icbdb@acct_qz;

  $begin work;

  sprintf(s_spname,"/usr/icbacct/proc/%s.sql",argv[2]);

  sprintf(s_sql," drop procedure %s",argv[1]);

  strcpy(sqlcmdtxt[0],s_sql);

  _iqstmnt(&_SQ0,sqlcmdtxt,0,(char *)0,(char *)0);

  $create procedure from $s_procname;

  $commit work;

  $close database;

  }

  OnLine 7.1将存储过程以记录的方式存放在系统数据库sysmasters中,OnLine 5.0则不存在系统数据库,但是却有二十几个以sys开头的系统表,所以也可以用isql查询存储过程,方法是选择Form/Generate,直接输入表名sysprocbody和sysprocedures,存储过程也是以记录的形式存放在这两个表中。

  2.4 数据的倒出和倒入

  既然要在单机上运行应用程序,所以有必要将服务器上的数据库的数据倒出并倒入到在单机上的数据库中。在客户机上运行"dbexport icbdb@acct_qz"命令倒出服务器上的数据库的数据,成功运行后将会在当前目录下生成dbexport.out文件和icbdb@acct_qz.exp目录,其中dbexport.out包含生成数据库和数据库表以及建立所有索引的SQL语句,倒出的数据存放在icbdb@acct_qz.exp目录下。将文件dbexport.out和icbdb@acct_qz.exp目录压缩后拷到单机上, 再用命令"dbimport icbdb@acct_qz -l buffered"将数据装入到单机上的数据库中。这一命令首先在单机上的数据库服务器acct_qz上生成数据库icbdb,然后生成所有的表再装入数据,同时生成所有的索引。其中的"-l buffered"允许使用逻辑日志,否则客户机上的程序将无法在单机上运行,原因是客户机程序使用诸如了"begin work"等事务操作语句。这是第一次运行时的操作过程,目的是建立数据库并生成数据库表和索引。

  在单机上建立数据库后,数据的倒出倒入就另外要用SQL语言来做,在客户机上执行下面命令将数据转为文本:$ isql icbdb@acct_qz /usr/icbacct/bin/sh/backup_dbs.sql。

  backup_dbs.sql语句如下(仅以fxa和fxd表为例):

  unload to "/usr/icbacct/tmp1/fxa.txt" select * from fxa where fxa010="111";

  unload to "/usr/icbacct/tmp1/fxd.txt" select * from fxd where fxd010="111";

  将客户机上的文本拷到单机上,再用如下命令将文本数据装入在单机上的数据库中:

  $ isql icbdb@acct_qz /usr/icbacct/bin/sh/dbs_hf.sql

  这条命令也可以将客户机的文本数据恢复到服务器上的数据库中,当然在单机运行时可以省去"@acct_qz"。由于表fxd记录比较多,考虑到逻辑日志的承受能力,故将删除与恢复分成两个事务来做,方法是在做完删除操作后就关闭数据库,然后再打开数据库做插入操作。因为我们已经将参数LTAPEDEV设置成/dev/null,当OnLine在处理一个事务时,如果逻辑日志已满就不会要求备份逻辑日志而是从头开始循环使用。但在处理一个长事务时,如果逻辑日志已满是不会自动循环的,因为下一个要使用的逻辑日志文件也已被这一事务所占用,此时OnLine将停止响应,即不会提交也不会回滚该事务。可以用"tbstat -l"命令查看逻辑日志的使用情况。dbs_hf.sql语句如下:

  database icbdb@acct_qz;

  begin work;

  lock table fxa in exclusive mode;

  delete from fxa;

  load from "/usr/icbacct/tmp1/fxa.txt" insert into fxa;

  commit work;

  close database;

  database icbdb@acct_qz;

  begin work;

  lock table fxd in exclusive mode;

  delete from fxd;

  commit work;

  close database;

  database icbdb@acct_qz;

  begin work;

  lock table fxd in exclusive mode;

  load from "/usr/icbacct/tmp1/fxd.txt" insert into fxd;

  commit work;

  close database;

  2.5 安装应用程序

  直接将客户机上的应用程序拷到单机上,不用任何修改即可运行。在单机上编写的程序不用任何修改也可在客户机上运行,如上面的aproc程序就可在单机和客户机上运行。

  3 应用情况

  笔者在一台伦飞3100C笔记本中,用50兆硬盘空间作为数据库空间,其中分配10兆作为逻辑日志使用,会计业务数据为5兆多,在生成数据库,索引和存储过程后,才占用30几兆的硬盘空间。这种方法给笔者在学习和维护新的会计应用程序时提供了很大的帮助。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章