Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...
Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...
Топ:
Комплексной системы оценки состояния охраны труда на производственном объекте (КСОТ-П): Цели и задачи Комплексной системы оценки состояния охраны труда и определению факторов рисков по охране труда...
Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов...
Особенности труда и отдыха в условиях низких температур: К работам при низких температурах на открытом воздухе и в не отапливаемых помещениях допускаются лица не моложе 18 лет, прошедшие...
Интересное:
Принципы управления денежными потоками: одним из методов контроля за состоянием денежной наличности является...
Средства для ингаляционного наркоза: Наркоз наступает в результате вдыхания (ингаляции) средств, которое осуществляют или с помощью маски...
Финансовый рынок и его значение в управлении денежными потоками на современном этапе: любому предприятию для расширения производства и увеличения прибыли нужны...
Дисциплины:
2020-06-02 | 112 |
5.00
из
|
Заказать работу |
|
|
В главе 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:
|
Предположим, что вы получили значение 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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!