Spec-Zone .ru
спецификации, руководства, описания, API
|
SQL-операторы производят диагностическую информацию, которая заполняет область диагностики. У стандартного SQL
есть стек области диагностики, содержа область диагностики для каждого вложенного контекста выполнения.
Стандартный SQL также поддерживает GET STACKED DIAGNOSTICS
синтаксис для того,
чтобы обратиться к второй области диагностики во время выполнения обработчика особых ситуаций. MySQL не
поддерживает STACKED
ключевое слово до MySQL 5.7. В MySQL 5.6 есть единственная
область диагностики, содержащая информацию от нового оператора, который записал в это.
Этот раздел описывает структуру области диагностики в 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)
Определенные системные переменные управляют или связываются с некоторыми аспектами области диагностики:
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, который не имеет никакого
непосредственного эффекта на размер или контент области диагностики.
Перед MySQL 5.6 единицы информации оператора не доступны непосредственно. ROW_COUNT
может быть получен, вызывая ROW_COUNT()
функция. NUMBER
приближается значением warning_count
системная переменная. Однако, тогда как NUMBER
ограничивается к значению max_error_count
, warning_count
не.