状态捕获及错误处理机制


解决问题:宿主程序如何知道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错误的程序>

    ... ...

相关