Главная » Просмотр файлов » Мартин Грубер - Понимание SQL

Мартин Грубер - Понимание SQL (991940), страница 47

Файл №991940 Мартин Грубер - Понимание SQL (Мартин Грубер. Понимание SQL) 47 страницаМартин Грубер - Понимание SQL (991940) страница 472015-08-23СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 47)

Затем, вы используете команду FETCH, чтобы извлечь вывод из этого запроса, по однойстроке в каждый момент времени.EXEC SQL FETCH Londonsales INTO :id_num, :salesperson, :loc, :comm;Это выражение переместит значения из первой выбраной строки, в переменные.Другая команда FETCH выводет следующий набор значений. Идея состоит в том, чтобы поместить команду FETCH внутрь цикла, так чтобы выбрав строку, вы могли переместив набор значений из этой строки в переменные, возвращались обратно в циклчтобы переместить следующий набор значений в те же самые переменные.Например, возможно вам нужно, чтобы вывод выдавался по одной строке, спрашивая каждый раз у пользователя, хочет ли он продолжить чтобы увидеть следующую строкуLook_at_more:=True;EXEC SQL OPEN CURSOR Londonsales;while Look_at_more dobeginEXEC SQL FETCH LondonsalesINTO :id_num, :Salesperson, :loc, :comm;writeln (id_num, Salesperson, loc, comm);writeln ('Do you want to see more data? (Y/N)');readln (response);it response = 'N' then Look_at_more:=Falseend;EXEC SQL CLOSE CURSOR Londonsales;В Паскале, знак := означает "является назначенным значением из", в то времякак = еще имеет обычное значение "равно".

Функция writeln записывает ее вывод, изатем переходит к новой строке.Одиночные кавычки вокруг символьных значений во втором writeln и в предложении if ... then — обычны для Паскаля, что случается при дубликатах в SQL.В результате этого фрагмента, Булева переменная с именем Look_at_moreдолжна быть установлена в состояние верно, открыт курсор, и введен цикл. Внутрицикла, строка выбирается из курсора и выводится на экран. У пользователя спрашивают, хочет ли он видеть следующую строку.

Пока он не ответил N (Нет), цикл повторяется, и следующая строка значений будет выбрана.Хотя переменные Look_at_more и ответ должны быть обьявлены как Булева переменная и символьная (char) переменная, соответственно, в разделе обьявленийпеременных в Паскаля, они не должны быть включены в раздел обьявлений SQL, потому что они не используются в командах SQL.Как вы можете видеть, двоеточия перед именами переменных не используютсядля не-SQL операторов. Далее обратите внимание, что имеется оператор CLOSECURSOR соответствующий оператору OPEN CURSOR. Он, как вы поняли, освобождает курсор значений, поэтому запрос будет нужно выполнить повторно с операторомOPEN CURSOR, прежде чем перейти в выбору следующих значений.Это необязательно для тех строк, которые были выбраны запросом после закрытия курсора, хотя это и обычная процедура.Пока курсор закрыт, SQL не следит за тем, какие строки были выбраны.

Если выоткрываете курсор снова, запрос повторно выполняется с этой точки, и вы начинаетевсе сначала.Этот пример не обеспечивает автоматический выход из цикла, когда все строкиуже будут выбраны. Когда у FETCH нет больше строк, которые надо извлекать, онпросто не меняет значений в переменных предложения INTO. Следовательно, еслиданные исчерпались, эти переменные будут неоднократно выводиться с идентичнымизначениями, до тех пор пока пользователь не завершит цикл, введя ответ — N.SQL КОДЫХорошо было бы знать, когда данные будут исчерпаны, так чтобы можно былосообщить об этом пользователю и цикл завершился бы автоматически.

Это — дажеболее важно чем например знать что команда SQL выполнена с ошибкой. Переменная SQLCODE (называемая еще SQLCOD в ФОРТРАНе) предназначена чтобы обеспечить эту функцию. Она должна быть определена как переменная главного языка идолжна иметь тип данных который в главном языке соответствует одному из точныхчисловых типов SQL, как это показано в Приложении B. Значение SQLCODE устанавливается каждый раз, когда выполняется команда SQL.

В основном существуют тривозможности:1. Команда выполнилась без ошибки, но не произвела никакого действия. Дляразличных команд это выглядит по разному:а) Для SELECT, ни одна строка не выбрана запросом.б) Для FETCH, последняя строка уже была выбрана, или ни одной строки невыбрано запросом в курсоре.в) Для INSERT, ни одной строки не было вставлено (подразумевается, что запрос использовался, чтобы сгенерировать значения для вставки, и был отвергнут при попытке извлечения любой строки.г) Для UPDATE и DELETE, ни одна строка не ответила условию предиката, иследовательно никаких изменений сделано в таблице не будет.В любом случае, будет установлен код SQLCODE = 100.2.

