Область заголовка диагностики — КиберПедия 

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Область заголовка диагностики

2020-06-02 111
Область заголовка диагностики 0.00 из 5.00 0 оценок
Заказать работу

В главе 14 мы изучали оператор SET TRANSACTION (задать транзакцию). В нем можно указать DIAGNOSTICS SIZE (размер диагностики). Этот размер является количеством информационных областей, выделяемых для хранения информации о состоянии. Если в операторе SET TRANSACTION не будет предложения DIAGNOSTICS SIZE, то СУБД выделит количество информационных областей, которое в ней установлено по умолчанию.

Заголовок области состоит из восьми элементов, которые приведены в табл. 20.1.

Таблица 20.1. Область заголовка диагностики.

Поля Тип данных
number (количество) Точный числовой, масштаб 0
row_count (количество строк) Точный числовой, масштаб 0
command_functton (командная функция) Символьная строка переменного размера, не менее 128 символов
command_function_code (код командной функции) Точный числовой, масштаб 0
more (больше) Символьная строка, длина 1
transact ions_commited (фиксированные транзакции) Точный числовой, масштаб 0
transactions_rolled_back (откатанные транзакции) Точный числовой, масштаб 0
transactions_active (состояние транзакции) Точный числовой, масштаб 0

Ниже эти элементы описаны более детально.

· В поле NUMBER хранится количество областей, заполненных диагностической информацией о текущей операции.

· В поле ROW_COUNT содержится количество строк, задействованных при выполнении оператора SQL INSERT, UPDATE или DELETE.

· Поле COMMAND_FUNCTION описывает только что выполненный динамический оператор SQL (если последний выполненный оператор SQL действительно был динамическим).

· Поле COMMAND_FUNCTION_CODE отображает номер кода для только что выполненного динамического оператора SQL (если последний выполненный оператор SQL действительно был динамическим). Каждая динамическая функция имеет соответствующий код.

· Поле MORE содержит одно из значений: 'Y' (да) или 'N' (нет). Значение 'Y' указывает на то, что записей состояния больше, чем может вместить область диагностики. Значение 'N' означает, что все сгенерированные записи состояния представлены в области диагностики. Вы можете получить необходимое количество записей, увеличив его, используя оператор SET TRANSACTIONS, однако эта возможность зависит от используемой вами реализации.

· Поле TRANSACTIONS_COMMITED содержит количество совершенных транзакций.

· Поле TRANSACTIONS_ROLLED_BACK содержит количество транзакций, которые были откатаны.

· Поле TRANSACTIONS_ACTIVE содержит значение 'Г, если транзакция в настоящее время активна, и значение '0' в противном случае. Транзакция считается допустимой для активизации, если открыт курсор или СУБД находится в ожидании отложенного параметра.

· Информационная область диагностики

· В информационных областях хранятся данные по каждой отдельной ошибке, предупреждению или состоянию успешного завершения. Каждая информационная область (табл. 20.2) состоит из 26 элементов.

· Таблица 20.2. Информационная область диагностики.

Элемент Тип данных
CONDITION_NUMBER (номер состояния) Точный числовой, масштаб 0
RETURNED_SQLSTATE (значение SQLSTATE) Символьная строка, 6 символов
MESSAGE_TEXT (текст сообщения) Символьная строка переменного размера, не менее 128 символов
MESSAGE_LENGTH (длина сообщения) Точный числовой, масштаб 0
MESSAGE OCTET LENGTH (длина сообщения в октетах) Точный числовой, масштаб 0
CLASS_ORIGIN (источник класса) Символьная строка переменного размера, не менее 128 символов
SUBCLASS_ORIGIN (источник подкласса) Символьная строка переменного размера, не менее 128 символов
CONNECTION_NAME (имя соединения) Символьная строка переменного размера, не менее 128 символов
SERVER_NAME (имя сервера) Символьная строка переменного размера, не менее 128 символов
CONTRAINT_CATALOG (каталог ограничения) Символьная строка переменного размера, не менее 128 символов
CONTRAINT_SCHEMA (схема ограничения) Символьная строка переменного размера, не менее 128 символов
CONSTRAINT_NAME (имя ограничения) Символьная строка переменного размера, не менее 128 символов
ENVIRONMENT_NAME (имя среды) Символьная строка переменного размера, не менее 128 символов
CATALOG_NAME (имя каталога) Символьная строка переменного размера, не менее 128 символов
SCHEMA_NAME (имя схемы) Символьная строка переменного размера, не менее 128 символов
TABLE_NAME (имя таблицы) Символьная строка переменного размера, не менее 128 символов
COLUMN_NAME (имя столбца) Символьная строка переменного размера, не менее 128 символов
CURSOR_NAME (имя курсора) Символьная строка переменного размера, не менее 128 символов
CONDITION_IDENTIFIER (идентификатор состояния) Символьная строка переменного размера, не менее 128 символов
PARAMETR_NAME (имя параметра) Символьная строка переменного размера, не менее 128 символов
ROUTINE_CATALOG (каталог программы) Символьная строка переменного размера, не менее 128 символов
ROUTINE_SCHEMA (схема программы) Символьная строка переменного размера, не менее 128 символов
ROUTINE_NAME (имя программы) Символьная строка переменного размера, не менее 128 символов
SPECIFIC_NAME (специфическое имя) Символьная строка переменного размера, не менее 128 символов
TRIGGER_CATALOG (каталог триггера) Символьная строка переменного размера, не менее 128 символов
TRIGGER_SCHEMA (схема триггера) Символьная строка переменного размера, не менее 128 символов
TRIGGER_NAME (имя триггера) Символьная строка переменного размера, не менее 128 символов

