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

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

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_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 оператор позволяет приложениям осмотреть эту информацию. (Можно также использовать SHOW WARNINGS или SHOW ERRORS видеть условия или ошибки.)

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

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

GET DIAGNOSTICS оператор обычно используется в обработчике в пределах сохраненной программы. Это - расширение MySQL это GET [CURRENT] DIAGNOSTICS разрешается внешний контекст обработчика, чтобы проверить выполнение любого 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' |+-------+------------------------------------+

Это расширение применяется только к текущей области диагностики. Это не применяется к второй области диагностики потому что GET STACKED DIAGNOSTICS разрешается, только если текущий контекст является обработчиком особых ситуаций. Если это не так, a GET STACKED DIAGNOSTICS when handler not active ошибка происходит.

Для описания области диагностики см. Раздел 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 [CURRENT] DIAGNOSTICS и GET STACKED DIAGNOSTICS может использоваться в пределах обработчика, чтобы получить доступ к содержанию текущих и сложенных областей диагностики. Первоначально, они возвращают тот же самый результат, таким образом, возможно получить информацию от текущей области диагностики об условии, которое активировало обработчик, пока Вы не выполняете операторов в пределах обработчика, которые изменяют его текущую область диагностики. Однако, операторы, выполняющиеся в пределах обработчика, могут изменить текущую область диагностики, очищая и устанавливая ее содержание согласно нормальным правилам (см. Раздел 13.6.7.7.3, "Как область Диагностики Заполняется").

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

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

В пределах хранимой процедуры p(), мы пытаемся вставить два значения в таблицу, которая содержит a TEXT NOT NULL столбец. Первое значение не -NULL строка и второе NULL. Столбец запрещает NULL значения, таким образом, первая вставка успешно выполняется, но вторые причины исключение. Процедура включает обработчик исключений, который отображает попытки вставить NULL во вставки пустой строки:

DROP TABLE IF EXISTS t1;CREATE TABLE t1 (c1 TEXT NOT NULL);DROP PROCEDURE IF EXISTS p;delimiter //END//CREATE PROCEDURE p ()BEGIN  DECLARE EXIT HANDLER FOR SQLEXCEPTION  BEGIN    DECLARE num INT;    DECLARE errno INT;    DECLARE msg TEXT;    -- Here the current DA is nonempty because the handler was invoked    GET CURRENT DIAGNOSTICS CONDITION 1      errno = MYSQL_ERRNO, msg = MESSAGE_TEXT;    SELECT 'current DA before mapped insert' AS op, errno, msg;    GET STACKED DIAGNOSTICS CONDITION 1      errno = MYSQL_ERRNO, msg = MESSAGE_TEXT;    SELECT 'stacked DA before mapped insert' AS op, errno, msg;    -- Map attempted NULL insert to empty string insert    INSERT INTO t1 (c1) VALUES('');    -- Here the current DA should be empty (if the INSERT succeeded),    -- so check whether there are conditions before attempting to    -- obtain condition information    GET CURRENT DIAGNOSTICS num = NUMBER;    IF num = 0    THEN      SELECT 'INSERT succeeded, current DA is empty' AS op;    ELSE      GET CURRENT DIAGNOSTICS CONDITION 1        errno = MYSQL_ERRNO, msg = MESSAGE_TEXT;      SELECT 'current DA after mapped insert' AS op, errno, msg;    END IF ;    GET STACKED DIAGNOSTICS CONDITION 1      errno = MYSQL_ERRNO, msg = MESSAGE_TEXT;    SELECT 'stacked DA after mapped insert' AS op, errno, msg;  END;  INSERT INTO t1 (c1) VALUES('string 1');  INSERT INTO t1 (c1) VALUES(NULL);END;//delimiter ;CALL p();SELECT * FROM t1;

Когда обработчик активируется, копия текущей области диагностики продвигается к стеку области диагностики. Первые дисплеи обработчика содержание текущих и сложенных областей диагностики, которые являются оба тем же самым первоначально:

+---------------------------------+-------+----------------------------+| op                              | errno | msg                        |+---------------------------------+-------+----------------------------+| current DA before mapped insert |  1048 | Column 'c1' cannot be null |+---------------------------------+-------+----------------------------++---------------------------------+-------+----------------------------+| op                              | errno | msg                        |+---------------------------------+-------+----------------------------+| stacked DA before mapped insert |  1048 | Column 'c1' cannot be null |+---------------------------------+-------+----------------------------+

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

+---------------------------------------+| op                                    |+---------------------------------------+| INSERT succeeded, current DA is empty |+---------------------------------------++--------------------------------+-------+----------------------------+| op                             | errno | msg                        |+--------------------------------+-------+----------------------------+| stacked DA after mapped insert |  1048 | Column 'c1' cannot be null |+--------------------------------+-------+----------------------------+

Когда обработчик особых ситуаций заканчивается, его текущая область диагностики выталкивается от стека, и сложенная область диагностики становится текущей областью диагностики в хранимой процедуре.

После возвратов процедуры таблица содержит две строки. Пустая строка следует из попытки вставить NULL это было отображено на пустую строку, вставьте:

+----------+| c1       |+----------+| string 1 ||          |+----------+