Переменная indicator используется также, чтобы показывать отбрасываемую строку. Это произойдет если вы вставляете значения символов SQL в главную переменную которая не достаточно длинна чтобы вместить все символы.
Это особая проблема с нестандартным типами данных - VARCHAR и LONG ( смотри Приложению C ). В этом случае, переменная будет заполнена первыми символами строки, а последние символы будут потеряны.
Если используется переменная indicator, она будет установлена в положительное значение, указывающее на длину отбрасываемой части строки, позволяя таким образом вам узнать, сколько символов было потеряно.
В этом случае, Вы можете проверить с помощью просмотра -значение переменной indicator > 0, или < 0.
================ РЕЗЮМЕ =================
Команды SQL вкладываются в процедурные языках, чтобы объединить силы двух подходов. Некоторые дополнительные средства SQL необходимы, чтобы выполнить эту работу. Вложенные команды SQL транслируемые программой, называемой прекомпилятором, в форму пригодную для использования транслятором главного языка, и используемые в этом главном языке, как вызовы процедуры к подпрограммам которые создает прекомпилятор, называются - модулями доступа.
ANSI поддерживает вложение SQL в языки: ПАСКАЛЬ, ФОРТРАН, КОБОЛ, и PL/I.
Другие языки также используются, особенно Си. В попытке кратко описать вложенный SQL, имеются наиболее важные места в этой главе:
n Все вложенные команды SQL начинаются словами EXEC SQL и заканчи ваются способом который зависит от используемого главного языка.
n Все главные переменные доступные в командах SQL, должны быть обья влены в разделе объявлений SQL прежде, чем они будут использованы.
n Всем главным переменным должно предшествовать двоеточие когда они используются в команде SQL.
n Запросы могут сохранять свой вывод непосредственно в главных перем енных, используя предложение INTO, если и только если, они выбирают единственную строку.
n Курсоры могут использоваться для сохранения вывода запроса, и доступа к одной строке в каждый момент времени. Курсоры бывают обьявлеными ( если определяют запрос в котором будут содержаться), открытыми( если выполняют запрос ), и закрытыми ( если удаляют вывод запроса из курсо ра ). Если курсор открыт, команда FETCH, используется чтобы перемещ ать его по очереди к каждой строке вывода запроса.
n Курсоры являются модифицируемыми или только-чтение. Чтобы стать модифицируемым, курсор должен удовлетворять всем критериям кото рым удовлетворяет просмотр; кроме того, он не должен использовать предложений ORDER BY или UNION, которые в любом случае не могут использоваться просмотрами. Не модифицируемый курсор является курсором только-чтение.
n Если курсор модифицируемый, он может использоваться для определе ния, какие строки задействованы вложенными командами UPDATE и DELETE через предложение WHERE CURRENT OF. DELETE или UPDATE должны быть вне той таблицы к которой курсор обращается в запросе.
n SQLCODE должен быть обьявлен как переменная числового типа для каждой программы которая будет использовать вложенный SQL. Его значение установливается автоматически после выполнения каждой команды SQL.
n Если команда SQL выполнена как обычно, но не произвела вывода или ожидаемого изменения в базе данных, SQLCODE = 100. Если команда произвела ошибку, SQLCODE будет равняться некоторому аппаратно определенному отрицательному числу которое описывает ошибку. Впротивном случае,SQLCODE = 0.
n Предложение WHENEVER может использоваться для определения дей ствия которое нужно предпринять когда SQLCODE = 100 (не найдено) или когда SQLCODE равен отрицательному числу ( SQLERROR ).Действием может быть или переход к некоторой определенной метке в программе ( GOTO <label> ) или отсутствие какого-либо действия вооб ще( продолжить). Последнее, установлено по умолчанию.
n Числовые переменные могут также использоваться как переменные indicator. Переменные indicator следуют за другим именами перемен ных в команде SQL, без каких бы то ни было посторонних символов кроме (необязательного) слова INDICATOR.
n Обычно, значение переменной indicator = 0. Если команда SQL пыта ется поместить NULL значение в главную переменную которая использует indicator, indicator будет установлен в отрицательное значение. Этот факт можно использоваться чтобы предотвращать ошибки,и для помечания NULL значений SQL для специальной обработки их в главной программе.
n Переменная indicator может использоваться для вставки NULL значений в команды SQL - INSERT или UPDATE. Она также может принимать положительное значение указывающее на длинну отбрасы ваемой части строки не поместившейся в предельные границы какой нибудь переменной, куда эта строка помещалась.
************ РАБОТА С SQL ***************
Обратите внимание: Ответы для этих упражнений написаны в псевдокодах, являющихся английским языком описания логики, которой должна следовать программа. Это сделано для того чтобы помомочь читателям которые могут быть незнакомы с Паскалем(или любым другим языком). Кроме того это лучше сфокусирует ваше внимание на включемых понятиях, опуская частности того или другого языка. Чтобы непротиворечить нашим примерам, стиль псевдокода будет напоминать Паскаль.
Мы опустим из программ все что не относится напрямую к рассматриваемым вопросам, например, определение устройств ввода-вывода, подключение к базе данных, и так далее. Конечно, имеется много способов чтобы выполнять такие упражнения; и совсем не обязательно что представленые варианты решений являются самыми удачными.
1. Разработайте простую программу которая выберет все комбинации по лей snum и cnum из таблиц Порядков и Заказчиков и выясните, всег да ли предыдущая комбинация такая же как последующая. Если комб инация из таблицы Порядков не найдена в таблице Заказчиков, значе ние поля snum для этой строки будет изменено на удовлетворяющее условию совпадения. Вы должны помнить, что курсор с подзапросом - модифицируем ( ANSI ограничение, также применимо к просмотрам, и что базисная целостность базы данных это не тоже самое что про верка на ошибку( т.е. первичные ключи уникальны, все поля cnums в таблице Порядков правильны, и так далее ). Проверьте раздел обьявлений, и убедитесь что там обьявлены все ис пользуемые курсоры.
2. Предположим, что ваша программа предписывает ANSI запрещение курсоры или просмотры использующие модифицируемые подзапро сы. Как вы должны изменить вышеупомянутую программу?
3. Разработайте программу которая подсказывает пользователям измен ить значения поля city продавца, автоматически увеличивает комисс ионные на .01 для продавца переводимого в Барселону и уменьша ет их на .01 для продавца переводимого в Сан Хосе. Кроме того, продавец находящийся в Лондоне должен потерять .02 из своих ком иссионных, независимо от того меняет он город или нет, в то время как продавец не находящийся в Лондоне должен иметь увеличение комиссионных на .02. Изменение в комиссионных основывающееся на нахождении прода вца в Лондоне, может применяться независимо от того куда тот пер еводится. Выясните могут ли поле city или поле comm содержать NULL зна чения, и обработайте их, как это делается в SQL. Предупреждение! : эта программа имеет некоторые сокращения.