VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

GET DIAGNOSTICS

功能描述

Vastbase在MySQL兼容模式下支持GET DIAGNOSTICS语法,用于检查SQL语句执行填充到诊断区域的诊断信息,通常用于存储程序中的句柄中。

诊断区域包含两种信息:

  • 语句信息:例如发生的条件数或受影响的行数。
  • 条件信息:如错误代码和消息。如果一条语句引发多个条件,则诊断区域的这部分针对每个条件都有一个条件区域。如果一条语句没有引发任何条件,则诊断区域的这部分为空。

GET DIAGNOSTICS可以获取语句或条件信息,但不能在同一语句中同时获取这两种信息:

  • 获取语句信息,要所需的语句项检索到目标变量中。

  • 获取条件信息,要指定条件编号并将所需的条件项检索到目标变量中。

注意事项

  • 该功能仅在数据库兼容模式为MySQL时支持(即数据库实例初始化时指定DBCOMPATIBILITY='B')。

  • 该功能仅对在函数或存储过程中的语法进行支持,在Vastbase中row_count默认值为-1。

  • 使用该功能需要打开GUC参数enable_set_variable_b_format

语法格式

GET [CURRENT | STACKED] DIAGNOSTICS {
    statement_information_item
    [, statement_information_item] ...
    | CONDITION condition_number
    condition_information_item
    [, condition_information_item] ...
}
  • statement_information_item:

    target = statement_information_item_name
    
  • condition_information_item:

    target = condition_information_item_name
    
  • statement_information_item_name:

    NUMBER  //条件编号
    | ROW_COUNT  //受影响的行数
    
  • condition_information_item_name:

    CLASS_ORIGIN
    | SUBCLASS_ORIGIN
    | RETURNED_SQLSTATE
    | MESSAGE_TEXT
    | MYSQL_ERRNO
    | CONSTRAINT_CATALOG
    | CONSTRAINT_SCHEMA
    | CONSTRAINT_NAME
    | CATALOG_NAME
    | SCHEMA_NAME
    | TABLE_NAME
    | COLUMN_NAME
    | CURSOR_NAME
    

参数说明

  • CURRENT | STACKED

    • 关键字CURRENT表示从当前诊断区域检索信息。

    • 关键字STACKED表示从第二个诊断区域检索信息,仅当当前上下文是条件处理程序时才可用。

    如果没有给出任何关键字,则默认为使用当前诊断区域。

  • STACKED

    表示从第二个诊断区域检索信息,该区域仅在当前上下文时条件句柄时可用。

  • statement_information_item

    statment 执行状况信息捕获反馈,包括 NUMBER、ROW_COUNT。

    • NUMBER

      条件编号。

    • ROW_COUNT

      表示受语句影响的行数。

      Vastbase中row_count默认值为-1。

  • condition_information_item

    捕获异常状况信息。包括如下内容:

    • CLASS_ORIGIN

      包含RETURNED_SQLSTATE值的类的字符串。

    • SUBCLASS_ORIGIN

      包含RETURNED_SQLSTATE值的子类的字符串。

    • RETURNED_SQLSTATE

      表示条件的SQLSTATE值的字符串。

    • MESSAGE_TEXT

      表示条件的错误消息的字符串。

    • MYSQL_ERRNO

      表示条件的 MYSQL 错误代码的整数。

    • CONSTRAINT_CATALOG、CONSTRAINT_SCHEMA、CONSTRAINT_NAME

      表示违反的约束的目录、架构和名称的字符串。

    • CATALOG_NAME、SCHEMA_NAME、TABLE_NAME、COLUMN_NAME

      表示与条件相关的目录、架构、表和列的字符串。

    • CURSOR_NAME

      表示游标名称的字符串。

示例

1、开启GUC参数。

SET enable_set_variable_b_format=on;

2、创建测试表。

CREATE TABLE t_diagnostics_1145107(c_binary_integer binary_integer,c_binary_float binary_float,c_int2 int2,c_int4 int4,c_numeric numeric,c_number number,c_float4 float4,c_float8 float8,c_real real,c_char char,c_varchar varchar,c_charn char(1),c_varcharn varchar(20),c_varchar2n varchar2(20),c_ncharn nchar(20),c_clob clob,c_text text,c_name name,c_date date,c_time time,c_timestamp timestamp,c_smalldatetime smalldatetime,c_interval interval,c_intervaldaytosecond interval day to second,c_reltime reltime
)partition by list(c_int2)
(partition p1 values (1,3,5),
partition p2 values (2,4,6),
partition p3 values (7,8,9,10));

3、执行如下命令将参数置空。

set @condition=1;
set @class_origin='',@subclass_origin='',@returned_sqlstate='',@message_text= '',@mysql_errno='',@constraint_catalog='',@constraint_schema='',@constraint_name='',@catalog_name='',@schema_name='',@table_name='',@column_name='',@cursor_name='';

4、再次创建表t_diagnostics_1145107(创建表报错已存在)。

CREATE TABLE t_diagnostics_1145107(c1 int);

5、执行GET DIAGNOSTICS命令。

GET DIAGNOSTICS @number = NUMBER , @row_count = ROW_COUNT;
GET DIAGNOSTICS CONDITION @condition @class_origin=CLASS_ORIGIN,@subclass_origin=SUBCLASS_ORIGIN,@returned_sqlstate=RETURNED_SQLSTATE,@message_text= MESSAGE_TEXT,@mysql_errno=MYSQL_ERRNO,@constraint_catalog=CONSTRAINT_CATALOG,@constraint_schema=CONSTRAINT_SCHEMA,@constraint_name=CONSTRAINT_NAME,@catalog_name=CATALOG_NAME,@schema_name=SCHEMA_NAME,@table_name=TABLE_NAME,@column_name=COLUMN_NAME,@cursor_name=CURSOR_NAME;

6、查询诊断结果。

由于内容较多,为了更加直观的显示,通过\X方式启用列式方式显示结果。

\x

查询诊断结果。

select @number,@row_count,@class_origin,@subclass_origin,@returned_sqlstate,@message_text,@mysql_errno,@constraint_catalog,@constraint_schema,@constraint_name,@catalog_name,@schema_name,@table_name,@column_name,@cursor_name;

返回结果为:

-[ RECORD 1 ]-------+-------------------------------------------------------------------
@number             | 1
@row_count          | -1
@class_origin       | ISO 9075
@subclass_origin    | ISO 9075
@returned_sqlstate  | 42P07
@message_text       | relation "t_diagnostics_1145107" already exists in schema "public"
@mysql_errno        | 42P07
@constraint_catalog | (null)
@constraint_schema  | (null)
@constraint_name    | (null)
@catalog_name       | (null)
@schema_name        | (null)
@table_name         | (null)
@column_name        | (null)
@cursor_name        | (null)