嵌套SQL语句访问DB2中SQLCA的调用技巧(二)

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


SQLCA值 返回值 警告内容
SQLWARN[1] W 序主变量长度不够而发生截取
SQLWARN[2] W 字段功能处理的数据中有空(NULL)值
SQLWARN[3] W 返回字段个数大于程序定义的序主变量个数
SQLWARN[4] W 在UPDATE或DELETE操作中未指定WHERE条件
SQLWARN[6] W 对时间数据进行数学运算后进行修正
SQLWARN[A] W 转换出错
假设某学校要计算某一学期各班,各科,个人的平均成绩。其中,个人平均成绩=(个人总分)/(本学期所学科目数)。由于工作人员疏忽,误将某一同学的学期学习科目输为0。在使用嵌套SQL语句的程序对相关数据进行处理时,SQLCODE返回值为-802(除数为零)导致程序终止运行。尽管用户知道可能是某一项数据错误,但无法知道具体是哪一项数据错误。对于一个拥有较多数据的学校来说,查找起来是非常费事的。通过下述办法可以很好的解决这一问题:在定义代表计算结果的序主变量的同时,为其指定一个可以为空的指示变量,如 :AVGRD :IND代表序主变量为AVGRD,指示变量为IND。此时发生被零除错误时,指示变量值被设为-2,同时SQLCODE返回值为+802警告信息。程序捕捉到此信息时,可向用户提供相应的信息,帮助用户确定出错数据位置。
当SQLWARN[O]的值为W时,表明 系统检测到警告错误。此时系统提供的警告信息也可被程序员所利用。比如:当程序把一个表中的某一字符型字段值传入一个比其长度要短的序主变量中时,发生字符截取。尽管此时SQLCODE会返回+0,但程序获取的数据是不完整的。通过为序主变量指定一个指示变量,发生同样错误时,SQLWARN[O]和SQLWARN[1]的返回值都为W,同时,指示变量被赋给了字段中数据的实际长度。此种方法甚至可以用来判断表中字段中字符串数据的实际长度。
对SQLERRD数组的调用
SQLERRD是SQLCA中代表SQL查询运行结果的一个数组。数组中的不同元素有不同的含义。其中较常用的是SQLERRD[3]。它将返回程序中上一次INSERT,UPDATE或DELETE操作所影响到的记录数。否则,程序需要借助一定的循环来统计被以上操作影响到的记录数。但值得注意的是,在执行DELETE操作时,如果相关字段的删除类型被设为CASCADE而导致被删除其它记录数不会被包含在内;同时,如果在DELETE语句中未指定WHERE条件,则SQLERRD[3]的返回值为-1。以上两点在使用此数组时应予以注意。SQLERRD中各元素的含义以及其对于复合式SQL语句,连接方法的不同含义如下:
SQLERRD元素 表示意义 复合式SQL语句 连接方式
SQLERRD[2] 保存当前SQL语句处理的行数。但若当前SQL失败, 则无定义; 若在数组操作中出错, 则停于出错行, 这时给出成功处理的行数; OPEN 执行后, 清为0, FECTH 后增值(原有值+上本次fetch的行数); EXECUTE、INSERT、UPDATE、SELETE和SELECT后, 为成功处理的行数。
SQLERRD[3] 返回的记录数(估计)及INSERT/UPDATE或DELETE操作所影响到的记录数(不包含因限制条件而影响到的记录) 总语句数 0:由底层客户机的一段式提交委托确认1:一段式提交2:一段式只读提交3:两段式提交
SQLERRD[4] 指出语句中出错的位移, 首字符位移为0。
SQLERRD[5] INSERT/UPDATE或DELETE操作所影响到的记录数(包含因限制条件而影响到的记录) 因限制条件而影响到的记录数 无

常用:SQLERRD[2] ,如:#define SQLROWS sqlca.sqlerrd[2]

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