Скачиваний:
20
Добавлен:
01.04.2014
Размер:
180.74 Кб
Скачать

Into :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: = False

end;

EXEC SQL CLOSE CURSOR Londonsales;

ИСПОЛЬЗОВАНИЕ SQL С ДРУГИМ ЯЗЫКОМ (ВЛОЖЕННЫЙ SQL) 343

______________________________________________________________________

В Паскале, знак : = означает - " является назначенным значением из ",

в то время как = еще имеет обычное значение " равно ". Функция

writeln записывает ее вывод, и затем переходит к новой строке.

Одиночные кавычки вокруг символьных значений во втором writeln и в

предложении if ... then - обычны для Паскаля, что случается при

дубликатах в SQL.

В результате этого фрагмента, Булева переменная с именем Look_at

_more должна быть установлена в состояние верно, открыт курсор, и

введен цикл. Внутри цикла, строка выбирается из курсора и выводится

на экран. У пользователя спрашивают, хочет ли он видеть следующую

строку. Пока он не ответил N ( Нет ), цикл повторяется, и следующая

строка значений будет выбрана.

Хотя переменные Look_at_more и ответ должны быть обьявлены как

Булева переменная и символьная(char) переменная, соответственно, в

разделе обьявлений переменных в Паскаля, они не должны быть вклю-

чены в раздел обьявлений SQL, потому что они не используются в ко-

мандах SQL.

Как вы можете видеть, двоеточия перед именами переменных не ис-

пользуются для не-SQL операторов. Далее обратите внимание, что имее-

тся оператор CLOSE CURSOR соответствующий оператору OPEN

CURSOR. Он, как вы поняли, освобождает курсор значений, поэтому

запрос будет нужно выполнить повторно с оператором OPEN CURSOR,

прежде чем перейти в выбору следующих значений.

Это необязательно для тех строк которые были выбраны запросом пос-

ле закрытия курсора, хотя это и обычная процедура.

Пока курсор закрыт, SQL не следит за тем, какие строки были выбраны.

Если вы открываете курсор снова, запрос повторно выполняется с этой

точки, и вы начинаете все сначала.

Этот пример не обеспечивает автоматический выхода из цикла, когда

все строки уже будут выбраны. Когда у FETCH нет больше строк кото-

рые надо извлекать, он просто не меняет значений в переменных пред-

ложения INTO. Следовательно, если данные исчерпались, эти перемен-

ные будут неоднократно выводиться с идентичными значениями, до тех

пор пока пользователь не завершит цикл, введя ответ - N.

============== SQL КОДЫ ===================

Хорошо было бы знать, когда данные будут исчерпаны, так чтобы можно

было сообщить об этом пользователю и цикл завершился бы автоматически.

Это - даже более важно чем например знать что команда SQL выполнена

с ошибкой. Переменная SQLCODE ( называемая еще SQLCOD в

ФОРТРАНе ) предназначена чтобы обеспечить эту функцию. Она дол-

344 ПОНИМАНИЕ SQL

______________________________________________________________________

ГЛ. 25

жна быть определена как переменная главного языка и должна иметь

тип данных который в главном языке соответствует одному из точных

числовых типов SQL, как это показано в Приложении B.

Значение SQLCODE устанавливается каждый раз, когда выполняется

команда SQL. В основном существуют три возможности:

1. Команда выполнилась без ошибки, но не произвела никакого

действия. Для различных команд это выглядит по разному:

а) Для SELECT, ни одна строка не выбрана запросом.

б) Для FETCH, последняя строка уже была выбрана, или ни

одной строки не выбрано запросом в курсоре.

в) Для INSERT, ни одной строки не было вставлено ( подразуме-

вается что запрос использовался чтобы сгенерировать значе-

ния для вставки, и был отвергнут при попытке извлечения лю-

бой строки.

г) Для UPDATE и DELETE, ни одна строка не ответила усло-

вию предиката, и следовательно никаких изменений сделано

в таблице не будет.

В любом случае, будет установлен код SQLCODE = 100.

2. Команда выполнилась нормально, не удовлетворив ни одному из

выше указанных условий. В этом случае, будет установлен код

SQLCOD = 0.

3. Команда сгенерировала ошибку. Если это случилось, изменения

сделанные к базе данных текущей транзакцией, будут восстанов-

лены( см. Главу 23 ).

В этом случае будет установлен код SQLCODE = некоторому от-

рицательному числу, определяемому проектировщиком. Задача это-

го числа, идентифицировать проблему, так точно насколько это во-

зможно. В принципе, ваша система должна быть снабжена подп-

рограммой, которая в этом случае, должна выполниться чтобы вы-

дать для вас информацию расшифровывающее значение негатив-

ного числа определенного вашим проектировщиком. В этом случае

некоторое сообщение об ошибке будет выведено на экран или за-

писано в файл протокола, а программа в это время выполнит вос-

становление изменений для текущей транзакции, отключится от ба-

зы данных и выйдет из нее. Теперь мы можем усовершенствовать

ИСПОЛЬЗОВАНИЕ SQL С ДРУГИМ ЯЗЫКОМ (ВЛОЖЕННЫЙ SQL) 345

______________________________________________________________________

ИСПОЛЬЗОВАНИЕ SQLCODE ДЛЯ УПРАВЛЕНИЯ ЦИКЛАМИ

наш предыдущий пример для выхода из цикла автоматически, при ус-

ловии что курсор пуст, все строки выбраны, или произошла ошибка:

Look_at_more: = lhe;

EXEC SQL OPEN CURSOR Londonsales;

while Look_at_more

and SQLCODE = O do

begin

EXEC SQL FETCH London$ales

Соседние файлы в папке ПОНИМАНИЕ SQL