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: 42821sqlerrd(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 表。第二个语句将使用两个整数参数 parm1 和 parm2 来创建 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 = 0TYPE 参数的值“P”指示该对象是一个过程。因为该对象不属于某个模块,所以 MODULE 参数为 NULL。注: SQLCA 结构中不包含在执行内联型 SQL PL 对象期间所产生的错误的行号信息。