调试 SQL 例程
通过在 CREATE PROCEDURE , CREATE FUNCTION 或 CREATE TRIGGER 语句中指定 SET OPTION DBGVIEW = *SOURCE ,可以在 SQL 语句级别调试生成的程序或模块。
还可以指定 DBGVIEW (*SOURCE) 作为 RUNSQLSTM 命令的参数,它将应用于 RUNSQLSTM 中的所有例程。
源视图将由系统从原始例程主体创建到例程库中的源文件 QSQDSRC 中。 如果无法确定库,那么将在 QTEMP 中创建 QSQDSRC。 如果特定名称是有效的系统名称,那么它将用作 QSQDSRC 文件中成员的名称。 如果特定名称不是有效的系统名称,那么将使用生成系统表名称的规则来生成唯一名称。 如果 QSQDSRC 文件已有具有该名称的成员,那么无论该成员所表示的例程如何,该成员都将被覆盖。 源视图未与程序或服务程序一起保存。 源将分为与您可以在调试中停止的位置相对应的行。 文本 (包括参数和变量名称) 将转换为大写。 定界名称和字符文字不会转换为大写。
您可以使用 SQL 对象处理器根视图单步调试 SQL 例程。 每个步骤指令都会将您转至下一个 SQL 语句,而不是下一个底层生成的 C 语句。 这使得遵循例程逻辑的流程变得很容易。
可以使用 "SQL 对象处理器根" 视图或 ILE C 列表视图来调试 SQL 例程。 调试器可用于对生成的程序或服务程序中的 SQL 变量和 C 变量进行求值。 首选方法是使用 "SQL 对象处理器根" 视图进行调试,但可以根据需要使用 ILE C 列表视图来获取其他执行信息。
SQL 对象处理器根视图
此视图使用 QSQDSRC 中的例程源。 要对 SQL 变量进行求值,请将前缀 '%%' 添加到变量名称以指示表示 SQL 变量的名称。 在调试器命令中引用任何 SQL 变量时,必须以 '%%' 作为前缀。 SQL 变量名不区分大小写。 可以同时引用未定界标识和定界标识。 指定 SQL 变量名称时,调试器将确定哪个 C 变量表示 SQL 变量,然后显示相应 C 变量的名称和内容。 引用具有指示符的 SQL 参数或变量时,如果将该指示符设置为指示空值,那么调试器将返回 "NULL"。
除非存在模糊性,否则不需要限定变量名。 在这种情况下,变量应该由其包含的复合 SQL 块的标签限定,以避免模糊性。 在 "SQL 对象处理器" 视图中进行调试时,可以引用 C 变量。 不带前缀 "%%' i" 的变量名被视为 C 变量。
ILE C 列表视图
此视图将生成的 C 源用于 SQL 例程。
所有变量和参数都作为结构的一部分生成。 在对调试中的变量进行求值时,必须使用结构名称。 变量由当前标签名称限定。 参数由过程或函数名限定。 触发器中的转换变量由相应的关联名称限定。 强烈建议您为每个复合语句或 FOR 语句指定标签名称。 如果未指定一个,那么系统将为您生成一个。 这将使评估变量几乎不可能。 请记住,所有变量和参数都必须求值为大写名称。 您还可以评估结构的名称。 这将显示结构中的所有变量。 如果变量或参数可空,那么该变量或参数的指示符在结构中紧跟在该变量或参数之后。
因为 SQL 例程是在 C 中生成的,所以对于 C 存在一些影响 SQL 源调试的规则。 不能在 C 中指定 SQL 例程主体中指定的定界名称。 将为这些名称生成名称,这再次使调试或评估这些名称变得困难。 为了评估任何字符变量的内容,请在该变量的名称之前指定 *。
由于系统会为大多数变量和参数名称生成指示符,因此无法直接检查变量是否具有 SQL 空值。 对变量求值将始终显示一个值,即使指示符设置为指示空值也是如此。
在 ILE C 视图中进行调试时,不能直接引用 SQL 变量 (使用 "%%" 前缀)。
为了确定是否正在调用处理程序,请在处理程序中的第一个语句上设置断点。 可以对在处理程序中的复合语句或 FOR 语句中声明的变量进行求值。
SQL 数组调试
SQL 数组数据类型 (仅在 SQL 过程和 SQL 函数中受支持) 具有特殊调试规则,因为数组变量在生成的 C 程序中没有永久存储器。 与 C 数组不同, SQL 数组基于 1。 要显示数组的第五个元素,请在 EVAL 命令 (EVAL TSTARR.ABC[5])。 不支持在不指定数组下标的情况下指定数组变量名; 这将导致 "找不到变量" 错误。 要查看数组中的值范围,可以使用具有数组下标范围的 EVAL 命令。 例如,要查看数组中的前 25 个元素,请参阅 EVAL TSTARR.ABC[1 .. 25]。 EVAL 命令将指示数组变量何时具有 NULL 值。 包含对数组变量 NULL 求值为 NULL 的引用的表达式。 可以在表达式中使用数字数组类型; 不能使用其他类型。 非前缀字符串类型将显示为字符串,而不是指针。
并非所有调试命令都支持 SQL 数组类型。它们不能用于赋值的左侧(EVAL TSTARR.ABC[5] = 3)。 They cannot be used as the target of the '&' address operator (EVAL &TSTARR.ABC[3]). 数组也不能与 WATCH 调试命令一起使用。 EVAL %LOCALVARS 命令不会显示数组变量,因为它们不在调试符号表中。