|
Программирование >> Реляционные базы данных
7.1.11 Курсоры прокрутки Пклешиш тип режима курсора - выбор способа персмсшения но кортежам отношения. Принятый по )молча>и1Ю и наиболее распространенный способ -начать с нач;У1а и выбирать кортежи по порядку до кониа. Но сушесгвуют и другие nopajKH выбора кортежеС! и кортежи можно сканиронягь несколько раз до закрытия Kypcop;L Зял нспилыпвання гаки. ; режимов необ.чодимо выпол1И1ть следующее: 1. При оинсинип курсора перед ключевым с.повом CURSOR стлпится ключс-1юс СЛ01Ю SCROLL. Оно означает, что система SQL люжет использовать курсор иначе, чем просто двигать его вперед по порядку кортежей. 2. В пред!1С>жснин FETCH за ключевым словом FETCH стоит одно из слслуго-ши.\ к-дючсвых слов, указываю1ии.\. где именно искать нужный кортеж: (a) NEXT 1МИ PRIOR применяется для папучения следующего или предыдущего по порядку кортежа относительно текущей позииии курсора: NEXT принимается 1ю умолчанию, еслн не задан никакой другой режим: (b) FIRST luiii LAST используется лля получения первого или последнего по порядку кортежа; (c) RELATIVE, за которым следует положительное или отрицательное на-тур;ц1ьнос чното. указывает на сколько кортежей продвинуться вперед (при положительном числе) илн назад (при отрицательном): например: RELATIVE 1 - это синоним NEXT, и RELATIVE-! - синоним PRIOR; (d) ABSOLUTE, за которым следует папожнтельное или отрицательное натуральное число, указывает позицию нужного кортежа, считая с начала (при положительном числе) шн с конца (при отрицательном): например: ABSOLUTE 1 - это синоним FIRST, а ABSOLUTE-! - синоним LAST. Пример 7.9. Перепишем функцию на рис. 7.5 так, чтобы начать с последнего кортежа и двигаться по списку кортежей. Сначала нуж ю объявить курсор execCursor перемещаемым, добавив в строку (6) киючевое слово SCROLL: 6) EXEC SQL DECLARE execCursor SCROLL CURSOR FOR 7) SELECT netWorth FROM MovieExec; Необхоаимо также ншгщщровать выбор кортежей с помощью предложения FETCH LAST н применить в цикле FETCH PRIOR. Цикл на строках (9) - (15) изменяется следующим образом: EXEC SQL FETCH LAST FROM execCursor INTO worth; while(1) { /* TO же самое, что и в строках (11) - (15) */ EXEC SQL FETCH PRIOR FROM execCursor INTO worth, He следует думать, что л>чще читать кортеж и порялкс, обратном тому, в котором пх lenepiipyeT запюс SELECT netWorth FROM MovieExec Фактически это может обойтись системе дороже, поскапьку все кортежи могуг быть построены и упорядочены перед первым выбо1Ю\ нз execCursor. D 7-1.12 Динамический SQL Рассмотренная выше мо.аель SQL, встроенного в главный язык, состояла из особых згтросов н команд SQL внутри написанной на главном языке программы. Однако есть более обшии способ погружения SQL в другой язык. Сами SOL-onepa-торы MOOT вычисляться главным языком. Они неизвестны во время компиляини, и поэтому их ие может обрабатывать ирепроисссор SQL или компилятор главного языка. Такую ситуацию иллюстрирует программа, которая требует от пользователя запрос, читает его и выполняет. Пример подобной программы - иитерп)етатор ad hoc запросов SQL, предполагапитйся о главе 5. Интерпретаторы этого типа есть во всех коммерческих системах SQL. Если запросы читаются и выполняются л реальном времени, компиляции не происходит. Запрос должен быть выделен синтаксически, и система SQL должна найти способ его выполнения немедленно после его прочтения. Программа главного языка должна указывать системе SQL, какую строку читать в данный момент, переводить ее в выполнимый оператор SQL и выполнять этот оператор. Эти шаги выполняются двумя операторами динамического SQL: \. EXEC SQL PREPARE, за которым следуют SQL-переменная К ключевое слово FROM и переменная главного языка или выражение типа символьной строки. Этот оператор превращает строку в SQL-предложение, которое становится значением переменной V. Предполагается, что SQL-п)eдлoжc-нне синтаксически П анализ11ровано и системой SQL найден хороший путь его выполнения, но предложение ие выполнено. 2. EXEC SQL EXECUTE, за которым следует SQL-переменная типа V из пункта (1). от оператор реализует выполнение SQL-прелложения, обозначенного переменной V. Оба шага можно соединить в один с помошью оператора EXEC SQL EXECUTE IMMEDIATE за которым следует разделяемая переменная или выражение со значением в виде строки. Недостаток такого объединения проявляется тог.ча, когда предложение формулируется один раз, а выполняется многократно. При применении EXECUTE IMMEDIATE приходится подготавливать предложение при каждом его выполнении, вместо того чтобы сделать это один раз. Пример 7.10. На рис. 7.7 дано краткое описание программы С, которая считывает текст из стандартного ввода в переменную query, готовит и выполняет ею. 1) void readOueryO { 2) EXEC SQL BEGIN DECLARE SECTION, 3) Char *query; 4) EXEC SQL END DECLARE SECTION: 5) / потребовать у пользователя запрос, выделить пространство и установить разделяемую переменную :query на пераый символ запроса */ 6) EXEC SQL PREPARE SQLquery FROM .query; 7) EXEC SQL EXECUTE SQLquery; ) Рис. 7.7. Подготовка и выполнение зопросо диноАдического SQL Переменная SQLquery тыка SQL содержит noдгoтoвлeнны5 запрос. Поскольку запрос выполняется только ояин раз строки (6) и (7) рис. 7.7 можно заменить единстве!П1 ым оператором EXEC SQL EXECUTE IMMEDIATE rquery; □ 7.1.13 Упражнения к разделу 7.1 Упрожнение 7.1.1. Запишите перечисленные ниже встроенные запросы SQL, основанные на схеме БД упражнения 4.L1; Proc)tJCt(iTiaker. model, type) PC(iTiodei, speed, ram, hd. cd. price) Laptop(model, speed, ram. hd, screen, price) Printer(model color, type, price) Можно использовать любой известный вам главный язык, а детали программирования на нем заменить ясными комментариями. *а) Запросите у пользователя иену и найдите ПК, цена которое наиболее близка к цене названной пользователем. Напечатайте производителя, номер модели и скорость этого компьютера. Ь) Запросите у пользователя минимальные приемлемые пля него значения скорости. RAM, размера жесткого диска и 5азмера экрана Найдите ПК-блокноты, удовлетворяющие этим требованиям Напечатайте их спецификацию (все атрибуты laptop) н производителя. !с) Запросите у пользователя имя производителя. Напечатайте специфика цию всех его продуктов, т.е. номер модели, тип и все атрибуты любого отношения, подходящего для данного типа. !! d) Запросите у пользователя бюджет (общую иену ПК и принтера). Найдите самую дешевую систему (ПК с принтером), которая находится в рамках этого бюджета, облааает минимальной скоростью, но желательно с цветным принтером. Напечатайте номера моделей выбранной системы. е) Запросите у пользователя имя производителя, номер модели, скорость, RAM, размер жесткого диска, скорость CD и цену нового ПК. Убедитесь, ис существует ли уже ПК с таки.м номером модели. Если сушествует, напечатайте предупреждение: в противном случае введите i нформаи1-1Ю в отношения Product и PC. *! f) Уменьшите иену всех старых ПК на 100 дол Убедитесь, что во время выполнения вашей программы не понизилась цена ни одного гювого колшьютера Упражнение 7.1.2. Запишите перечисленньЕе ниже встроенные запросы SQL, основанные на схеме БД упражнения 4.1 3 Classes(cl8ss, type, country, numGuns, bore, displacement) Ships(name, class, launched) BattlBS(name, date) Outcomes(ship, battle, result) a) Огневая мошь корабля прямо пропорциональна числу орудий, умноженному на куб калибра отуднй. Найдите класс с наибольшей огневой юшью. !Ь) ЗлПТосите у пользователя название сражения. Найдите страны, Ешадею-щне кораблями, участвовавшими в этом сражении Напечатайте название страны, наибольшее число котаблей которой было потоплено, и название
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |