Spec-Zone .ru
спецификации, руководства, описания, API
|
GET [CURRENT] 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
оператор позволяет приложениям осмотреть эту информацию. Это
доступно с 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
может получить или оператор или информацию об условии, но не
обоих в том же самом операторе:
Чтобы получить информацию об операторе, получите требуемые элементы оператора в
целевые переменные. Этот экземпляр 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
DIAGNOSTICS
должен использоваться перед другими операторами, которые могли бы очистить область
диагностики и заставить информацию быть потерянной об условии, которое активировало обработчик. Для получения
информации о том, когда область диагностики устанавливается и очищается, см. Раздел
13.6.7.7, "MySQL Diagnostics Area".