Использование переменной indicator для эмуляции null значений sql 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Использование переменной 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, следовательно, не будет изменено в любом случае.

Вы можете использовать переменную 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
VALUES (:Id_num,:salesperson,:loc:i_a,:comm:i_b);

Переменная indicator используется также, чтобы показывать отбрасываемую строку. Это произойдет если вы вставляете значения символов SQL в главную переменную которая не достаточно длинна чтобы вместить все символы. Это особая проблема с нестандартным типами данных - VARCHAR и LONG (смотри Приложению C). В этом случае, переменная будет заполнена первыми символами строки, а последние символы будут потеряны. Если используется переменная indicator, она будет установлена в положительное значение, указывающее на длину отбрасываемой части строки, позволяя таким образом вам узнать, сколько символов было потеряно.

В этом случае, Вы можете проверить с помощью просмотра -значение переменной _indicator > 0, или < 0.

Практическая часть

1. Сделайте запрос каталога чтобы вывести, для каждой таблицы имеющей более чем четыре столбца, имя таблицы, имя владелеца, а также имя столбцов и тип данных этих столбцов.

2. Сделайте запрос каталога чтобы выяснить, сколько синонимов существует для каждой таблицы в базе данных. Не забудьте, что один и тот же синоним принадлежащий двум различным пользователям - это фактически два разных синонима.

3. Выясните сколько таблиц имеют индексы в более чем пятьдесяти процентов их столбцов.

Обратите внимание: Ответы для этих упражнений написаны в псевдокодах, являющихся английским языком описания логики, которой должна следовать программа. Это сделано для того чтобы помочь тем кто может быть незнакомы с Паскалем (или любым другим языком). Кроме того это лучше сфокусирует ваше внимание на включаемых понятиях, опуская частности того или другого языка. Чтобы не противоречить нашим примерам, стиль псевдокода будет напоминать Паскаль.

Мы опустим из программ все что не относится напрямую к рассматриваемым вопросам, например, определение устройств ввода-вывода, подключение к базе данных, и так далее. Конечно, имеется много способов чтобы выполнять такие упражнения; и совсем не обязательно что представленные варианты решений являются самыми удачными.

4. Разработайте простую программу которая выберет все комбинации полей snum и cnum из таблиц Порядков и Заказчиков и выясните, всегда ли предыдущая комбинация такая же как последующая. Если комбинация из таблицы Порядков не найдена в таблице Заказчиков, значение поля snum для этой строки будет изменено на удовлетворяющее условию совпадения. Вы должны помнить, что курсор с подзапросом - модифицируем (ANSI ограничение, также применимо к просмотрам, и что базисная целостность базы данных это не тоже самое что проверка на ошибку(т.е. первичные ключи уникальны, все поля cnums в таблице Порядков правильны, и так далее). Проверьте раздел обьявлений, и убедитесь что там обьявлены все используемые курсоры.

Литература



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 91; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 52.15.63.145 (0.007 с.)