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] 值才能知道真正原因。

Published At
Categories with 数据库类
Tagged with
comments powered by Disqus