Получение диагностической информации
GET [CURRENT] DIAGNOSTICS
{
statement_property
[, statement_property] ...
| CONDITION condition_number
condition_property
[, condition_property] ...
}
statement_property:
variable = statement_property_name
condition_property:
variable = condition_property_name
statement_property_name:
NUMBER
| ROW_COUNT
condition_property_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
| ROW_NUMBER
Область диагностики содержит информацию об ошибках, предупреждениях и заметках, которые были выведены последним SQL-запросом. Если этот запрос не выдал никаких предупреждений, область диагностики содержит информацию о последнем выполненном запросе, который затронул таблицу. Команда GET DIAGNOSTICS копирует запрошенную информацию из области диагностики в указанные переменные. Можно использовать как пользовательские переменные, так и локальные переменные.
Для использования GET DIAGNOSTICS важно знать структуру области диагностики. Она состоит из двух подобластей: области информации о запросе и области информации об ошибочных условиях. Подробности см. на странице области диагностики.
Каждая команда GET DIAGNOSTICS может считывать информацию из области информации о запросе или из одного ошибочного условия. Это означает, что если у вас есть два предупреждения и вы хотите узнать количество предупреждений и прочитать оба предупреждения, вам нужно выполнить GET DIAGNOSTICS три раза.
Ключевое слово CURRENT не добавляет ничего к запросу, так как в MariaDB существует только одна область диагностики.
Если GET DIAGNOSTICS генерирует ошибочное условие (потому что команда корректно проанализирована, но некорректно использована), область диагностики не очищается, а новое условие добавляется.
Получение информации об условии
Для чтения информации об условии необходимо указать ключевое слово CONDITION и после него номер условия. Этот номер можно указать как константу, так и как переменную. Индекс первого условия равен 1. Если ошибочного условия не существует, значения переменных не изменятся, и будет выведено сообщение об ошибке 1758 ("Неверный номер условия").
Свойства условия, которые можно прочитать с помощью GET DIAGNOSTICS, такие же, как и те, которые можно задать с помощью команд SIGNAL и RESIGNAL. Они описаны на странице области диагностики. Однако есть еще одно свойство: RETURNED_SQLSTATE, которое указывает SQLSTATE условия.
Список значений SQLSTATE и кодов ошибок MariaDB см. в разделе Коды ошибок MariaDB.
Тип для всех свойств условия — VARCHAR(64), за исключением MYSQL_ERRNO, допустимый диапазон которого составляет от 1 до 65534.
Номер строки
До MariaDB 10.7 не было способа узнать, на какой строке произошла ошибка, кроме как путем анализа текста ошибки. Начиная с 10.7, можно использовать свойство ROW_NUMBER для получения номера строки тоже, даже если текст ошибки его не содержит. Обратите внимание, что в предварительной версии MariaDB 10.7.0 это свойство называлось ERROR_INDEX. В результате, ROW_NUMBER является зарезервированным словом начиная с MariaDB 10.7.
Примеры
В следующем примере запрос генерирует два предупреждения, и GET DIAGNOSTICS используется для получения количества предупреждений:
CREATE TABLE `test`.`t` (`c` INT) ENGINE = x; Query OK, 0 rows affected, 2 warnings (0.19 sec) GET DIAGNOSTICS @num_conditions = NUMBER; SELECT @num_conditions; +-----------------+ | @num_conditions | +-----------------+ | 2 | +-----------------+
Затем, мы можем увидеть предупреждения:
GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT; SELECT @sqlstate, @errno, @text; +-----------+--------+----------------------------+ | @sqlstate | @errno | @text | +-----------+--------+----------------------------+ | 42000 | 1286 | Unknown storage engine 'x' | +-----------+--------+----------------------------+ GET DIAGNOSTICS CONDITION 2 @sqlstate = RETURNED_SQLSTATE, @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT; SELECT @sqlstate, @errno, @text; +-----------+--------+-------------------------------------------+ | @sqlstate | @errno | @text | +-----------+--------+-------------------------------------------+ | HY000 | 1266 | Using storage engine InnoDB for table 't' | +-----------+--------+-------------------------------------------+
Начиная с MariaDB 10.7:
INSERT INTO t1 VALUES (4,'d',1.00104),(1,'a',1.00101),(2,'b',1.00102); ERROR 23000: Duplicate entry '1' for key 'PRIMARY' GET DIAGNOSTICS CONDITION 1 @row_num= ROW_NUMBER; SELECT @row_num; +----------+ | @row_num | +----------+ | 2 | +----------+
См. также
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/get-diagnostics/