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)