状态捕获及错误处理机制
解决问题:宿主程序如何知道SQL语句的执行状态,是否发生错误
1. 状态捕获及其处理
(1)状态:嵌入式SQL语句的执行状态,尤指出错状态,有时程序需要知道这些状态并进行处理
(2)嵌入式SQL程序状态捕获的构成
1)设置SQL通信区:一般在嵌入式SQL程序的开始处便设置
exec sql include sqlca;
2)设置状态捕获语句:在嵌入式SQL程序的多处可任意多次设置,但有作用域
exec sql whenever sqlerror got report_error;
3)状态处理语句:某一段程序以应对SQL操作的某种状态
report_error: exec sql rollback; 也可以是一个函数
2.sqlca
(1)SQLCA是一个已经被声明过的具C语言的结构形式的内存信息区,其中的成员变量用来记录SQL语句执行的状态,便于宿主程序读取和处理
(2)SQLCA是DBMS(执行SQL语句)与宿主程序之间交流的桥梁之一
3.状态捕获语句
(1)exec sql whenever condition action; //满足条件condition,执行动作action
(2)作用范围:该条语句会对后面的所有 EXEC SQL 语句所引起的对数据库系统的调用自动检查他是否满足条件condition,直到程序中出现另一条相同条件的whenever语句为止,后面的将覆盖前面的
(3)几种状态条件
1)SQlERROR:检测是否有SQL语句出错,其具体意义依赖于特定的dbms
2)NOT FOUND:执行某一语句后,没有结果记录出现
3)SQLWARNING:不是错误,一种警告
(4)几种动作
1)CONTINUE:忽略错误,继续执行
2)GOTO 标记:转移到标号所指示的语句,去进行相应的处理
3)STOP:终止程序运行,撤销当前工作,断开与数据库的连接
4)DO函数或CALL函数:调用宿主程序的函数进行处理,函数返回后从引发该 condition 的exec sql 语句之后的语句继续执行
//总共有十二种组合方式
(5)状态捕获语句容易导致无限循环,在“ goto 标记:”指示语句的第一行加入:exec sql whenever sqlerror continue;
4.状态信息
(1)典型DBMS系统记录状态信息的三种方法
1)sqlcode:典型DBMS都提供一个sqlcode变量来记录其执行sql语句的状态,但不同的DBMS定义的sql值所代表的状态意义可能是不同的,需要查阅对应DBMS手册和资料来确定其含义
2)sqlca.sqlcode:支持sqlca 的产品一般要在sqlca中填写sqlcode来记录上述信息;除此之外,sqlca还有其他状态信息的记录
3)sqlstate:有些DBMS提供的记录状态信息的变量是sqlstate 或 sqlca.sqlstate
(2)隐式状态处理:不需要知道错误类型,用错误捕获语句处理即可,无需关心状态记录变量
(3)显示状态处理:不仅要知道不同的状态信息,还要知道正确的操作方法
5.显示状态处理示例
exec sql begin declare section;
char sqlstate[6];
exec sql end declare section;
exec sql whenever sqlerror goto handle_error;
... ...
exec sql whenever sqlerror continue; //当发生错误时,程序继续执行,使得 if 语句不受上面语句的影响
exec sql create table custs
(cid char(4) not null, cname varchar(13), ... ...);
if(strcmp(sqlstate, "82100") == 0)
<处理82100错误的程序>
... ...