SQLCA系统记录架构

发表于:2007-06-22来源:作者:点击数: 标签:
SQLCA系统记录架构 SQLCA(SQLCommunicationAccess)系由系统提供之系统记录架构,作为backend 与frontend之间沟通之用,当发生I/O状态时,系统会记录该状态于SQLCA中 ,frontend即可依据其其内容得知I/O运作是否成功,再决定往后执行的步骤。 SQLCA为系

   
SQLCA系统记录架构

SQLCA(SQL Communication Aclearcase/" target="_blank" >ccess) 系由系统提供之系统记录架构,作为 back end 

与 front end 之间沟通之用,当发生 I/O 状态时,系统会记录该状态于SQLCA 中 
,front end 即可依据其其内容得知 I/O 运作是否成功,再决定往后执行的步骤。 
SQLCA 为系统定义之 GLOBAL 变量,以下为其架构并介绍其内容与用途: 
DEFINE SQLCA RECORD 
          SQLCODE    INTEGER, 
          SQLERRM    CHAR(71), 
          SQLERRP    CHAR(8), 
          SQLERRD    ARRAY[6] OF INTEGER, 
          SQLAWARN   CHAR(8) 
END RECORD 
.SQLCODE :表示 I/O 的结果 
 0   表示 I/O 成功 
 100 表示 NOTFOUND 
 < 0 表示 I/O 失败 
.SQLERRM :保留未用 
.SQLERRP :保留未用 
.SQLERRD :为一个含有6个 INTEGER 之数组 
 SQLERRD[1]:保留未用 
 SQLERRD[2]:新增时 SERIAL 字段所传回之值 
 SQLERRD[3]:处理资料的笔数 
 SQLERRD[4]:查询时预估的 CPU COST 
 SQLERRD[5]:SQL指令之错误位移 
 SQLERRD[6]:最后一个 ROWID 值 
.SQLAWARN :为一个含有8个字符的字符串,以记录I/O时产生的警告讯息。若 
            正确无误,则相对应之字符设定为空白,否则会被设定为"W"。 
   SQLAWARN[1]:若第2至第8字符中任意一个被设成"W",则此字符亦为 
                "W",否则为空白。 
   SQLAWARN[2]:若资料太长而被截掉时,会被设成 "W"。 
   SQLAWARN[3]:若 aggregate function(如 SUM,AVG,MAX,MIN) 处理时 
                遇到 NULL 值,则会被设成"W"。 
   SQLAWARN[4]:若查询时,若欲查询的字段数目和 INTO 之变量数目不合 
                时,会被设成 "W"。 
   SQLAWARN[5]:如转换 float 成 integer 时,则会被设成 "W"。 
   SQLAWARN[6]:保留未用 
   SQLAWARN[7]:保留未用 
   SQLAWARN[8]:保留未用 
14-2 SQLCA.SQLCODE 是否等于 STATUS ? 
因 sqlca.sqlcode 系用以沟通 front end 和 back end ,因此只有 I/O 发生时才会更 
改 sqlca ,同时 status 也被设定等于 sqlca.sqlcode 值。但若只是纯粹 front end 的 
动作(如 display),则只有 status 会被设定,而sqlca.sqlcode 则保持不变。为了避 
免错误,要注意下列两件事: 
.若要以 status 判断 I/O 是否成功,在 I/O 后立即判断 status,中间不可插入 
       任何会更改 status 之指令。 
.若要以 sqlca.sqlcode 判断 I/O 是否成功,在 I/O 后除非有新的 I/O 发生,不 
       然允许先执行其它 frint end 之指令,以后再予以判断。 

CREATE DATABASE dbtest 
CREATE TABLE tab ( 
                   col1      serial(1000), 
                   col2      char(3), 
                   col3      smallint) 
假设 TABLE tab 已有3笔资料: 
      col1     col2     col3       (rowid)隐含字段 
      1000     AAA      (null)         1 
      1001     BBB      1000           2 
      1002     CCC      2000           3 
DATABASE dbtest 
MAIN 
   DEFINE io_tab RECORD 
          col1   like  tab.col1, 
          col2   like  tab.col2, 
          col3   like  tab.col3, 
          col4         integer   
   END RECORD 
   DEFINE total_col3   integer 
   DEFINE work_col2    char(2) 
   WHENEVER ERROR CONTINUE 

§例: 
  SELECT * 
     FROM tab 
    WHERE col2 = "BBB" 
   DISPLAY sqlca.sqlcode,sqlca.sqlerrd[6] 
结果:           0               3 

§例: 
   SELECT * 
     FROM tab 
    WHERE col2 = "DDD" 
   DISPLAY sqlca.sqlcode 
结果:          100 

§例: 
   SELECT SUM(col3) 
     INTO total_col3 
     FROM tab 
   DISPLAY total_col3,sqlca.sqlawarn   
结果:          300     W W 

因内含一个 null 值,所以第1,3位设定为 W 

§例: 
   SELECT * 
     INTO io_tab.* 
     FROM tab 
    WHERE col2 = "BBB" 
   DISPLAY sqlca.sqlcode,sqlca.sqlerrd[3],sqlca.sqlawarn   
结果:          0                1           W  W 
select variable_list 数目只有3个,但 io_tab 有4个,所以第1,4位设定为 W 

§例: 
   SELECT col2 
     INTO work_col2 
     FROM tab 
    WHERE col2 = "AAA" 
   DISPLAY sqlca.sqlcode,sqlca.sqlerrd[3],sqlca.sqlawarn   
结果:          0                1           WW 
因第3个字符被截掉,所以第1,2位设定为 W 

§例: 
   UPDATE tab 
      SET col3 = 1000 
   DISPLAY sqlca.sqlerrd[3] 
结果:          3 
因总共更正3笔资料 

§例: 
   INSERT INTO tab valueS(0,"DDD",3000) 
   DISPLAY sqlca.errd[2] 
结果:          103 
因总共更正3笔资料 

§例: 
   SELECT * 
     FROM tab 
    WHERE col1 = 999 
   DISPLAY status,sqlca.sqlcode 
结果:        100        100 

§例: 
   SELECT * 
     FROM tab 
    WHERE col1 = 999 
   DISPLAY "STATUS will be update !!" 
   DISPLAY status,sqlca.sqlcode 

结果:STATUS will be update !! 
               0        100 
此时 status 不再等于 sqlcode 

14-2 如何判断 I/O 是否成功 
┌──────┬───────┬────────┬────────┬─────┐ 
│            │    INSERT    │     UPDATE     │     DELETE     │  SELECT  │ 
├──────┼───────┼────────┼────────┼─────┤ 
│            │  成功  失败  │   成功  失败   │   成功  失败   │ 成功 失败│ 
├──────┼───────┼────────┼────────┼─────┤ 
│SQLCODE     │    0    <0   │    0     0,<0 │    0      <0   │   0   100│ 
├──────┼───────┼────────┼────────┼─────┤ 
│SQLERRD[3]  │    1     0   │   ≧1     0    │   ≧1      0   │   1    0 │ 
└──────┴───────┴────────┴────────┴─────┘ 

在 update 和 delete 时,若符合条件之资料可能不只一笔,因此执行后sqlerrd[3] 
值会 ≧1;但失败时则有两种情行发生: 
. sqlcode = 0,表示没有符合资料可供 update/delete,故 sqlcode= 0 
. sqlcode < 0,表示 update/delete 失败,可能资料被 LOCK 住等,必须检查 
       SQLERRD[2] 值才能知道真正原因。

原文转自:http://www.ltesting.net