Spec-Zone .ru
спецификации, руководства, описания, API

13.6.7.3. GET DIAGNOSTICS Синтаксис

GET [CURRENT] DIAGNOSTICS{    statement_information_item    [, statement_information_item] ...   | CONDITION condition_number    condition_information_item    [, condition_information_item] ...}statement_information_item:    target = statement_information_item_namecondition_information_item:    target = condition_information_item_namestatement_information_item_name:    NUMBER  | ROW_COUNTcondition_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_NAMEcondition_number, target:    (see following discussion)

SQL-операторы производят диагностическую информацию, которая заполняет область диагностики. GET DIAGNOSTICS оператор позволяет приложениям осмотреть эту информацию. Это доступно с MySQL 5.6.4. (Можно также использовать SHOW WARNINGS или SHOW ERRORS видеть условия или ошибки.)

Никакие специальные полномочия не обязаны выполняться GET DIAGNOSTICS.

Ключевое слово CURRENT средства получить информацию от текущей области диагностики. В MySQL это не имеет никакого эффекта, потому что это - поведение значения по умолчанию.

GET DIAGNOSTICS обычно используется в обработчике в пределах сохраненной программы, но это - расширение MySQL, что этому разрешают внешний контекст обработчика, чтобы проверить выполнение любого SQL-оператора. Например, если Вы вызываете mysql клиентскую программу, можно ввести эти операторы при подсказке:

mysql> DROP TABLE test.no_such_table;ERROR 1051 (42S02): Unknown table 'test.no_such_table'mysql> GET DIAGNOSTICS CONDITION 1    ->   @p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT;mysql> SELECT @p1, @p2;+-------+------------------------------------+| @p1   | @p2                                |+-------+------------------------------------+| 42S02 | Unknown table 'test.no_such_table' |+-------+------------------------------------+

Для описания области диагностики см. Раздел 13.6.7.7, "MySQL Diagnostics Area". Кратко, это содержит два вида информации:

Для оператора, который производит три условия, область диагностики содержит оператор и информацию об условии как это:

Statement information:  row count  ... other statement information items ...Condition area list:  Condition area 1:    error code for condition 1    error message for condition 1    ... other condition information items ...  Condition area 2:    error code for condition 2:    error message for condition 2    ... other condition information items ...  Condition area 3:    error code for condition 3    error message for condition 3    ... other condition information items ...

GET DIAGNOSTICS может получить или оператор или информацию об условии, но не обоих в том же самом операторе:

Список извлечения определяет один или больше target = item_name присвоения, разделенные запятыми. Каждое присвоение называет целевую переменную и любого a statement_information_item_name или condition_information_item_name указатель, в зависимости от того, получает ли оператор информация об условии или оператор.

Допустимый target указатели для того, чтобы хранить информацию элемента могут быть хранимой процедурой или параметрами функции, сохраненные локальные переменные программы, объявленные с DECLARE, или определяемые пользователем переменные.

Допустимый condition_number указатели могут быть хранимой процедурой или параметрами функции, сохраненные локальные переменные программы, объявленные с DECLARE, определяемые пользователем переменные, системные переменные, или литералы. Символьный литерал может включать a _charset introducer. Предупреждение происходит, если число условия не находится в диапазоне от 1 до числа областей условия, у которых есть информация. В этом случае предупреждение добавляется к области диагностики, не очищая это.

В настоящий момент, когда условие происходит, MySQL не заполняет все элементы условия, распознанные GET DIAGNOSTICS. Например:

mysql> GET DIAGNOSTICS CONDITION 1    ->   @p5 = SCHEMA_NAME, @p6 = TABLE_NAME;mysql> SELECT @p5, @p6;+------+------+| @p5  | @p6  |+------+------+|      |      |+------+------+

В стандартном SQL, если есть многократные условия, первое условие касается SQLSTATE значение возвратилось для предыдущего SQL-оператора. В MySQL это не гарантируется. Чтобы получить основную ошибку, невозможно сделать этого:

GET DIAGNOSTICS CONDITION 1 @errno = MYSQL_ERRNO;

Вместо этого получите количество условия сначала, затем используйте его, чтобы определить который число условия осмотреть:

GET DIAGNOSTICS @cno = NUMBER;GET DIAGNOSTICS CONDITION @cno @errno = MYSQL_ERRNO;

Для получения информации о допустимом операторе и единицах информации условия, и которые заполняются, когда условие происходит, см. Раздел 13.6.7.7.2, "Элементы Информации по области Диагностики".

Вот пример, который использует GET DIAGNOSTICS и обработчик исключений в контексте хранимой процедуры, чтобы оценить результат работы вставки. Если вставка была успешна, использование процедуры GET DIAGNOSTICS получить влиявшее строками количество. Это показывает, что можно использовать GET DIAGNOSTICS многократно, чтобы получить информацию об операторе, пока область диагностики не была очищена.

CREATE PROCEDURE do_insert(value INT)BEGIN  -- Declare variables to hold diagnostics area information  DECLARE code CHAR(5) DEFAULT '00000';  DECLARE msg TEXT;  DECLARE rows INT;  DECLARE result TEXT;  -- Declare exception handler for failed insert  DECLARE CONTINUE HANDLER FOR SQLEXCEPTION    BEGIN      GET DIAGNOSTICS CONDITION 1        code = RETURNED_SQLSTATE, msg = MESSAGE_TEXT;    END;  -- Perform the insert  INSERT INTO t1 (int_col) VALUES(value);  -- Check whether the insert was successful  IF code = '00000' THEN    GET DIAGNOSTICS rows = ROW_COUNT;    SET result = CONCAT('insert succeeded, row count = ',rows);  ELSE    SET result = CONCAT('insert failed, error = ',code,', message = ',msg);  END IF;  -- Say what happened  SELECT result;END;

Предположите это t1.int_col целочисленный столбец, который объявляется как NOT NULL. Процедура приводит к этим результатам когда вызвано, чтобы вставить не -NULL и NULL значения:

mysql> CALL do_insert(1);+---------------------------------+| result                          |+---------------------------------+| insert succeeded, row count = 1 |+---------------------------------+mysql> CALL do_insert(NULL);+-------------------------------------------------------------------------+| result                                                                  |+-------------------------------------------------------------------------+| insert failed, error = 23000, message = Column 'int_col' cannot be null |+-------------------------------------------------------------------------+

В пределах обработчика особых ситуаций, GET DIAGNOSTICS должен использоваться перед другими операторами, которые могли бы очистить область диагностики и заставить информацию быть потерянной об условии, которое активировало обработчик. Для получения информации о том, когда область диагностики устанавливается и очищается, см. Раздел 13.6.7.7, "MySQL Diagnostics Area".