GET DIAGNOSTICS 语句
GET DIAGNOSTICS语句提供有关最近执行的SQL语句(GET DIAGNOSTICS语句除外)的诊断信息。 在执行前一个SQL语句时,会收集这些诊断信息。 在 SQLCA 中也提供了通过 GET DIAGNOSTICS 语句获得的某些信息。
调用 GET DIAGNOSTICS
此语句只能嵌入在应用程序中。 这是一个无法动态准备的可执行语句。
授权 GET DIAGNOSTICS
不需要执行任何操作。
语法 GET DIAGNOSTICS
声明信息:
条件信息:
综合信息:
描述 GET DIAGNOSTICS
诊断信息主要分为三个部分:报表信息、状态信息和综合信息。 在执行 SQL 语句后,语句执行的相关信息作为语句信息提供,至少提供一个条件信息实例。 条件信息的数量由语句信息中的NUMBER项指示。 组合信息包含SQL语句执行过程中收集的所有信息的文本表示。
所提供的诊断信息仅适用于该服务器。 如果您连接的服务器不是 Db2 for z/OS® ,请参阅该产品文档,了解返回的诊断信息。
- 当前
- 指定从第一个诊断区域返回信息。 它与之前执行的SQL语句相对应,该语句不是GET DIAGNOSTICS或复合语句。 默认值为当前。
- STACKED
- 指定从堆叠诊断区返回信息。
堆叠诊断区域仅在本地SQL程序、编译的SQL函数和触发器中的处理程序中可用。
堆叠诊断区域对应于在处理程序输入之前执行的上一SQL语句(不是GET DIAGNOSTICS或复合语句)。 如果GET DIAGNOSTICS语句是处理程序中的第一个语句,则当前诊断区域和堆叠诊断区域包含相同的诊断信息。 - statement-information
- 提供有关最近执行的SQL语句的信息。
- variable1
- 根据变量声明规则,标识程序中描述的变量。 变量的数据类型必须与“获取诊断数据”项的数据类型一致。
变量被赋值为指定语句信息项的值。 如果将数值赋值给变量时发生截断,系统会发出警告,诊断区域的GET_DIAGNOSTICS_DIAGNOSTICS项也会更新,显示该情况的详细信息。 如果未设置诊断项目,则变量将根据其数据类型设置为默认值:对于精确数字字段,设置为0;对于VARCHAR字段,设置为空字符串;对于CHAR字段,设置为空白。
- DB2_GET_DIAGNOSTICS_DIAGNOSTICS
- 包含有关在执行GET DIAGNOSTICS语句时可能发生的错误或警告的文本信息。 信息格式与GET DIAGNOSTICS :hv = ALL语句返回的信息格式类似。
- DB2_SQL_NESTING_LEVEL
- 标识执行 GET DIAGNOSTICS 语句时嵌套或递归的当前级别。 嵌套的每个级别对应于对已编译的SQL函数、本机SQL过程或触发器的嵌套或递归调用。 如果GET DIAGNOSTICS语句在嵌套级别之外执行,则返回值为零。
- 语句-信息-项-名称:
- DB2_LAST_ROW
- 对于多行FETCH语句,如果当前表中的最后一行在已获取的行集中,则包含+100的值。 对于对更新不敏感的游标,没有必要进行后续的FETCH操作,因为结果将是数据结束指示。 对于对更新敏感的游标,如果在执行FETCH之前插入了一行,则后续FETCH可能会返回更多数据。 对于多行FETCH语句以外的其他语句,或者对于不包含最后一行数据的多行FETCH语句,此变量包含值0。
当返回的行数与请求的行数相等且返回数据的最后一行是数据的最后一行时,数据警告可能不会发生,且 DB2_LAST_ROW 可能不包含+100。
- DB2_NUMBER_PARAMETER_MARKERS
- 对于预编译语句,包含预编译语句中的参数标记数量。 否则,或者如果服务器只返回一个SQLCA,则返回值为零。
- DB2_NUMBER_RESULT_SETS
- 对于CALL语句,包含过程返回的实际结果集数量。 否则,或者如果服务器只返回一个SQLCA,则返回值为零。
- DB2_NUMBER_ROWS
- 如果之前的SQL语句是OPEN或FETCH,导致结果表的大小已知,则返回结果表中的行数。 对于敏感动态游标,该值可视为近似值,因为插入和删除的行会影响下次对该值的检索。 如果之前的SQL语句是PREPARE语句,则返回预处理语句结果表中的估计行数。 否则,或者如果服务器只返回一个SQLCA,则返回值为零。
- DB2_RETURN_STATUS
- 标识与之前执行的SQL语句关联的存储过程返回的状态值,前提是该语句是调用返回状态的存储过程的CALL语句。 否则,或者如果服务器只返回一个SQLCA,则返回值为零。
- DB2_SQL_ATTR_CURSOR_HOLD
- 对于ALLOCATE或OPEN语句,指示光标是否可以在多个工作单元中保持打开状态。
- N表示此光标不会在多个工作单元中保持打开状态。
- Y表示光标在多个工作单元中保持打开状态。
- DB2_SQL_ATTR_CURSOR_ROWSET
- 对于ALLOCATE或OPEN语句,指示是否可以通过行集定位访问光标。
- N 表示此光标仅支持行定位操作。
- Y 表示此光标支持行集定位操作。
- DB2_SQL_ATTR_CURSOR_SCROLLABLE
- 对于ALLOCATE或OPEN语句,指示光标是否可以前后滚动。
- N 表示此光标不可滚动。
- Y表示此光标可滚动。
- DB2_SQL_ATTR_CURSOR_SENSITIVITY
- 对于ALLOCATE或OPEN语句,指示光标是否显示其他连接对光标行所做的更新。
- I表示不敏感。
- S表示敏感。
- DB2_SQL_ATTR_CURSOR_TYPE
- 对于ALLOCATE或OPEN语句,指示光标的类型,光标类型是仅向前、静态还是动态。
- F表示向前移动光标。
- D表示动态光标。
- S表示静态光标。
- 更多
- 指示是否存储或丢弃了前一条 SQL 语句中的某些警告和错误。
- N表示前一个SQL语句的所有警告和错误都存储在诊断区域中。
- Y表示由于记录警告和错误所需的存储量超过65535字节,因此先前SQL语句中的部分警告和错误被丢弃。
- NUMBER
- 返回执行前一条 SQL 语句(GET DIAGNOSTICS 语句除外)时在诊断区域中存储的错误和警告的数量。 如果之前的SQL语句返回的SQLSTATE为00000,或者之前没有执行过SQL语句,则返回的值为1。
GET DIAGNOSTICS语句本身可以通过SQLSTATE参数返回信息,但不会修改诊断区域中除 DB2_GET_DIAGNOSTICS_DIAGNOSTICS 项以外的前面内容。
- ROW_COUNT
- 标识与之前执行的SQL语句相关的行数。
如果之前的SQL语句是DELETE、INSERT、UPDATE或MERGE语句,则ROW_COUNT表示该语句可以删除、插入或更新的行数,不包括受触发器或参照完整性约束影响的行。 该计数不包括在SQL数据更改语句中处理FOR PORTION OF子句时插入的行。
对于带有数据更改语句的 SELECT 或 SELECT INTO 语句,SQLERRD(3) 包含受嵌入的数据更改语句影响的行数。 如果SQL语句失败,则值为0,表示在执行语句时所做的所有更改都被取消。
-1 值表示从分段表空间中的表中进行了批量删除,且DELETE语句未包含选择条件,或表示截断操作。 如果删除操作与视图相悖,则DELETE语句和视图的定义都不包含选择标准。
对于REFRESH TABLE语句,SQLERRD(3)包含插入到物化查询表中的行数。
如果之前的SQL语句是多行FETCH,则ROW_COUNT标识提取的行数。
否则,或者如果服务器只返回一个SQLCA,则返回值为零。
- condition-information
- 将指定条件信息的值赋给关联变量。 指定的变量必须与指定的诊断ID的数据类型兼容,否则会发生错误。 如果赋值时条件值被截断,则会发生错误。 如果提供了指示变量,则指示变量中会返回该值的长度。
如果未设置诊断项目,则根据项目的数据类型将变量设置为默认值。 数值字段的特定值为0,VARCHAR字段的特定值为空字符串,CHAR字段的特定值为空。
- variable2 或整数
- 根据变量声明规则,标识程序中描述的变量。 该值标识需要哪些诊断信息。 在执行SQL语句时进行的每次诊断都会分配一个整数。 数值1表示第一次诊断,2表示第二次诊断,以此类推。 如果值为1,则检索到的诊断信息与执行前一条SQL语句(GET DIAGNOSTICS语句除外)实际返回的SQLSTATE值所指示的条件相对应。 指定的变量必须是整数数据类型,否则将出现错误。 当这是一个宿主变量时,不允许使用指示变量;否则会发生错误。 如果指定的值小于或等于零,或大于可用诊断的数量,则会发生错误。
- variable3
- 根据变量声明规则,标识程序中描述的变量。 变量的数据类型必须是指示的条件信息项的“获取诊断项的数据类型” 中指定的数据类型。
- 条件信息项名称
- 目录名
- 如果返回的SQLSTATE是以下任意一个值,则导致错误的约束是参照约束、检查约束或唯一约束。 返回生成条件的(RDB)服务器名称。
- 09级(触发动作异常),
- 23级(违反完整性约束)
- 第27类(触发数据变更违规)
- 40002(交易回滚——完整性约束违反)
- 40004(交易回滚——触发操作异常)
如果返回的SQLSTATE为42类(语法错误或访问规则冲突),则返回导致错误的数据表的服务器名称。
如果返回的SQLSTATE为44类(WITH CHECK OPTION Violation),则返回导致错误的视图的服务器名称。
否则,将返回空字符串。
由于使用了别名或同义词,实际的服务器名称可能与CONNECT语句中隐式或显式指定的服务器名称不同。
- 条件编号
- 返回诊断编号。
- CURSOR_NAME
- 如果返回的SQLSTATE为24类(无效游标状态),则返回游标的名称。 否则,将返回空字符串。
- DB2_ERROR_CODE1
- 返回一个内部错误代码。 否则,或者如果服务器只返回一个SQLCA,则返回值0。
- DB2_ERROR_CODE2
- 返回一个内部错误代码。 否则,或者如果服务器只返回一个SQLCA,则返回值0。
- DB2_ERROR_CODE3
- 返回一个内部错误代码。 否则,或者如果服务器只返回一个SQLCA,则返回值0。
- DB2_ERROR_CODE4
- 返回一个内部错误代码。 否则,或者如果服务器只返回一个SQLCA,则返回值0。
- DB2_INTERNAL_ERROR_POINTER
- 对于某些错误,这是一个负值,表示内部错误指针。 否则,返回值为0。
- DB2_LINE_NUMBER
- 返回解析动态语句时出错的那一行。
还返回在解析、绑定或执行本机SQL过程、已编译的SQL函数或触发器的CREATE或ALTER语句时出错的位置编号。
DB2_LINE_NUMBER 当CALL语句调用本机SQL程序,而程序返回错误时,也会返回行号。 外部SQL程序不会返回此信息。只有当语句源包含新的行控制字符时,该值才有意义。
- DB2_MESSAGE_ID
- 对应于MESSAGE_TEXT诊断项目中的信息(例如, DSNT102I 或 DSNU180I )。
- DB2_MODULE_DETECTING_ERROR
- 返回一个标识符,指示哪个模块检测到了错误。 对于从常规中发出的信号声明,将返回值“常规”。 否则,将返回字符串“DSN ”。
- DB2_ORDINAL_TOKEN_n
- 返回第n个标记。 n 必须为1-100之间的数值。 例如, DB2_ORDINAL_TOKEN_1 将返回第一个标记的值, DB2_ORDINAL_TOKEN_2 将返回第二个标记的值,以此类推。 令牌的数值在返回之前会转换为字符。 如果令牌没有价值,或者服务器只返回一个SQLCA,则返回一个空字符串。
- DB2_REASON_CODE
- 包含消息文本中带有原因代码标记的错误的原因代码。 否则,返回值为零。
- DB2_RETURNED_SQLCODE
- 返回指定诊断的SQLCODE。
- DB2_ROW_NUMBER
- 对于涉及多行的语句,当条件可用且适用时,返回满足条件的行号。 如果返回SQLCODE +1或+20237,则 DB2_ROW_NUMBER 返回0。
- DB2_SQLERRD_SET
- Y值表示可能需要设置 DB2_SQLERRD1 至 DB2_SQLERRD 的项目。 这些项目仅在与服务器的通信中设置,服务器返回SQLCA SQL通信区域,而不是新的诊断区域。 否则,将返回空值。
- DB2_SQLERRD1
- 从服务器返回的SQLCA中返回sqlerrd(1)的值。 否则,返回值为零。
- DB2_SQLERRD2
- 返回服务器返回的SQLCA中的sqlerrd(2)值。 否则,返回值为零。
- DB2_SQLERRD3
- 从服务器返回的SQLCA中返回sqlerrd(3)的值。 否则,返回值为零。
- DB2_SQLERRD4
- 从服务器返回的SQLCA中返回sqlerrd(4)的值。 否则,返回值为零。
- DB2_SQLERRD5
- 返回服务器返回的SQLCA中的sqlerrd(5)的值。 否则,返回值为零。
- DB2_SQLERRD6
- 返回服务器返回的SQLCA中的sqlerrd(6)值。 否则,返回值为零。
- DB2_TOKEN_COUNT
- 返回指定诊断ID的可用标记数。
- MESSAGE_TEXT
- 返回与SQLCODE关联的消息文本。 这是简短文本,包括替换的标记。 消息文本不包含消息编号。 当SQLCODE为0时,即使RETURNED_SQLSTATE值指示警告条件,也会返回空字符串。
- 返回的 SQL 状态
- 返回指定诊断的SQLSTATE。
- SERVER_NAME
- 如果之前的SQL语句是CONNECT、DISCONNECT或SET CONNECTION语句,则返回之前语句中指定的服务器名称。 否则,将返回执行语句的服务器的名称。
- 连接信息项名称
- 如果最后执行的SQL语句是CONNECT语句,则提供有关该语句的信息。
- DB2_AUTHENTICATION_TYPE
- 包含认证类型值:
- “S”代表服务器验证
- “C”代表客户认证
- “T”代表可信服务器认证
- 否则,或者如果服务器只返回一个SQLCA,则返回一个空值
- DB2_AUTHORIZATION_ID
- 连接的服务器使用的授权ID。 由于用户ID的翻译和授权存在差异,本地用户ID可能不是服务器使用的授权ID。
- DB2_CONNECTION_STATE
- 包含连接状态:
- -1 如果连接未连接
- 1 如果连接成功
- DB2_CONNECTION_STATUS
- 包含价值:
- 1 如果可承诺的更新可以在该工作单元的连接上执行
- 2 如果无法对当前工作单元的连接进行可承诺的更新
- DB2_SERVER_CLASS_NAME
- 对于CONNECT或SET CONNECTION语句,包含以下值之一:
- QAS 用于 Db2 for i
- QDB2 为了 Db2 for z/OS
- QDB2/2 发送至 发送至 Db2 OS/2
- QDB2/6000 发送至 发送至 Db2 AIX®
- QDB2/6000 PE 代表 代表 平行版 Db2 AIX
- QDB2/AIX64 发送至 发送至 64位 Db2 AIX
- QDB2/HPUX 发送至 发送至 Db2 HP-UX
- QDB2/HP64 发送至 发送至 64位 Db2 HP-UX
- QDB2/LINUX 为了 Db2 for Linux®, UNIX, and Windows
- QDB2/LINUX390 为了 Db2 for Linux, UNIX, and Windows
- QDB2/LINUXIA64 为了 Db2 for Linux, UNIX, and Windows
- QDB2/LINUXPPC 为了 Db2 for Linux, UNIX, and Windows
- QDB2/LINUXPPC64 为了 Db2 for Linux, UNIX, and Windows
- QDB2/LINUXZ64 为了 Db2 for Linux, UNIX, and Windows
- QDB2/NT 为了 Db2 for Linux, UNIX, and Windows
- QDB2/NT64 为了 Db2 for Linux, UNIX, and Windows
- QDB2/PTX Db2 用于 NUMA-Q®
- QDB2/SCO 致 ,致新加坡华乐团 Db2 UnixWare
- QDB2/SGI 致 ,致Silicon Graphics Db2
- QDB2/SNI Db2 西门子尼克斯多夫
- QDB2/SUN 发送至 发送至 SUN Solaris Db2
- QDB2/SUN64 Db2 适用于SUN Solaris 64位
- QDB2/Windows 95分 Db2 for Linux, UNIX, and Windows
- QSQDS/VM用于 Db2 server for VSE and VM
- QSQDS/VSE用于 Db2 server for VSE and VM
- DB2_ENCRYPTION_TYPE
- 连接的加密级别:
- A 仅表示认证令牌(authid和密码)已加密。
- D 表示所有数据都已加密。
- 否则,将返回空值。
- DB2_PRODUCT_ID
- 返回产品签名。 如果应用程序服务器是 IBM® 关系数据库产品,则表单为 pppvvrrm。
- 综合信息
- 提供SQL语句执行过程中收集的所有信息的文本表示。
- 全部
- 表示将所有为最后执行的 SQL 语句设置的诊断项合并为一个字符串。 字符串的格式为以分号分隔的可用诊断信息列表,格式为: 项目名 [(条件编号 )]=转换为字符的值……; 以下示例中所示的字符串:
NUMBER=1;RETURNED_SQLSTATE=02000;DB2_RETURNED_SQLCODE=+100; - variable4
- 根据变量声明规则,标识程序中描述的变量。 变量的数据类型必须是VARCHAR。 如果 variable4 的长度不足以容纳完整的返回诊断字符串,则该字符串将被截断,并返回警告,诊断区域的GET_DIAGNOSTICS_DIAGNOSTICS项将更新为该情况的详细信息。
- STATEMENT
- 表示应将所有为最后执行的 SQL 语句设置的语句-信息-项-名称诊断项合并为一个字符串。 格式与ALL选项的描述相同。
- 条件
- 表示应将所有为上次执行的 SQL 语句设置的诊断项目信息项名称合并为一个字符串。 如果 variable5 在条件后面提供或整数,格式与上述所有选项的格式相同。 如果 variable5 或整数,则格式会在该条件信息开头包含一个条件编号条目,格式如下:
CONDITION_NUMBER=x;item -name=value-converted-to-character;... 其中x 是条件编号,如下例所示:
CONDITION_NUMBER=1;RETURNED_SQLSTATE=02000;RETURNED_SQLCODE=100; CONDITION_NUMBER=2;RETURNED_SQLSTATE=01004; - CONNECTION
- 表示应将所有为最后执行的 SQL 语句设置的连接信息项名称诊断项合并为一个字符串。 如果 variable5 在 CONNECTION 后提供或整数,格式与 ALL 选项相同。 如果 variable5 或整数,则格式会在该条件信息开头包含一个条件编号条目,格式如下:
连接号 =x;项目名 =转换为字符的值;…… 其中x 是连接的编号,如下例所示:
CONNECTION_NUMBER=1;CONNECTION_NAME=SVL1;DB2_PRODUCT_ID=DSN12015; - variable5 或整数
- 根据变量声明规则,标识程序中描述的变量。 该值标识需要ALL CONDITION或ALL CONNECTION信息的诊断。 指定的变量必须是整数数据类型,否则将出现错误。 当这是一个宿主变量时,不允许使用指示变量;否则会发生错误。 如果指定的值小于或等于零或大于可用诊断的数量,则会发生错误。
备注 GET DIAGNOSTICS
在本地 SQL 例程或触发器中执行语句的效果:
成功的GET DIAGNOSTICS语句不会更改诊断区域的内容,但 DB2_GET_DIAGNOSTICS_DIAGNOSTICS 除外。
如果您想了解有关错误的信息,GET DIAGNOSTICS语句必须是处理程序中指定的第一个可执行语句,用于处理错误情况。
如果您需要有关警告的信息,并且处理程序将控制警告条件,则 GET DIAGNOSTICS 语句必须是该处理程序中指定的第一个可执行语句。
如果您想了解警告信息,而处理程序无法控制警告条件,则必须将GET DIAGNOSTICS语句作为前一条语句的后续语句。
- SQLSTATE和SQLCODE SQL变量的注意事项
成功的GET DIAGNOSTICS语句不会改变SQLSTATE和SQLCODE SQL变量的值(如SQL函数和SQL程序中使用的)。
- 获取诊断项目的数据类型:
- 当诊断项目被分配给变量、SQL变量或SQL参数时,目标数据类型必须与请求的诊断项目的数据类型兼容。 下表总结了GET DIAGNOSTICS项目的数据类型。
获取诊断项目 数据类型 描述 DB2_GET_DIAGNOSTICS_DIAGNOSTICS VARCHAR(32672) 在GET DIAGNOSTICS语句之后,如果出现任何错误或警告,所有诊断信息将以单个字符串的形式显示 DB2_LAST_ROW INTEGER 在多行FETCH语句之后,如果表中的最后一行在返回的行集中,则值为+100 DB2_NUMBER_PARAMETER_MARKERS INTEGER 在PREPARE语句之后,准备好的语句中的参数标记数量 DB2_NUMBER_RESULT_SETS INTEGER 在调用存储过程的CALL语句之后,存储过程返回的结果集的数量 DB2_NUMBER_ROWS DECIMAL(31,0) 在已知结果表大小的OPEN或FETCH语句之后,结果表中的行数
在PREPARE语句之后,为该预处理语句的结果表中的预计行数
对于“灵敏动态”游标,近似行数
否则,或者如果服务器只返回一个SQLCA,则返回值为零
DB2_RETURN_STATUS INTEGER 在调用SQL过程的CALL语句之后,如果过程包含RETURN语句,则返回状态 DB2_SQL_ATTR_CURSOR_HOLD CHAR(1) 在ALLOCATE或OPEN语句之后,光标是否可以在多个工作单元中保持打开状态(Y或N) DB2_SQL_ATTR_CURSOR_ROWSET CHAR(1) 在ALLOCATE或OPEN语句之后,光标是否可以使用行集定位(Y或N) DB2_SQL_ATTR_CURSOR_SCROLLABLE CHAR(1) 在ALLOCATE或OPEN语句之后,光标是否可滚动(Y或N) DB2_SQL_ATTR_CURSOR_SENSITIVITY CHAR(1) 在ALLOCATE或OPEN语句之后,光标是否显示其他进程(灵敏度I或S)所做的更新 DB2_SQL_ATTR_CURSOR_TYPE CHAR(1) 在ALLOCATE或OPEN语句之后,光标是向前(F)、静态(S,表示INSENSITIVE或SENSITIVE STATIC)还是动态(D,表示SENSITIVE DYNAMIC)。 更多 CHAR(1) 在任何SQL语句之后,该项目指示是否因为存储空间不足而丢弃了一些条件项(Y或N)。 NUMBER INTEGER 在任何SQL语句之后,此项目包含条件项的数量。 如果没有出现警告或错误,或者之前没有执行过SQL语句,则返回的数字为1。 ROW_COUNT DECIMAL(31,0) 在插入、更新、删除或获取后,该项目包含已删除、插入、更新或获取的行数。 在PREPARE之后,此项目包含已准备语句中结果行的预计数量。 在TRUNCATE之后,它包含 -1。 DB2_SQL_NESTING_LEVEL INTEGER 在CALL语句之后,此项目标识执行GET DIAGNOSTICS语句时嵌套或递归的当前级别。 嵌套的每个级别对应于对封装的SQL函数、封装的SQL过程或触发器的嵌套或递归调用。 如果在嵌套级别之外执行 GET DIAGNOSTICS 语句,那么将返回值 0。 当应用程序连接到另一台服务器时,该值将重置为零。 目录名 VARCHAR(128) 拥有导致错误、访问规则或检查冲突的约束的表的服务器名称 条件编号 INTEGER 条件编号 CURSOR_NAME VARCHAR(128) 无效光标状态下的光标名称 DB2_ERROR_CODE1 INTEGER 内部错误代码 DB2_ERROR_CODE2 INTEGER 内部错误代码 DB2_ERROR_CODE3 INTEGER 内部错误代码 DB2_ERROR_CODE4 INTEGER 内部错误代码 DB2_INTERNAL_ERROR_POINTER INTEGER 对于某些错误,负值表示内部错误指针 DB2_LINE_NUMBER INTEGER 在解析动态语句时出错,或为原生SQL过程、已编译的SQL函数或触发器解析、绑定或执行CREATE或ALTER语句时出错 当CALL语句调用本机SQL过程且该过程返回错误时,行号
DB2_MESSAGE_ID CHAR(10) 消息ID与MESSAGE_TEXT诊断项中包含的消息相对应。 DB2_MODULE_DETECTING_ERROR CHAR(8) 检测到错误的模块 DB2_ORDINAL_TOKEN_n VARCHAR(515) 第n个标记,其中 n 是1到100之间的数值 DB2_REASON_CODE INTEGER 消息文本中带有原因代码标记的错误的原因代码 DB2_RETURNED_SQLCODE INTEGER 该状况的SQLCODE DB2_ROW_NUMBER DECIMAL(31,0) 在涉及多行的任何 SQL 语句之后,此项目包含 Db2 检测到条件的行号 DB2_SQLERRD1 INTEGER 服务器返回的 SQLCA 中的 sqlerrd(1) 值,或零 DB2_SQLERRD2 INTEGER 服务器返回的 SQLCA 中的 sqlerrd(2) 值,或零 DB2_SQLERRD3 INTEGER 服务器返回的 SQLCA 中的 sqlerrd(3) 值,或零 DB2_SQLERRD4 INTEGER 服务器返回的 SQLCA 中的 sqlerrd(4) 值,或零 DB2_SQLERRD5 INTEGER 服务器返回的 SQLCA 中的 sqlerrd(5) 值,或零 DB2_SQLERRD6 INTEGER 服务器返回的 SQLCA 中的 sqlerrd(6) 值,或零 DB2_TOKEN_COUNT INTEGER 条件可用代币数量 MESSAGE_TEXT VARCHAR(32672) 与SQLCODE相关的消息文本 返回的 SQL 状态 CHAR(5) 条件的SQLSTATE SERVER_NAME VARCHAR(128) 在CONNECT、DISCONNECT或SET CONNECTION语句之后,是语句中指定的服务器名称 DB2_AUTHENTICATION_TYPE CHAR(1) 认证类型(S、C、D、E或空白) DB2_AUTHORIZATION_ID VARCHAR(128) 连接的服务器使用的授权ID DB2_CONNECTION_STATE INTEGER 连接类型为未连接 (-1)、本地(0)或远程(1) DB2_CONNECTION_STATUS INTEGER 当前工作单元是否可以提交更新(1表示可以,2表示不可以) DB2_ENCRYPTION_TYPE CHAR(1) 连接的加密级别: (A) 仅认证令牌(认证ID和密码)被加密
(D) 连接的所有数据均已加密
DB2_PRODUCT_ID VARCHAR(8) Db2 产品签名 DB2_SERVER_CLASS_NAME char(128) 在CONNECT或SET CONNECTION语句之后, Db2 服务器类名 全部 VARCHAR(32672) 所有诊断项目以最后一个SQL语句的形式组合成一个字符串,以分号分隔的形式列出所有可用的诊断信息 - DRDA注意事项
- GET DIAGNOSTICS语句由当前的 Db2 for z/OS 客户端支持,与服务器级别无关(例如, Db2 for z/OS 版本7或Windows版本7的 Db2 )。 当应用程序连接到不支持开放集团第3版DRDA标准的服务器时,服务器返回的诊断信息可在条件信息中找到。
- 其他语法和同义词:
- 为了与 Db2 的早期版本或 Db2 系列中的其他产品兼容, Db2 支持以下关键词:
- RETURN_STATUS作为同义词 DB2_RETURN_STATUS
- 例外作为条件的同义词
例子 GET DIAGNOSTICS
- 示例 1
- 在应用程序中,使用GET DIAGNOSTICS语句确定更新了多少行。
long rcount; EXEC SQL UPDATE T1 SET C1 = C1 + 1; EXEC SQL GET DIAGNOSTICS :rcount = ROW_COUNT;执行这段代码后 ,rcount 将包含已更新的行数。
- 示例 2
在应用程序中,使用GET DIAGNOSTICS语句处理多个SQL错误。
long numerrors, counter; char retsqlstate[5]; long hva[5]; EXEC SQL INSERT INTO T1 FOR 5 ROWS VALUES (:hva) NOT ATOMIC CONTINUE ON SQLEXCEPTION; EXEC SQL GET DIAGNOSTICS :numerrors = NUMBER; for ( i=1;i < numerrors;i++) { EXEC SQL GET DIAGNOSTICS CONDITION :i :retsqlstate = RETURNED_SQLSTATE; ...执行这段代码后,将使用SQLSTATE设置并打印 retsqlstate ,其中包含在上一个SQL语句中遇到的每个错误。
- 示例 3
检索连接信息。
EXEC SQL GET DIAGNOSTICS CONDITION :HV_PRODUCT_ID = DB2_PRODUCT_ID;- 示例 4
使用GET DIAGNOSTICS语句检索与SQLCA返回的信息相似的信息
EXEC SQL GET DIAGNOSTICS CONDITION 1 :dasqlcode = DB2_RETURNED_SQLCODE, :datokencnt = DB2_TOKEN_COUNT, :datoken1 = DB2_ORDINAL_TOKEN_1, :datoken2 = DB2_ORDINAL_TOKEN_2, :datoken3 = DB2_ORDINAL_TOKEN_3, :datoken4 = DB2_ORDINAL_TOKEN_4, :datoken5 = DB2_ORDINAL_TOKEN_5, :dasqlerrd1b = DB2_MESSAGE_ID, :damsgtext = MESSAGE_TEXT, :dasqlerrp = DB2_MODULE_DETECTING_ERROR, :dasqlstate = RETURNED_SQLSTATE;- 示例 5
:在处理程序中指定 STACKED GET DIAGNOSTICS语句中的关键字,该语句用于在处理程序中访问导致处理程序激活的诊断区域中的信息:
CREATE PROCEDURE divide2 ( IN numerator INTEGER, IN denominator INTEGER, OUT divide_result INTEGER, OUT divide_error VARCHAR(70)) LANGUAGE SQL BEGIN DECLARE msg_text CHAR(70) DEFAULT ''; DECLARE divide_error CHAR(70) DEFAULT ''; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN INSERT .....; -- insert row into a log table -- get diagnostic information for the INSERT statement GET CURRENT DIAGNOSTICS CONDITION 1 msg_text = MESSAGE_TEXT; -- get information about condition that activated the handler GET STACKED DIAGNOSTICS CONDITION 1 divide_error = MESSAGE_TEXT; END; SET divide_result = numerator/denominator; END;第一个GET DIAGNOSTICS语句获取有关INSERT语句的诊断信息。
第二个GET DIAGNOSTICS语句指定了STACKED关键字。 使用STACKED关键字可以访问堆叠诊断区域,其中包含导致处理程序被激活的诊断信息。 即使在发出其他语句(例如示例中的INSERT语句)后,仍可在处理程序中访问原始状态信息。
示例6: 以下应用程序记录了每当一个例程被应用程序直接调用而不是被另一个例程间接调用时发生的信息。 应用程序使用GET DIAGNOSTICS语句指定 DB2_SQL_NESTING_LEVEL 来获取当前嵌套级别,如果嵌套级别为1,则调用LOG_INVOCATION过程:CREATE PROCEDURE TEST MODIFIES SQL DATA LANGUAGE SQL BEGIN DECLARE NESTING_LEVEL INT DEFAULT 0; GET DIAGNOSTICS NESTING_LEVEL = DB2_SQL_NESTING_LEVEL; -- -- If routine is invoked at nesting level 1, -- invoke a routine to log the invocation. -- IF (NESTING_LEVEL = 1) THEN CALL LOG_INVOCATION(); END IF; -- -- Remainder of procedure logic -- ... END
