- •Is 'Current Customer Orders';
- •Is 'Order #';
- •Values ( :id_num, :salesperson, :loc, :comm)
- •Values (:id_num, :salesperson, :loc, :comm);
- •Values (:id_num, :salesperson, :loc, :comm);
- •Into :id_num, :salesperson, :loc, :comm
- •Into :salesnum
- •Into :id_num, :Salesperson, :loc, :comm;
- •Into :id_num, :Salesperson, :loc, :comm;
- •Into :id_num, :salesperson, :loc, :comm;
- •Into :id_num, :salesperson,
- •Values (:Id_num, :salesperson, :loc:i_a, :comm:i_b);
Values (:Id_num, :salesperson, :loc:i_a, :comm:i_b);
Переменная indicator используется также, чтобы показывать отбрасываемую
строку. Это произойдет если вы вставляете значения символов SQL в глав-
ную переменную которая не достаточно длинна чтобы вместить все символы.
Это особая проблема с нестандартным типами данных - VARCHAR и LONG
( смотри Приложению C ). В этом случае, переменная будет заполнена
ИСПОЛЬЗОВАНИЕ SQL С ДРУГИМ ЯЗЫКОМ ( ВЛОЖЕННЫЙ SQL) 353
______________________________________________________________________
первыми символами строки, а последние символы будут потеряны.
Если используется переменная indicator, она будет установлена в положи-
тельное значение, указывающее на длину отбрасываемой части строки, по-
зволяя таким образом вам узнать, сколько символов было потеряно.
В этом случае, Вы можете проверить с помощью просмотра -значение пере-
менной indicator > 0, или < 0.
================ РЕЗЮМЕ =================
Команды SQL вкладываются в процедурные языках, чтобы объединить си-
лы двух подходов. Некоторые дополнительные средства SQL необходимы,
чтобы выполнить эту работу. Вложенные команды SQL транслируемые пр-
ограммой, называемой прекомпилятором, в форму пригодную для исполь-
зования транслятором главного языка, и используемые в этом главном яз-
ыке, как вызовы процедуры к подпрограммам которые создает прекомпи-
лятор, называются - модулями доступа.
ANSI поддерживает вложение SQL в языки: ПАСКАЛЬ, ФОРТРАН,
КОБОЛ, и PL/I.
Другие языки также используются, особенно Си. В попытке кратко опис-
ать вложенный SQL, имеются наиболее важные места в этой главе:
* Все вложенные команды SQL начинаются словами EXEC SQL и заканчи-
ваются способом который зависит от используемого главного языка.
* Все главные переменные доступные в командах SQL, должны быть обья-
влены в разделе объявлений SQL прежде, чем они будут использованы.
* Всем главным переменным должно предшествовать двоеточие когда они
используются в команде SQL.
* Запросы могут сохранять свой вывод непосредственно в главных перем-
енных, используя предложение INTO, если и только если, они выбирают
единственную строку.
* Курсоры могут использоваться для сохранения вывода запроса, и доступа
к одной строке в каждый момент времени. Курсоры бывают обьявлеными
( если определяют запрос в котором будут содержаться), открытыми( если
выполняют запрос ), и закрытыми ( если удаляют вывод запроса из курсо-
ра ). Если курсор открыт, команда FETCH, используется чтобы перемещ-
ать его по очереди к каждой строке вывода запроса.
354 ПОНИМАНИЕ SQL
______________________________________________________________________
ГЛ. 25
* Курсоры являются модифицируемыми или только-чтение. Чтобы стать
модифицируемым, курсор должен удовлетворять всем критериям кото-
рым удовлетворяет просмотр; кроме того, он не должен использовать
предложений ORDER BY или UNION, которые в любом случае не
могут использоваться просмотрами. Не модифицируемый курсор явля-
ется курсором только-чтение.
* Если курсор модифицируемый, он может использоваться для определе-
ния, какие строки задействованы вложенными командами UPDATE и
DELETE через предложение WHERE CURRENT OF.
DELETE или UPDATE должны быть вне той таблицы к которой кур-
сор обращается в запросе.
* SQLCODE должен быть обьявлен как переменная числового типа для
каждой программы которая будет использовать вложенный SQL. Его
значение установливается автоматически после выполнения каждой
команды SQL.
* Если команда SQL выполнена как обычно, но не произвела вывода или
ожидаемого изменения в базе данных, SQLCODE = 100. Если команда
произвела ошибку, SQLCODE будет равняться некоторому аппаратно-
определенному отрицательному числу которое описывает ошибку.
В противном случае, SQLCODE = 0.
* Предложение WHENEVER может использоваться для определения дей-
ствия которое нужно предпринять когда SQLCODE = 100 (не найдено)
или когда SQLCODE равен отрицательному числу ( SQLERROR ).
Действием может быть или переход к некоторой определенной метке в
программе ( GOTO <label> ) или отсутствие какого-либо действия вооб-
ще( продолжить). Последнее, установлено по умолчанию.
* Числовые переменные могут также использоваться как переменные
indicator. Переменные indicator следуют за другим именами перемен-
ных в команде SQL, без каких бы то ни было посторонних символов
кроме (необязательного) слова INDICATOR.
* Обычно, значение переменной indicator = 0. Если команда SQL пыта-
ется поместить NULL значение в главную переменную которая испо-
льзует indicator, indicator будет установлен в отрицательное значение.
Этот факт можно использоваться чтобы предотвращать ошибки, и для
ИСПОЛЬЗОВАНИЕ SQL С ДРУГИМ ЯЗЫКОМ ( ВЛОЖЕННЫЙ SQL ) 355
______________________________________________________________________
помечания NULL значений SQL для специальной обработки их в глав-
ной программе.
* Переменная indicator может использоваться для вставки NULL значе-
ний в команды SQL - INSERT или UPDATE. Она также может
принимать положительное значение указывающее на длинну отбрасы-
ваемой части строки не поместившейся в предельные границы какой-
нибудь переменной, куда эта строка помещалась.
356 ПОНИМАНИЕ SQL
______________________________________________________________________
ГЛ. 25
************ РАБОТА С SQL ***************
Обратите внимание: Ответы для этих упражнений написаны в псевдоко-
дах, являющихся английским языком описания логики, которой должна
следовать программа. Это сделано для того чтобы помомочь читателям
которые могут быть незнакомы с Паскалем(или любым другим языком).
Кроме того это лучше сфокусирует ваше внимание на включемых поня-
тиях, опуская частности того или другого языка. Чтобы непротиворечить
нашим примерам, стиль псевдокода будет напоминать Паскаль.
Мы опустим из программ все что не относится напрямую к рассматри-
ваемым вопросам, например, определение устройств ввода-вывода, под-
ключение к базе данных, и так далее. Конечно, имеется много способов
чтобы выполнять такие упражнения; и совсем не обязательно что пред-
ставленые варианты решений являются самыми удачными.
1. Разработайте простую программу которая выберет все комбинации по-
лей snum и cnum из таблиц Порядков и Заказчиков и выясните, всег-
да ли предыдущая комбинация такая же как последующая. Если комб-
инация из таблицы Порядков не найдена в таблице Заказчиков, значе-
ние поля snum для этой строки будет изменено на удовлетворяющее
условию совпадения. Вы должны помнить, что курсор с подзапросом -
модифицируем ( ANSI ограничение, также применимо к просмотрам,
и что базисная целостность базы данных это не тоже самое что про-
верка на ошибку( т.е. первичные ключи уникальны, все поля cnums в
таблице Порядков правильны, и так далее ).
Проверьте раздел обьявлений, и убедитесь что там обьявлены все ис-
пользуемые курсоры.
2. Предположим, что ваша программа предписывает ANSI запрещение
курсоры или просмотры использующие модифицируемые подзапро-
сы. Как вы должны изменить вышеупомянутую программу?
3. Разработайте программу которая подсказывает пользователям измен-
ить значения поля city продавца, автоматически увеличивает комисс-
ИСПОЛЬЗОВАНИЕ SQL С ДРУГИМ ЯЗЫКОМ ( ВЛОЖЕННЫЙ SQL) 357
______________________________________________________________________
ионные на .01 для продавца переводимого в Барселону и уменьша-
ет их на .01 для продавца переводимого в Сан Хосе. Кроме того,
продавец находящийся в Лондоне должен потерять .02 из своих ком-
иссионных, независимо от того меняет он город или нет, в то время
как продавец не находящийся в Лондоне должен иметь увеличение
комиссионных на .02.
Изменение в комиссионных основывающееся на нахождении прода-
вца в Лондоне, может применяться независимо от того куда тот пер-
еводится.
Выясните могут ли поле city или поле comm содержать NULL зна-
чения, и обработайте их, как это делается в SQL.
Предупреждение! : эта программа имеет некоторые сокращения.
( См. Приложение A - для ответов. )