|
Программирование >> Хронологические базы данных
Если в таблице поставщиков строк, удовлетворяющих условию WHERE, найдено не будет, система присвоит переменной SQLSTATE значение 02000. Оператор DELETE. Удалить сведения обо всех поставках для поставщиков из города, название которого помещено в базовую переменную CITY. EXEC SQL DELETE FROM SP WHERE :CITY = ( SELECT CITY FROM S WHERE S.S# = SP.S# ) ; И снова, если нет строк, удовлетворяющих условию WHERE, переменной SQLSTATE присваивается значение 02000. Также обратите внимание на вложенный подзапрос (на этот раз в предложении WHERE). Операции, использующие курсоры Теперь перейдем к вопросу о выборках на уровне множеств, т.е. о выборках не одной строки, как это было в случае однострочного оператора SELECT, а множества с произвольным количеством строк. Как указывалось ранее, в этой ситуации потребуется поочередный доступ к строкам выбранного множества, а механизмом такого доступа будет курсор. На рис. 4.4 этот процесс схематически проиллюстрирован на примере выборки информации о поставщиках (столбцы Si, SNAME и STATUS) для всех поставщиков из города, название которого задается в базовой переменной Y. EXEC SQL DECLARE X CURSOR FOR /* определить курсор X */ SELECT S.S#, S.SNAME, S.STATUS FROM S WHERE S.CITY = :Y ORDER BY S# ASC ; EXEC SQL OPEN X; /* выполнить запрос */ DO <для всех строк S, доступных через Х> ; EXEC SQL FETCH X INTO :S#, :SNAME, :STATUS ; /* выбрать следующего поставщика */ END ; EXEC SQL CLOSE X ; /* закрыть курсор X */ Рис. 4.4. Выборка несколъкга строк Пояснение. Оператор DECLARE X CURSOR... определяет курсор с именем X, связанный с таб.чичны.м выражением (т.е. выражением, которое вычисляет таблицу). Табличное выражение определяется оператором SELECT, который является частью всего выражения DECLARE. Причем указанное табличное выражение не вычисляется в этом месте программы, поскольку оператор DECLARE CURSOR - чисто декларативный. Табличное выражение вычисляется только при открытии курсора (оператор OPEN X). Далее для выборки строк из результирующего множества, по одной за один раз, используется оператор FETCH, присваивающий извлеченные значения базовым переменным в соответствии со спецификациями в предложении INTO. (Для простоты базовым переменным присвоены имена, совпадающие с именами соответствующих столбцов таблицы базы данных. Обратите внимание, что в операторе SELECT при определении курсора нет своего предложения INTO.) Поскольку в результирующем наборе потенциально присутствует большое количество строк, оператор FETCH обычно используется в некотором цикле (оператор DO.. .END в языке PL/I). Цикл будет повторяться до тех пор, пока не закончатся строки в результирующем наборе. При выходе из цикла курсор X закрывается (оператор CLOSE X). А теперь рассмотрим курсоры и операции с ними более подробно. Курсор определяется с помощью оператора DECLARE CURSOR, общий вид которого следующий. EXEC SQL DECLARE <имя курсора> CURSOR FOR <та6личное выражение> [ <упорядочение> ] ; Для краткости несколько необязательных спецификаций в этом определении не указаны. Здесь параметр <имя курсора> - это имя определяемого курсора. Полное определение табличного выражения, помещаемого в параметр <та6личное выражение>, дано в приложении А. Необязательный параметр определения сортировки результата выборки <упорядочение> имеет следующий формат. ORDER BY <список элеиентов> Здесь параметр <список элементов> содержит список перечисленных через запятую элементов, по которым должно быть выполнено упорядочение извлекаемых строк. Список элементов не должен быть пустым, в каждом элементе списка должно содержаться имя столбца (заметьте, не уточненное), после которого может следовать необязательное служебное слово ASC (по возрастанию) или DESC (по убыванию). При опускании служебного слова по умолчанию принимается порядок по возрастанию (ASC). Замечание. Дадим определение термину список элементов, перечисленных через запятую (commalist). Пусть <xyz> обозначает произвольную синтаксическую категорию (т.е. то, что находится слева от некоторого правила вывода в нотации BNF). Тогда выражение <xyz commalisf> (или <список xyz>) обозначает последовательность из нуля или более элементов <xyz>, в которой каждая пара элементов <xyz> разделена запятой (и, может быть, одним или несколькими пробелами). Обратим ваше внимание на то, что сокращение <список ...> будет широко использоваться в приводимых далее синтаксических правилах (причем во всех синтаксических правилах, а не только в правилах языка SQL). Как утверждалось ранее, оператор DECLARE CURSOR- декларативный, а не выполняемый. Он предназначен для объявления курсора с определенным именем и постоянно связанного с ним табличного выражения и типа упорядочения. Табличное выражение может включать ссылки на базовые переменные. Программа может содержать любое количество операторов DECLARE CURSOR, каждый из которых, конечно, предназначен для определения разных курсоров. Для работы с курсорами существует три выполняемых оператора: OPEN, FETCH и CLOSE. Оператор OPEN имеет следующий формат. EXEC SQL OPEN <имя курсора>; Он предназначен для открытия или активизации указанного курсора (который в данный момент не должен быть открыт). В результате его выполнения вычисляется связанное с этим курсором табличное выражение (причем для всех базовых переменных, упоминаемых в этом выражении, используются текущие значения). В результате идентифицируется определенное множество строк, которое становится текущим активным набором для данного курсора. Курсор также устанавливает исходную позицию в этом активном наборе, а именно - позицию перед его первой строкой. (Активные наборы всегда рассматриваются как упорядоченные, а значит, и понятие позиции имеет для них смысл. Порядок определяется предложением ORDER BY; если же оно отсутствует, порядок строк устанавливается системой.) Оператор FETCH имеет следующий формат. EXEC SQL <имя курсора> INTO <список ссылок на базовые переменные> ; Он служит для перемещения позиции указанного курсора (который должен быть уже открыт) к следующей строке в его активном наборе с последующим присвоением значений столбцов этой строки базовым переменным, указанным в предложении INTO. Если при выполнении оператора FETCH следующей строки нет, то никакие данные не выбираются и переменной SQLSTATE присваивается значение 02000. Оператор CLOSE имеет следующий формат. EXEC SQL CLOSE <имя курсора> ; Он служит для закрытия (деактивизации) указанного курсора (который должен быть в данный момент открыт). После его выполнения у курсора уже не будет активного набора. Однако в дальнейщем курсор вновь может быть открыт; при этом он опять получит активный набор - возможно, уже не такой, как раньще (в частности, если значения указанных в объявлении курсора базовых переменных к текущему моменту были изменены). Заметьте, что изменение этих переменных при открытом курсоре не окажет влияния на его активный набор. Есть еще два оператора, в которых могут использоваться ссылки на курсоры, - это CURRENT-формы операторов UPDATE и DELETE. Если курсор (скажем, X) в данный момент позиционирован на определенную строку, то можно обновить или удалить эту текущую строку курсора X , т.е. строку, на которую курсор X в данный момент позиционирован, как, например, показано ниже. EXEC SQL UPDATE S SET STATUS = STATUS + :RAISE WHERE CURRENT OF X ; Сами no себе множества, конечно, не являются упорядоченными (глава 5), так что активный набор - это на самом деле не множество как таковое. Его лучше представлять в виде упорядоченного списка или массива (строк).
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |