Spec-Zone .ru
спецификации, руководства, описания, API
|
SQL-операторы производят диагностическую информацию, которая заполняет область диагностики. У стандартного SQL
есть стек области диагностики, содержа область диагностики для каждого вложенного контекста выполнения.
Стандартный SQL также поддерживает GET STACKED DIAGNOSTICS
синтаксис для того,
чтобы обратиться к второй области диагностики во время выполнения обработчика особых ситуаций. MySQL
поддерживает STACKED
ключевое слово с MySQL 5.7. Перед этим MySQL не поддерживает
STACKED
; есть единственная область диагностики, содержащая информацию от нового
оператора, который записал в это.
Этот раздел описывает структуру области диагностики в MySQL, единицы информации, распознанные MySQL, как четкие операторы и устанавливают область диагностики, и как области диагностики продвигаются к и выталкиваются от стека.
Область диагностики содержит два вида информации:
Информация об операторе, такая как число условий, которые произошли или количество влиявших строк.
Информация об условии, такая как код ошибки и сообщение. Если оператор повышает многократные условия, у этой части области диагностики есть область условия для каждого. Если оператор не повышает условий, эта часть области диагностики пуста.
Для оператора, который производит три условия, область диагностики содержит оператор и информацию об условии как это:
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 ...
Область диагностики содержит единицы информации условия и оператор. Числовые элементы являются целыми
числами. Набор символов для символьных элементов является UTF-8. Никакой элемент не может быть NULL
. Если элемент оператора или условия не устанавливается оператором,
который заполняет область диагностики, ее значение 0 или пустая строка, в зависимости от типа данных
элемента.
Часть информации об операторе области диагностики содержит эти элементы:
NUMBER
: Целое число, указывающее на число областей
условия, у которых есть информация.
ROW_COUNT
: На целое число, указывающее на число
строк, влияет оператор. ROW_COUNT
имеет то же самое значение как ROW_COUNT()
функция (см. Раздел
12.14, "информационные Функции").
Часть информации об условии области диагностики содержит область условия для каждого условия. Области
условия нумеруются от 1 до значения NUMBER
элемент условия оператора. Если
NUMBER
0, нет никаких областей условия.
Каждая область условия содержит элементы в следующем списке. Все элементы являются стандартным SQL кроме
MYSQL_ERRNO
, который является расширением MySQL. Определения просят условия,
сгенерированные кроме сигналом (то есть, a SIGNAL
или RESIGNAL
оператор). Для условий несигнала MySQL заполняет только те элементы условия, не описанные как всегда пустой.
Эффекты сигналов на области условия описываются позже.
CLASS_ORIGIN
: Строка, содержащая class RETURNED_SQLSTATE
значение. Если RETURNED_SQLSTATE
значение начинается со значения class, определенного в
документе ISO 9075-2 стандартов SQL (раздел 24.1, SQLSTATE), CLASS_ORIGIN
'ISO 9075'
. Иначе, CLASS_ORIGIN
'MySQL'
.
SUBCLASS_ORIGIN
: Строка, содержащая подкласс RETURNED_SQLSTATE
значение. Если CLASS_ORIGIN
'ISO 9075'
или RETURNED_SQLSTATE
концы с '000'
, SUBCLASS_ORIGIN
'ISO 9075'
. Иначе, SUBCLASS_ORIGIN
'MySQL'
.
RETURNED_SQLSTATE
: Строка, которая указывает SQLSTATE
значение для условия.
MESSAGE_TEXT
: Строка, которая указывает на
сообщение об ошибке для условия.
MYSQL_ERRNO
: Целое число, которое указывает на код
ошибки MySQL для условия.
CONSTRAINT_CATALOG
, CONSTRAINT_SCHEMA
,
CONSTRAINT_NAME
: Строки, которые указывают на каталог, схему, и имя для
нарушенного ограничения. Они всегда пусты.
CATALOG_NAME
, SCHEMA_NAME
, TABLE_NAME
, COLUMN_NAME
: Строки, которые указывают на каталог, схему, таблицу, и
столбец, связанный с условием. Они всегда пусты.
CURSOR_NAME
: Строка, которая указывает на имя
курсора. Это всегда пусто.
Для RETURNED_SQLSTATE
, MESSAGE_TEXT
, и MYSQL_ERRNO
значения для определенных ошибок, см. Раздел
C.3, "Коды ошибки сервера и сообщения".
Если a SIGNAL
(или RESIGNAL
) оператор заполняет область диагностики, SET
пункт может присвоиться к любой единице информации условия кроме RETURNED_SQLSTATE
любое значение, которое является законным для типа данных
элемента. SIGNAL
также наборы RETURNED_SQLSTATE
значение, но не непосредственно в SET
пункт. То значение прибывает из SIGNAL
оператор SQLSTATE
параметр.
SIGNAL
также единицы информации оператора наборов. Это устанавливает NUMBER
к 1. Это устанавливает ROW_COUNT
к–1 для
ошибок и 0 иначе.
Большинство SQL-операторов заполняет область диагностики автоматически, и ее содержание может быть
установлено явно с SIGNAL
и RESIGNAL
операторы. Область диагностики может быть исследована с GET DIAGNOSTICS
извлечь определенные элементы, или с SHOW WARNINGS
или SHOW ERRORS
видеть условия или ошибки.
SQL-операторы очищают и набор область диагностики следующим образом:
Когда сервер начинает выполнять оператор после парсинга этого, это очищает
область диагностики для недиагностических операторов то использование таблицы. Диагностические
операторы SHOW WARNINGS
,
SHOW ERRORS
, и GET DIAGNOSTICS
.
Если оператор повышает условие, область диагностики очищается от условий,
которые принадлежат более ранним операторам. Исключение - это условия, повышенные GET DIAGNOSTICS
и RESIGNAL
добавляются к области диагностики, не очищая это.
Таким образом даже оператор, который обычно не очищает область диагностики, когда это начинает выполняться, очищает это, если оператор повышает условие.
Следующий пример показывает эффект различных операторов на области диагностики, используя SHOW WARNINGS
вывести на экран информацию об условиях, сохраненных там.
Это DROP TABLE
оператор использует таблицу, таким образом, он очищает область
диагностики и заполняет это, когда условие происходит:
mysql>DROP TABLE IF EXISTS test.no_such_table;
Query OK, 0 rows affected, 1 warning (0.01 sec)mysql>SHOW WARNINGS;
+-------+------+------------------------------------+| Level | Code | Message |+-------+------+------------------------------------+| Note | 1051 | Unknown table 'test.no_such_table' |+-------+------+------------------------------------+1 row in set (0.00 sec)
Это SET
оператор не использует таблицы и не генерирует предупреждения, таким образом, это листы неизменная область
диагностики:
mysql>SET @x = 1;
Query OK, 0 rows affected (0.00 sec)mysql>SHOW WARNINGS;
+-------+------+------------------------------------+| Level | Code | Message |+-------+------+------------------------------------+| Note | 1051 | Unknown table 'test.no_such_table' |+-------+------+------------------------------------+1 row in set (0.00 sec)
Это SET
оператор генерирует ошибку, таким образом, он очищает и заполняет область диагностики:
mysql>SET @x = @@x;
ERROR 1193 (HY000): Unknown system variable 'x'mysql>SHOW WARNINGS;
+-------+------+-----------------------------+| Level | Code | Message |+-------+------+-----------------------------+| Error | 1193 | Unknown system variable 'x' |+-------+------+-----------------------------+1 row in set (0.00 sec)
Предыдущее SET
оператор, произведенный единственное условие, таким образом, 1
единственное допустимое число условия для GET
DIAGNOSTICS
в этой точке. Следующий оператор использует число условия 2, который производит
предупреждение, которое добавляется к области диагностики, не очищая его:
mysql>GET DIAGNOSTICS CONDITION 2 @p = MESSAGE_TEXT;
Query OK, 0 rows affected, 1 warning (0.00 sec)mysql>SHOW WARNINGS;
+-------+------+------------------------------+| Level | Code | Message |+-------+------+------------------------------+| Error | 1193 | Unknown system variable 'xx' || Error | 1753 | Invalid condition number |+-------+------+------------------------------+2 rows in set (0.00 sec)
Теперь есть два условия в области диагностики, таким образом, то же самое GET DIAGNOSTICS
оператор успешно выполняется:
mysql>GET DIAGNOSTICS CONDITION 2 @p = MESSAGE_TEXT;
Query OK, 0 rows affected (0.00 sec)mysql>SELECT @p;
+--------------------------+| @p |+--------------------------+| Invalid condition number |+--------------------------+1 row in set (0.01 sec)
Когда нажатие к стеку области диагностики происходит, первая (текущая) область диагностики становится второй (сложенной) областью диагностики, и новая текущая область диагностики создается как копия этого. Области диагностики продвигаются к и выталкиваются от стека при следующих обстоятельствах:
Выполнение сохраненной программы
Нажатие происходит прежде, чем программа выполняется, и выталкивание происходит позже. Если
сохраненная программа заканчивается, в то время как обработчики выполняются, может быть больше
чем одна область диагностики, чтобы появиться; это происходит из-за исключения, для которого нет
никаких соответствующих обработчиков или из-за RETURN
в обработчике.
Любое предупреждение или состояния ошибки, происходящие во время сохраненного выполнения программы тогда, добавляются к текущей области диагностики, за исключением того, что для триггеров только ошибки добавляются. Когда сохраненная программа заканчивается, вызывающая сторона видит эти условия в своем токе diagonstics область.
Выполнение обработчика особых ситуаций в пределах сохраненной программы
Когда нажатие происходит в результате активации обработчика особых ситуаций, сложенной областью
диагностики является область, которая была текущей в пределах сохраненной программы до нажатия.
Новой теперь текущей областью диагностики является текущая область диагностики обработчика. GET [CURRENT]
DIAGNOSTICS
и GET
STACKED DIAGNOSTICS
может использоваться в пределах обработчика, чтобы получить
доступ к содержанию тока (обработчик) и сложен (сохраненная программа) области диагностики.
Первоначально, они возвращают тот же самый результат, но операторы, выполняющиеся в пределах
обработчика, изменяют текущую область диагностики, очищая и устанавливая ее содержание согласно
нормальным правилам (см. Раздел
13.6.7.7.3, "Как область Диагностики Заполняется"). Сложенная область
диагностики не может быть изменена операторами, выполняющимися в пределах обработчика кроме RESIGNAL
.
Если обработчик выполняется успешно, ток (обработчик), область диагностики выталкивается и сложенный (сохраненная программа), область диагностики снова становится текущей областью диагностики. Условия, добавленные к области диагностики обработчика во время выполнения обработчика, добавляются к текущей области диагностики.
Выполнение RESIGNAL
RESIGNAL
оператор передает информацию о состоянии ошибки, которая
доступна во время выполнения обработчика особых ситуаций в пределах составного оператора в
сохраненной программе. RESIGNAL
может изменить некоторых или всю информацию перед
передачей этого, изменяя стек диагностики как описано в Разделе
13.6.7.4,"RESIGNAL
Синтаксис".
Определенные системные переменные управляют или связываются с некоторыми аспектами области диагностики:
max_error_count
управляет числом областей условия в области
диагностики. Если больше условий чем это происходит, MySQL тихо отбрасывает информацию для
избыточных условий. (Условия, добавленные RESIGNAL
всегда добавляются, с более старыми условиями,
отбрасываемыми по мере необходимости, чтобы создать место.)
warning_count
указывает на число условий, которые произошли. Это
включает ошибки, предупреждения, и примечания. Обычно, NUMBER
и warning_count
то же самое. Однако, поскольку число сгенерированных условий превышает max_error_count
, значение warning_count
продолжает повышаться тогда как NUMBER
остается ограниченным в max_error_count
потому что никакие дополнительные условия не
сохранены в области диагностики.
error_count
указывает на число ошибок, которые произошли. Это
значение включает "не найденный" и
условия исключения, но исключает предупреждения и примечания. Как warning_count
, его значение может превысить max_error_count
.
Если sql_notes
системная переменная устанавливается в 0, примечания не
записываются и не постепенно увеличиваются warning_count
.
Пример: Если max_error_count
10, область диагностики может содержать максимум 10 областей условия. Предположите, что оператор повышает 20
условий, 12 из которых являются ошибками. В этом случае область диагностики содержит первые 10 условий,
NUMBER
10, warning_count
20, и error_count
12.
Изменения к значению max_error_count
имейте никакого эффекта до следующей попытки изменить область
диагностики. Если область диагностики содержит 10 областей условия и max_error_count
устанавливается в 5, который не имеет никакого
непосредственного эффекта на размер или контент области диагностики.