Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...
Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...
Топ:
Основы обеспечения единства измерений: Обеспечение единства измерений - деятельность метрологических служб, направленная на достижение...
Выпускная квалификационная работа: Основная часть ВКР, как правило, состоит из двух-трех глав, каждая из которых, в свою очередь...
Оценка эффективности инструментов коммуникационной политики: Внешние коммуникации - обмен информацией между организацией и её внешней средой...
Интересное:
Подходы к решению темы фильма: Существует три основных типа исторического фильма, имеющих между собой много общего...
Влияние предпринимательской среды на эффективное функционирование предприятия: Предпринимательская среда – это совокупность внешних и внутренних факторов, оказывающих влияние на функционирование фирмы...
Наиболее распространенные виды рака: Раковая опухоль — это самостоятельное новообразование, которое может возникнуть и от повышенного давления...
Дисциплины:
2020-06-02 | 114 |
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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!