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

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 - для ответов. )

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