В элементе CONDITION_NUMBER содержится порядковый номер информационной области. Если оператор создает пять элементов состояния, которые заполняют пять информационных областей, то значение CONDITION_NUMBER для пятой такой области будет равно пяти. Чтобы получить доступ к конкретной информационной области, используйте оператор GET DIAGNOSTICS (получить диагностику) вместе с требуемым значением CONDITTONJSrUMBER. (Об операторе GET DIAGNOSTICS рассказывается ниже, в разделе "Что означает информация, возвращаемая SQLSTATE".) А в элементе RETURNED_SQLSTATE находится значение SQLSTATE, соответствующее данным этой информационной области.

Элемент CLASS_ORIGIN сообщает, откуда взято значение для кода класса, возвращаемое в параметре SQLSTATE. Если значение определено стандартом SQL, то элемент CLASS_ORIGIN равен TSO 9075'. А если оно определено реализацией СУБД, то в элементе CLASS_ORIGIN находится строка, в которой указана СУБД-источник. Элемент SUBCLASS_ORIGIN, в свою очередь, сообщает источник значения для кода подкласса, которое возвращено в параметре SQLSTATE.

Значение, находящееся в элементе CLASS_ORIGIN, является достаточно важным. Значение SQLSTATE, равное, например, '22012', относится к стандартным значениям этого параметра. Поэтому вам известно, что оно означает одно и то же во всех реализациях SQL. Однако если значение SQLSTATE равно '22500', первые два символа находятся в стандартном диапазоне и указывают на исключительную ситуацию, связанную с отсутствием данных, а последние три символа уже находятся в диапазоне, определяемом реализацией. Ну а если значение SQLSTATE равно '90001', то это значение полностью находится в диапазоне, определяемом реализацией. Одни и те же значения SQLSTATE, находящиеся в таком диапазоне, могут в разных реализациях означать совершенно различные понятия.

А где же найти описание '22500' или '90001' Для этого надо взглянуть в документацию пользователя СУБД. А какой именно СУБД? Ведь с помощью оператора CONNECT можно соединиться сразу с несколькими. Чтобы узнать, какой из них является источником ошибки, взгляните на элементы CLASS_ORIGIN и SUBCLASS_ORIGIN. В них находятся значения, которые определяют каждое приложение. Проверяя эти значения, можно определить, к какой СУБД относятся значения SQLSTATE. Значения, находящиеся в элементах CLASS_ORIGIN и SUBCLASS_ORIGIN, также определяются реализацией, но обычно содержат название компании-разработчика СУБД.

Если ошибка является нарушением ограничения, это ограничение можно определить с помощью элементов CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA и CONSTRAINT_NAME.

Пример нарушения ограничения

Из всей информации, предоставляемой оператором GET DIAGNOSTICS, самой важной является информация о нарушении ограничения. Рассмотрим пример. Создана таблица EMPLOYEE (сотрудник) со столбцами ID (идентификатор) и Salary (зарплата):

CREATE TABLE EMPLOYEE(ID CHAR(5) CONSTRAINT EmpPK PRIMARY KEY,Salary DEC(8.2) CONSTRAINT EmpSal CHECK Salary > 0,Dept CHAR(5) CONSTAINT EmpDeptREFERENCES DEPARTMENT);

Кроме того, имеется таблица DEPARTMENT (отдел) со столбцами DeptNo (номер отдела) и Budget (бюджет):

CREATE TABLE DEPARTMENT(DeptNo CHAR(5),Budget DEC(12.2) CONSTRAINT DeptBudgetCHECK(Budget >= SELECT SUM(Salary) FROM EMPLOYEEWHERE EMPLOYEE.Dept=DEPARTMENT.DeptNo),…);

А теперь посмотрите на следующий оператор INSERT:

INSERT INTO EMPLOYEE VALUES(:ID_VAR,:SAL__VAR,:DEPT_VAR);

Предположим, что вы получили значение SQLSTATE, равное '23000'. Посмотрев в документацию по SQL, вы видите, что этому значению соответствует описание "нарушение ограничения целостности". Это означает, что имеет место одна из следующих ситуаций.

· Значение IDJVAR повторяет уже существующее значение ID, т.е. нарушено ограничение PRIMARY KEY.

· Значение SALJVAR отрицательное – иначе говоря, нарушено ограничение CHECK на столбце Salary.

· Значение DEPT_VAR не является правильным ключом, соответствующим какой-либо из строк таблицы DEPARTMENT, так что нарушено ограничение REFERENCES в столбце Dept.

· Значение SAL_VAR настолько большое, что у сотрудников, работающих в отделе, для которого вводятся новые данные, сумма окладов превышает значение Budget для этого отдела. На этот раз имеется нарушение ограничения CHECK в столбце Budget таблицы DEPARTMENT. (Вспомните, что при изменении базы данных должны проверяться все связанные с ним ограничения, а не только те, которые определены в изменяемых таблицах.)

Обычно, чтобы узнать причины невыполнения оператора INSERT, приходится проводить большое количество тестов. Но на этот раз все, что нужно, можно узнать с помощью команды GET DIAGNOSTICS:

DECLARE ConstNameVar CHAR(18);GET DIAGNOSTICS EXCEPTION 1ConstNameVar = CONSTRAINT_NAME;

И если значение SQLSTATE равно '23000', то этот оператор GET DIAGNOSTICS присваивает переменной ConstNameVar одно из следующих значений: 'EmpPK', 'EmpSal', 'EmpDept' или 'DeptBudget'. Обратите внимание, для того, чтобы однозначно определить ограничение CONSTRAINT_NAME, еще могут понадобиться значения элементов CONSTRAINT_SCHEMA и CONSTRAINT_CATALOG.


Поделиться с друзьями:

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

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.019 с.