|
实用技巧
高级语言嵌套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语句的执行结果进行控制,增强了程序的可靠性,防止程序意外终止;也可使程序的编写更加简洁,提高程序的运行效率,缩短系统的处理时间。
|