Команда выполнилась нормально, не удовлетворив ни одному из выше указанных условий. В этом случае, будет установлен код SQLCOD = 0.3. Команда сгенерировала ошибку. Если это случилось, изменения сделанные кбазе данных текущей транзакцией, будут восстановлены (см. Главу 23).В этом случае будет установлен код SQLCODE = некоторому отрицательномучислу, определяемому проектировщиком. Задача этого числа, идентифицироватьпроблему так точно, насколько это возможно. В принципе, ваша система должна бытьснабжена подпрограммой, которая, в этом случае, должна выполниться, чтобы выдатьдля вас информацию, расшифровывающую значение негативного числа, определенного вашим проектировщиком. В этом случае некоторое сообщение об ошибке будетвыведено на экран или записано в файл протокола, а программа в это время выполнит восстановление изменений для текущей транзакции, отключится от базы данных ивыйдет из нее.ИСПОЛЬЗОВАНИЕ SQLCODE ДЛЯ УПРАВЛЕНИЯ ЦИКЛАМИТеперь мы можем усовершенствовать наш предыдущий пример для выхода изцикла автоматически, при условии что курсор пуст, все строки выбраны, или произошла ошибка:Look_at_more:=True;EXEC SQL OPEN CURSOR Londonsales;while Look_at_more and SQLCODE = O dobeginEXEC SQL FETCH LondonsalesINTO :id_num, :Salesperson, :loc, :comm;writeln (id_num, Salesperson, loc, comm);writeln ('Do you want to see more data? (Y/N)');readln (response);If response = 'N' then Look_at_more:=False;end;EXEC SQL CLOSE CURSOR Londonsales;ПРЕДЛОЖЕНИЕ WHENEVERЭто удобно для выхода при выполненом условии — все строки выбраны.

Но если вы получили ошибку, вы должны предпринять нечто такое, что описано для третьего случая, выше. Для этой цели, SQL предоставляет предложение GOTO. Фактически,SQL позволяет вам применять его достаточно широко, так что программа может выполнить команду GOTO автоматически, если будет произведено определенное значение SQLCODE. Вы можете сделать это совместно с предложением WHENEVER.Имеется кусок из примера для этого случая:EXEC SQL WHENEVER SQLERROR GOTO Error_handler;EXEC SQL WHENEVER NOT FOUND CONTINUE;SQLERROR — это другой способ сообщить, что SQLCODE < 0; а NOT FOUND —это другой способ сообщить, что SQLCODE = 100.

(Некоторые реализации называютпоследний случай еще как — SQLWARNING.)Error_handler — это имя того места в программе, в которое будет перенесеновыполнение программы, если произошла ошибка (GOTO может состоять из одногоили двух слов). Такое место определяется любым способом, соответствующим дляглавного языка, например, с помощью метки в Паскале или имени раздела или именипараграфа в КОБОЛЕ (в дальнейшем мы будем использовать термин — метка).Метка более удачно идентифицирует стандартную процедуру распространяемуюпроектировщиком для включения во все программы.CONTINUE не делает чего-то специального для значения SQLCODE. Оно такжеявляется значением по умолчанию, если вы не используете команду WHENEVER, определяющую значение SQLCODE.

Однако, эти неактивные определения дают вамвозможность переключаться вперед и назад, выполняя и не выполняя действия, вразличных точках (метках) вашей программы. Например, если ваша программа включает в себя несколько команд INSERT, использующих запросы, которые реальнодолжны производить значения, вы могли бы напечатать специальное сообщение илисделать что-то такое, что поясняло бы, что запросы возвращаются пустыми и никакиезначения не были вставлены. В этом случае, вы можете ввести следующее:EXEC SQL WHENEVER NOT FOUND GOTO No_rows;No_rows — это метка в некотором коде, содержащем определенное действие. Сдругой стороны, если вам нужно сделать выборку в программе позже, вы можете ввести следующее в этой точке:EXEC SQL WHENEVER NOT FOUND CONTINUE;что бы выполнение выборки повторялось до тех пор, пока все строки не будут извлечены, что является нормальной процедурой, не требующей специальной обработки.МОДИФИЦИРОВАНИЕ КУРСОРОВКурсоры могут также быть использованы, чтобы выбирать группу строк из таблицы, которые могут быть затем модифицированы или удалены одна за другой.

Это дает вам возможность обходить некоторые ограничения предикатов, используемых вкомандах UPDATE и DELETE. Вы можете ссылаться на таблицу, задействованную впредикате запроса курсора или любом из его подзапросов, которые вы не можете выполнить в предикатах самих этих команд. Как подчеркнуто в Главе 16, стандарт SQLотклоняет попытку удалить всех пользователей с рейтингом ниже среднего, в следующей форме:EXEC SQL DELETE FROM CustomersWHERE rating < (SELECT AVG (rating)FROM Customers);Однако, вы можете получить тот же эффект, используя запрос для выбора соответствующих строк, запомнив их в курсоре, и выполнив DELETE с использованиемкурсора. Сначала вы должны обьявить курсор:EXEC SQL DECLARE Belowavg CURSOR FORSELECT *FROM CustomersWHERE rating < (SELECT AVG (rating)FROM Customers);Затем вы должны создать цикл, чтобы удалить всех заказчиков выбранных курсором:EXEC SQL WHENEVER SQLERROR GOTO Error_handler;EXEC SQL OPEN CURSOR Belowavg;while not SOLCODE = 100 dobeginEXEC SOL FETCH Belowavg INTO :a, :b, :c, :d, :e;EXEC SOL DELETE FROM CustomersWHERE CURRENT OF Belowavg;end;EXEC SOL CLOSE CURSOR Belowavg;Предложение WHERE CURRENT OF означает, что DELETE применяется к строке, которая в настоящее время выбрана курсором.

Здесь подразумевается, что и курсор, и команда DELETE ссылаются на одну и ту же таблицу, и следовательно, чтозапрос в курсоре — это не обьединение.Курсор должен также быть модифицируемым. Являясь модифицируемым, курсор должен удовлетворять тем же условиям что и представления (см. Главу 21). Кроме того, ORDER BY и UNION, которые не разрешены в представлениях, в курсорах —разрешаются, но предохраняют курсор от модифицируемости. Обратите внимание ввышеупомянутом примере, что мы должны выбирать строки из курсора в набор переменных, даже если мы не собирались использовать эти переменные.

Характеристики

Тип файла
PDF-файл
Размер
1,41 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6510
Авторов
на СтудИзбе
302
Средний доход
с одного платного файла
Обучение Подробнее