SQLCA系統記錄架構

 

SQLCA系統記錄架構

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 則保持不變。為了避  
免錯誤,要注意下列兩件事:  
.若要以 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] 值才能知道真正原因。

例如:
1.insert 時,
   IF SQLCA.SQLCODE=0 AND SQLCA.SQLERRD[3]=1 THEN
         ERROR "存檔成功"
   ELSE
         ERROR "存檔失敗" ,'sqlcode=',SQLCA.SQLCODE,'sqlerrd[3]=', SQLCA.SQLERRD[3]
         SLEEP 2
   END IF


2.update 及delete 時,
     IF SQLCA.SQLCODE=0 AND SQLCA.SQLERRD[3]>=1 THEN  
         ERROR "修改或刪除成功"
     ELSE
         ERROR "修改或刪除失敗" ,'sqlcode=',SQLCA.SQLCODE,'sqlerrd[3]=', SQLCA.SQLERRD[3]
         SLEEP 2
     END IF

3.select 時,
     IF SQLCA.SQLCODE=0 AND SQLCA.SQLERRD[3]=1 THEN  
         ERROR "資料取得成功"
     ELSE
         ERROR "資料取得失敗" ,'sqlcode=',SQLCA.SQLCODE,'sqlerrd[3]=', SQLCA.SQLERRD[3]
         SLEEP 2
     END IF


歡迎轉載,但請保留出處,本文章轉自[華軟網] 原文連結:http://www.huarw.com/db/Informix/200610/40330.html

這個網誌中的熱門文章

第三世多杰羌佛說了義經

第三世多杰羌佛辦公室第十四號公告-極聖解脫大手印

頂聖如來多杰羌佛第三世雲高益西諾布簡介