计算机世界日报
返回首页 产品报价 实用技巧 国产软件 技术天地 站点精选

计算机世界展览会日报

  综合要闻
  企业&人.com
  产品与技术
  网络与通信
  市场与渠道
  99全文检索

CCW网站

  网络世界
  微电脑世界
  IT经理世界
  CCW展览
  信息服务中心   家用电脑世界

兄弟刊物

  电子与信息化
  今日电子
  中国新闻科技
  电子知识产权
  电子产品世界

网上专递

  Linux园地
  友情链接
  冬涛谈法
Dongtao on Law

98内容总汇



实用技巧

高级语言嵌套SQL语句访问DB2中SQLCA

北京新晨计算机公司大连办事处
徐洋

---- [本文为摘略,全文可下载,Zip 11KB]

---- 在IBM的关系型数据库产品DB2中,使用SQL Communication Area(SQLCA)将程序中嵌套的SQL语句运行情况返回给程序及用户。通过在程序中有针对性地对SQLCA实施调用,可对程序中嵌套的各类SQL语句的执行结果实施控制,从而避免程序的意外终止。同时,也可以提高程序的运行效率,减小系统开销和处理时间。本文将对这一方法作一简要介绍。

----

---- SQLCA的结构

---- 我们首先看一下SQLCA的结构定义:

struc sqlca
{
unsigned char     sqlcaid[8];
long              sqlabc;
long              sqlcode;
short             sqlerrml;
unsigned char     sqlerrmc[10];
unsigned char     sqlerrp[8];
long              sqlerrd[6];
unsigned char     sqlwarn[21];
unsigned char     sqlstate[5];
}


 
	... ...
 

---- 调用方法

---- DB2通过函数sqlaintp,可以方便地读取sqlca中SQL语句执行后的结果和错误。此函数定义在sql.h中,可通过下述语句实现对其定义:


 
	... ...
 


---- 对SQLCODE的调用

---- 在对SQLCA的调用中,最常见的就是通过访问SQLCODE来实现的。很多程序员甚至在每条SQL语句执行完毕后都设置检查SQLCODE返回值的代码,以对程序的运行进行监控。当返回值为+0的时,表明SQL语句执行成功;返回值为+100时,表明满足检索条件的记录没找到。一般来说,负的SQLCODE返回负值意味着SQL语句执行失败,程序员可在程序中实现根据不同的SQLCODE返回值,采取不同的程序流程以实现错误控制。例如,当SQLCODE的返回值为-911时, 表明系统检测到了死锁(Dead Lock),程序员可针对这种情况采取以下两种处置方法:

---- (1)设置循环,反复执行查询请求并检测SQLCODE返回值,直至返回值为+0(执行成功)。

---- (2)设置一个计数器,执行查询请求到一定次数后终止程序或向用户发出警报。

---- 值得注意的是,为了保证数据的完整性,有时需要针对返回的错误类型对数据库进行回滚(ROLLBACK)操作,且回滚的起点不一定是未执行成功的SQL语句导致系统所处于的状态。回滚的起点与SQL语句的嵌套类型(动态,静态,复合式)以及错误类型都有关系。尤其是后者,因为有些错误类型会导致系统作一个隐式的回滚(例如SQLCODE -911),从而使回滚的起点判断更为复杂。


 
	... ...
 
---- 对SQLWARN的调用

---- 尽管程序员通常总是忽略SQL执行过程中的警告错误,但在程序中适当引用,可以帮助程序检测到各种潜在的错误,并且可以使编程更加简洁。因此,此类警告信息亦应受到程序员的重视。

---- 警告信息在SQLCA中有两种表示方法。每一个除了+100以外的SQLCODE正返回值都代表一定的警告信息;同时,SQLCA中的SQLWARN[n](n=1,2,3,4,5,6或A)返回值也代表着相应的警告信息。当系统发现警告错误时,系统会以这两种方式通知程序。此时,查询可能会返回一些结果,但此时的结果极有可能是错误或不完整的。当SQLWARN[O]=W时,DB2提供了帮助用户判断具体警告类型的信息,其相应值及含义如下表:

 
	... ...
 
---- 对SQLERRD数组的调用

---- SQLERRD是SQLCA中代表SQL查询运行结果的一个数组。数组中的不同元素有不同的含义。其中较常用的是SQLERRD[3]。它将返回程序中上一次INSERT,UPDATE或DELETE操作所影响到的记录数。否则,程序需要借助一定的循环来统计被以上操作影响到的记录数。但值得注意的是,在执行DELETE操作时,如果相关字段的删除类型被设为CASCADE而导致被删除其它记录数不会被包含在内;同时,如果在DELETE语句中未指定WHERE条件,则SQLERRD[3]的返回值为-1。以上两点在使用此数组时应予以注意。

	... ...
---- DB2支持多种高级语言(包括当前极为流行的C和C++等)通过嵌套SQL语句对其上的数据进行访问。同时,由于对多种嵌套(动态,静态,复合式)方式的支持,更加增强了访问的灵活性。通过在程序中调用SQLCA,可对程序中嵌套的SQL语句的执行结果进行控制,增强了程序的可靠性,防止程序意外终止;也可使程序的编写更加简洁,提高程序的运行效率,缩短系统的处理时间。
 
免 费 订 阅

实用技巧分类

Office应用
CAD
C、C++
数据库应用
Delphi
Internet应用
Java
Notes应用
操作系统应用
PowerBuilder
VB
Visual Foxpro
其他类
上周 排行榜
如 何 投 稿 ?

编者的话

在日常的工作生活中, 我们对计算机软硬件技术的应用开发肯定有许多的心得体会, 拿来和众人分享:让别人得到他们想要的,使自己找到苦苦寻觅的; 小的点点滴滴,大的工程系统,这里都需要。投稿 的关键在“技巧”二 字,知他人所不知,这样的稿件本栏最最欢迎! 大家公认的 好文章自然会有好的奖励。希望每个人 在这里都有所收获...

r2.gif (980 bytes)
  中国惠普
  3Com中国
  Motorola中国
  CA中国
  Cabletron
  Sony在中国
  西门子WinCC
  爱普生中国
  中国建设银行
  德州仪器(TI)
  问博医药


中国计算机世界出版服务公司版权所有