|
Программирование >> Руководство по sql
Разборка курсора Процесс реализации запроса к какому-либо курсору с его запомненным определением и преобразования его в запрос к таблицам, лежащим в основе этого курсора, называется разборкой курсора. В ходе этого процесса может возникнуть несколько проблем. Если какие-то таблицы, курсоры или столбцы, лежащие в основе курсора, были удалены или переименованы, или если в результате реструктуризации возникли несовместимости Mexiy типами данных, система не сможет интерпретировать курсор, а вы в свою очередь не сможете им воспользоваться. Вместо этого на экране появится сообщение об ошибке, выданное SQL. Если в таблицу, на которой основан курсор, добавить столбцы, то эти новые столбцы могут не появиться в курсоре, определенном с помощью оператора SELECT *, если перед этим он не будет удален и переопределен. Это связано с тем, что многие диалекты SQL интерпретируют и расширяют краткую форму записи типа звездочки в момент создания курсора. В Transact-SQL, например, расширение краткой формы записи типа звездочка - единственный вид интерпретации, выполняемой в момент создания курсора (а не в момент запроса или модификации). Подробности, связанные с работой вашей системы, можно найти в соответствующих справочных руководствах. Переопределение курсоров Поскольку курсоры можно определять в терминах других курсоров, можно, в конце концов, создать целую цепочку зависящих друг от друга курсоров. Точно так же, как настоящая цепочка может оборваться на любой связи, это же может произойти и с цепочкой курсоров. Любой из курсоров в цепочке можно переопределить таким образом, что зависящие от него курсоры потеряют всякий смысл. В качестве примера рассмотрим три поколения курсоров, полученные из таблицы authors: SQL: create view numberl
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
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |