Программирование >>  Руководство по sql 

1 ... 61 62 63 [ 64 ] 65 66 67 ... 105


Разборка курсора

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

Если какие-то таблицы, курсоры или столбцы, лежащие в основе курсора, были удалены или переименованы, или если в результате реструктуризации возникли несовместимости Mexiy типами данных, система не сможет интерпретировать курсор, а вы в свою очередь не сможете им воспользоваться. Вместо этого на экране появится сообщение об ошибке, выданное SQL.

Если в таблицу, на которой основан курсор, добавить столбцы, то эти новые столбцы могут не появиться в курсоре, определенном с помощью оператора SELECT *, если перед этим он не будет удален и переопределен. Это связано с тем, что многие диалекты SQL интерпретируют и расширяют краткую форму записи типа звездочки в момент создания курсора. В Transact-SQL, например, расширение краткой формы записи типа звездочка - единственный вид интерпретации, выполняемой в момент создания курсора (а не в момент запроса или модификации). Подробности, связанные с работой вашей системы, можно найти в соответствующих справочных руководствах.

Переопределение курсоров

Поскольку курсоры можно определять в терминах других курсоров, можно, в конце концов, создать целую цепочку зависящих друг от друга курсоров. Точно так же, как настоящая цепочка может оборваться на любой связи, это же может произойти и с цепочкой курсоров. Любой из курсоров в цепочке можно переопределить таким образом, что зависящие от него курсоры потеряют всякий смысл.

В качестве примера рассмотрим три поколения курсоров, полученные из таблицы authors:

SQL:

create view numberl

as select au Iname,

phone

from authors

where zip like 94%

SQL:

select * from numberl

Результат:

au Iname

phone

Bennet

658-

-9932

Green

986-

-7020

Carson

548-

-7723

Stringer

843-

-2991

Straight

834-

-2919

Karsen

534-

-9219

MacFeather

354-

-7128

Dull

836-

-7128

Yokomoto

935-

-4228

White

496-

-7223

Hunter

836-

-7128

Locksley

585-

-4620



SQL:

create view number2

as select au lname, phone

from number1

where au lname like [M-Z]% SQL:

select * from number2 Результат:

au lname phone

Stringer 415 843-2991

Straight 415 834-2919

MacFeather 415 354-7128

Yokomoto 415 935-4228

White 408 496-7223

SQL:

create view питЬегЗ

as select au lname, phone

from number2

where au lname like MacFearther SQL:

select * from питЬегЗ Результат:

au lname phone

MacFeather 415 354-7128

Что произойдет, если переопределить курсор number! на основе других критериев выбора, например почтового кода, начинающегося с 9471 Будет ли по-прежнему доступным курсор питЬегЗ, который зависит от курсора number!? Ответ заключается в том, что все здесь зависит от конкретной реализации. В некоторых системах курсором питЬегЗ можно будет с успехом пользоваться, хотя данные, видимые посредством этого курсора, будут отличаться. При использовании запроса, содержащего ссылку на number! или питЬегЗ, курсор будет интерпретироваться как обычно.

Можно, конечно, переопределить курсор number! таким образом, чтобы использование курсора питЬегЗ стало невозможным. Если бы, например, новая версия number! включала только столбец aujname (без столбца phone), то курсор питЬегЗ уже нельзя было бы использовать в запросе, поскольку он не может получить столбец phone из объекта, от которого он зависит. Однако курсор питЬегЗ по-прежнему существовал бы, а в некоторых системах им можно было бы снова пользоваться путем удаления и повторного создания курсора number!, а также повторной вставки в него столбца phone.

Другими словами, некоторые системы позволяют вам изменять определение промежуточного курсора, не оказывая при этом влияния на зависимые курсоры, если целевой список зависимых курсоров при этом остается допустимым. Если вы нарушите это правило, запрос, содержащий ссылку на неправильный курсор, приведет к появлению сообщения об ошибке.



МОДИФИКАЦИЯ ДАННЫХ ПОСРЕДСТВОМ КУРСОРОВ

Изменение данных посредством курсоров - непростая задача. Важнейшая проблема, как будет здесь продемонстрированно, состоит в том, что SQL иногда не удается однозначно понимать команды, предназначенные для изменения данных в курсоре. Такие изменения не допускаются любой версией SQL. Другими словами, некоторые курсоры являются необновляемыми по своей сути.

Есть и другие курсоры, которые по логике являются обновляемыми, но во многих версиях SQL трактуются как необновляемые. Запрет использования широкого диапазона операторов модификации данных налагает более жесткие ограничения, но в то же время упрошает правила относительно того, что можно и чего нельзя делать. В других реализациях SQL поддерживаются максимальные возможности по изменениям, несмотря на сложности, неизбежно появляющиеся в правилах, касающихся модификации данных.

Перечни операторов модификации данных, которыми разрешено пользоваться в курсорах, отличаются в разных реализациях SQL. Поэтому правила, которые встретятся вам в этой книге, следует воспринимать лишь как общие ориентиры, а за подробностями лучше обратиться к справочным руководствам по своей системе.

Правила в соответствии с ANSI

Стандарт ANSI устанавливает, что курсоры являются только читаемыми (т.е. не модифицируемыми), если оператор CREATE VIEW содержит один из следующих элементов.

DISTINCT в списке выбора.

Выражения (вычисляемые столбцы, функции и т.п.) в списке выбора.

Ссылки на несколько таблиц либо в предложении FROM, либо в подзапросе, либо в предложении UNION.

Ссылки на курсор, который сам по себе не является обновляемым, либо в предложении FROM, либо в подзапросе.

. Предложение GROUP BY или HAVING.

Некоторые диалекты SQL налагают менее жесткие офаничения, чем стандарт ANSI, другие же, наоборот, - более жесткие. Если вас интересуют подробности, обратитесь к своему справочному руководству или поэкспериментируйте. Когда вы пытаетесь модифицировать данные посредством курсора, SQL проверяет, не нарушаются ли при этом имеющиеся ограничения. Если обнаруживается такое нарушение, SQL отвергает соответствующий оператор модификации данных, выдавая сообщение об ошибке.

Чтобы лучше понять смысл этих ограничений, рассмотрим ряд примеров необ-новляемых курсоров. Начнем с ограничения, которое запрещает обновление курсоров со столбцами, полученными в результате вычислений из других столбцов.

Столбец gmsssales в курсоре accounts вычисляется на основе столбцов price и ytd sales из таблицы titles:

SQL:

create view accounts (title, advance, gross sales) as

select title id, advance, price*ytd sales from titles where price > $15 and advance > $5000

В курсоре accounts находятся следующие строки: SQL:

select * from accounts



1 ... 61 62 63 [ 64 ] 65 66 67 ... 105

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика