В Паскале, знак : = означает - " является назначенным значением из ", в то время как = еще имеет обычное значение " равно ". Функция 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 в ФОРТРАНе ) предназначена чтобы обеспечить эту функцию. Она должна быть определена как переменная главного языка и должна иметь тип данных который в главном языке соответствует одному из точных числовых типов SQL, как это показано в Приложении B.
Значение SQLCODE устанавливается каждый раз, когда выполняется команда SQL. В основном существуют три возможности:
1. Команда выполнилась без ошибки, но не произвела никакого
действия. Для различных команд это выглядит по разному:
а) Для SELECT, ни одна строка не выбрана запросом.
б) Для FETCH, последняя строка уже была выбрана, или ни
одной строки не выбрано запросом в курсоре.
в) Для INSERT, ни одной строки не было вставлено ( подразуме-
вается что запрос использовался чтобы сгенерировать значе-
ния для вставки, и был отвергнут при попытке извлечения лю-
бой строки.
г) Для UPDATE и DELETE, ни одна строка не ответила усло-
вию предиката, и следовательно никаких изменений сделано
в таблице не будет.
В любом случае, будет установлен код SQLCODE = 100.
2. Команда выполнилась нормально, не удовлетворив ни одному из выше указанных условий. В этом случае, будет установлен код
SQLCOD = 0.
3. Команда сгенерировала ошибку. Если это случилось, изменения сделанные к базе данных текущей транзакцией, будут восстанов лены( см. Главу 23 ).
В этом случае будет установлен код SQLCODE = некоторому от рицательному числу, определяемому проектировщиком. Задача это го числа, идентифицировать проблему, так точно насколько это во зможно. В принципе, ваша система должна быть снабжена подп рограммой, которая в этом случае, должна выполниться чтобы вы дать для вас информацию расшифровывающее значение негатив ного числа определенного вашим проектировщиком. В этом случае некоторое сообщение об ошибке будет выведено на экран или за писано в файл протокола, а программа в это время выполнит вос становление изменений для текущей транзакции, отключится от базы данных и выйдет из нее. Теперь мы можем усовершенствовать наш предыдущий пример для выхода из цикла автоматически, при условии что курсор пуст, все строки выбраны, или произошла ошибка: