Spec-Zone .ru
спецификации, руководства, описания, API
|
GET [CURRENT | STACKED] DIAGNOSTICS{statement_information_item
[,statement_information_item
] ... | CONDITIONcondition_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_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
может получить или оператор или информацию об условии, но не
обоих в том же самом операторе:
Чтобы получить информацию об операторе, получите требуемые элементы оператора в
целевые переменные. Этот экземпляр GET
DIAGNOSTICS
присваивает число доступных условий и влиявшего строками количества к
пользовательским переменным @p1
и @p2
:
GET DIAGNOSTICS @p1 = NUMBER, @p2 = ROW_COUNT;
Чтобы получить информацию об условии, определите число условия и получите требуемые
элементы условия в целевые переменные. Этот экземпляр GET DIAGNOSTICS
присваивает значение SQLSTATE и сообщение об ошибке к
пользовательским переменным @p3
и @p4
:
GET DIAGNOSTICS CONDITION 1@p3 = RETURNED_SQLSTATE, @p4 = MESSAGE_TEXT;
Список извлечения определяет один или больше
присвоения, разделенные запятыми. Каждое присвоение называет целевую переменную и любого a target
= item_name
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 || |+----------+