Spec-Zone.ru › MariaDB

Получение диагностической информации

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.0

Номер строки

До 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 |
+----------+

См. также

  • Область диагностики
Содержимое, воспроизведенное на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проверяется заранее компанией MariaDB. Мнения, информация и мнения, выраженные в этом содержании, не обязательно отражают точку зрения MariaDB или любой другой стороны.

© 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API