SQLCA系统记录架构

来源:互联网 发布:管理和领导的区别 知乎 编辑:程序博客网 时间:2024/04/30 23:45
SQLCA系统记录架构 


SQLCA(SQL Communication Access) 系由系统提供之系统记录架构,作为 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 则保持不变。为了避  
免错误,要注意下列两件事:  
&#63153;.若要以 status 判断 I/O 是否成功,在 I/O 后立即判断 status,中间不可插入  
       任何会更改 status 之指令。  
&#63154;.若要以 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;但失败时则有两种情行发生:  
&#63153;. sqlcode = 0,表示没有符合资料可供 update/delete,故 sqlcode= 0  
&#63154;. sqlcode < 0,表示 update/delete 失败,可能资料被 LOCK 住等,必须检查  
       SQLERRD[2] 值才能知道真正原因。
0 0