SQLCA 结构中的错误位置

在编译或执行 SQL PL 对象期间发生错误时,Db2® 数据库管理器所返回的 SQLCA 结构中包含有助于确定错误来源的信息。

编译时错误

编译(内联型或者编译型)SQL PL 对象期间发生错误时,所返回 SQLCA 结构中的 sqlerrd(3) 字段中包含 Db2 SQL 编译器所报告错误的行号。
在以下示例中,过程 myproc 的第 5 行包含无效的语句。该语句无效的原因是,SET 语句的源部分数据类型与目标部分数据类型不匹配。
create procedure myproc (parm1 integer)
 begin
   declare var1 date;
   set var1 = parm1;
 end @
假定此过程存储在 script1.db2 文件中,试图使用命令行处理器 (CLP) 通过执行以下命令来处理此文件:
db2 -td@ -a -f script1.db2
使用 -a 选项会导致 CLP 显示 SQLCA。结果将类似于以下信息:
SQLCA 信息

 sqlcaid : SQLCA      sqlcabc: 136   sqlcode: -408
 sqlerrml: 4
 sqlerrmc: VAR1
 sqlerrd : (1) 0         (2) 0                (3) 5
           (4) 0         (5) 0                (6) 0
 ...
 sqlstate: 42821
sqlerrd(3) 字段中的值为 5,表示 CREATE PROCEDURE 语句的第 5 行中存在错误。
CLP 用作此示例的客户机接口,因为它提供了一种用于显示执行语句所获得的 SQLCA 结构的简单方法。但是,使用 CLP 来编译 SQL PL 语句时,不需要显示 SQLCA 结构以确定产生错误的行号。CLP 在格式化错误消息时会自动显示行号。对于已创建的过程 (myproc),在不包括 -a 选项的情况下调用 CLP 将返回以下消息,该消息表明第 5 行中存在错误:
SQL0408N 值与其赋值目标的数据类型不兼容。目标名称为“VAR1”。行号 = 5。SQLSTATE=42821

运行时错误

在执行编译型 SQL PL 例程或触发器期间发生错误时,Db2 数据库管理器所返回的 SQLCA 结构中既包含导致该错误的语句的行号,也包含一个用于唯一识别其中包含该语句的 SQL PL 例程或触发器的数字值。
在以下示例中,一个语句将创建具有一个整数列的 table1 表。第二个语句将使用两个整数参数 parm1parm2 来创建 appdev.proc2 过程,此过程会将 parm1 除以 parm2 所获得的值插入表中。具有自变量 1 和 0 的 CALL 语句将产生“除以 0”运行时错误。
create table table1 (col1 integer) @

create procedure appdev.proc2(in parm1 integer, parm2 integer)
specific appdev_proc2
begin
   insert into table1  (parm1 / parm2);
end @

call proc2(1, 0) @
假定这些语句存储在 script2.db2. 文件中,试图使用 CLP 通过执行以下命令来处理此文件:
db2 -td@ -a -f script2.db2
执行该调用之后,CLP 产生的结果将类似于以下输出:
SQLCA 信息

 sqlcaid : SQLCAM    sqlcabc: 136   sqlcode: -801 
 ...
 sqlerrd : (1) 0         (2) 0                (3) 4
           (4) 13152254  (5) 0                (6) 0

 ...
 sqlstate: 22012
结果中的值 sqlcode -801 对应于除以 0 所产生的结果 (SQLSTATE 22012)。与编译时错误相似,sqlerrd(3) 字段中的值指示 SQL PL 对象中产生错误的行号(在本例中为行号 4)。此外,sqlerrd(4) 字段中的值包含一个用于唯一标识该 SQL PL 对象的整数值。可以使用 SYSPROC.GET_ROUTINE_NAME 过程将该唯一标识映射至产生该错误的对象的名称。此过程将 sqlerrd(4) 字段中的值作为输入参数,并通过五个输出参数返回信息,如以下示例所示:
db2 CALL SYSPROC.GET_ROUTINE_NAME(13152254, ?, ?, ?, ?, ?)

  Value of output parameters
  --------------------------
  Parameter Name  : TYPE
  Parameter Value : P

  Parameter Name  : SCHEMA
  Parameter Value : APPDEV

  Parameter Name  : MODULE
  Parameter Value : -

  Parameter Name  : NAME
  Parameter Value : PROC2

  Parameter Name  : SPECIFIC_NAME
  Parameter Value : APPDEV_PROC2

  Return Status = 0
TYPE 参数的值“P”指示该对象是一个过程。因为该对象不属于某个模块,所以 MODULE 参数为 NULL。
注: SQLCA 结构中不包含在执行内联型 SQL PL 对象期间所产生的错误的行号信息。