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

Into :id_num, :salesperson,

:loc:i_a, :commINDlCATOR:i_b;

If i_a > = O and i_b > = O then

{no NULLs produced}

EXEC SQL UPDATE Salespeople

SET comm = comm + .01

WHERE CURRENT OF Hlgh_cust;

else

{one or both NULL}

begin

If i_a < O then

writeln ('salesperson ', id_num, ' has no city');

If i_b < O then

writeln ('salesperson ', id_num, ' has no

commission');

end;

{else}

end; {while}

EXEC SQL CLOSE CURSOR High_cust;

Как вы видите, мы включили, ключевое слово INDICATOR в одном случае,

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

ковым в любом случае. Каждая строка будет выбрана, но команда UPDATE

выполнится только если NULL значения не будут обнаружены.

Если будут обнаружены NULL значения, выполнится еще одна часть прогр-

аммы, которая распечатает предупреждающее сообщение, где было найдено

каждое NULL значение.

Обратите внимание: переменные indicator должны проверяться в главном

языке, как указывалось выше, а не в предложении WHERE команды SQL.

Последнее в принципе не запрещено, но результат часто бывает непред-

виденным.

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

______________________________________________________________________

ИСПОЛЬЗОВАНИЕ ПЕРЕМЕННОЙ INDICATOR

ДЛЯ ЭМУЛЯЦИИ NULL ЗНАЧЕНИЙ SQL

Другая возможность состоит в том, чтобы обрабатывать переменную

indicator, связывая ее с каждой переменной главного языка, специаль-

ным способом, эмулирующим поведение NULL значений SQL.

Всякий раз, когда вы используете одно из этих значений в вашей пр-

ограмме, например в предложении if ... then, вы можете сначала прове-

рить связанную переменную indicator, является ли ее значение=NULL.

Если это так, то вы обрабатываете переменную по-другому. Например,

если NULL значение было извлечено из поля city для главной перемен-

ной city, которая связана с переменной indicator - i_city, вы должны

установить значение city равное последовательности пробелов. Это буд-

ет необходимо, только если вы будете распечатывать его на принтере;

его значение не должно отличаться от логики вашей программы.

Естественно, i_city автоматически установливается в отрицательное зна-

чение. Предположим, что вы имели следующую конструкцию в вашей

программе:

If sity = 'London' then

comm: = comm + .01

else comm: = comm - .01

Любое значение, вводимое в переменную city, или будет равно "London"

или не будет равно. Следовательно, в каждом случае значение комисси-

онных будет либо увеличино либо уменьшено. Однако, эквивалентные

команды в SQL выполняются по разному:

EXEC SQL UPDATE Salespeople

SET comm = comm + .01

WHERE sity = 'London';

и

EXEC SQL UPDATE Salespeople

SET comm = comm .01;

WHERE sity < > 'London';

( Вариант на ПАСКАЛе работает только с единственным значением, в то

время как вариант на SQL работает со всеми таблицами. )

Если значение city в варианте на SQL будет равно значению NULL , оба

предиката будут неизвестны, и значение comm, следовательно, не будет

352 ПОНИМАНИЕ SQL

______________________________________________________________________

ГЛ. 25

изменено в любом случае.

Вы можете использовать переменную indicator чтобы сделать поведе-

ние вашего главного языка непротиворечащим этому, с помощью созда-

ния условия, которое исключает NULL значения:

If i_city > = O then

begin

If city = 'London' then

comm: = comm + .01

else comm: = comm - .01;

end;

{begin and end нужны здесь только для понимания}

______________________________________________________________

ПРИМЕЧАНИЕ: Последняя строка этого примера сожержит ремарку -

{ begin и end необходимы только для понимания }

_____________________________________________________________

В более сложной программ, вы можете захотеть установить Булеву пере-

менную в "верно" , чтобы указать что значение city =NULL. Затем вы

можете просто проверять эту переменную всякий раз, когда вам это

необходимо.

ДРУГОЕ ИСПОЛЬЗОВАНИЕ

ПЕРЕМЕННОЙ INDICATOR

Переменная indicator также может использоваться для назначения знач-

ения NULL. Просто добавьте ее к имени главной переменной в команде

UPDATE или INSERT тем же способом что и в команде SELECT.

Если переменная indicator имеет отрицательное значение, значение NULL

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

ния NULL в поля city и comm, таблицы Продавцов, всякий раз, когда

переменные indicator - i_a или i_b будут отрицательными; в противном

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

EXEC SQL INSERT INTO Salespeople

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