- •1.1. Технические параметры баз данных
- •1.2. Организация субд
- •1.6. Сетевая и иерархическая модели данных
- •1.7. Case - методы проектирования баз данных
- •1.8. Понятия “сущность” и “взаимосвязь”
- •4. Складывание.
- •5.3. Индексированные файлы
- •5.4. Операции с поиском по неключевым полям
- •6.2. Типы данных в sql
- •Int Число без десятичной точки. Эквивалентно decimal, но без
- •6.3. Обозначения в командах sql
- •6.... Оператор in
- •6.... Оператор between
- •6.... Оператор like
- •6.... Оператор is null
- •7.5... Скалярное выражение на основе выбранных полей
- •7.6... Упорядочение вывода полей
- •7.7.. Объединения нескольких таблиц в запросе
- •7.8.. Создание обьединения
- •7.9..Объединение таблиц через справочную целостность
- •7.10.. Объединения таблиц по равенству значений
- •7.11.. Объединение более двух таблиц
- •7.12. Объединение таблицы с собой
- •8.2. Значения, которые могут выдавать подзапросы
- •8.3. Предикаты с подзапросами являются необратимыми
- •8.4. Использование агрегатных функций в подзапросах
- •8.5. Использование подзапросов которые выдают
- •8.8. Подзапросы в предложении having
- •Insert into Londonstaff
- •Insert into Daytotals (date, total)
- •Insert для этой таблицы. Null - это наиболее широко используемое
- •1009, И Hoffman и Clemens будут также автоматически изменены.
- •Insert Пользователь с этой привилегией может выполнять
- •Insauth Имеет ли пользователь привилегию insert
- •Values ( :id_num, :salesperson, :loc, :comm)
- •Values (:id_num, :salesperson, :loc, :comm);
- •Into :id_num, :salesperson, :loc, :comm
- •Into :salesnum
- •1. Команда выполнилась без ошибки, но не произвела никакого
- •Into :id_num, :salesperson, :loc, :comm;
- •Indicator.
- •Indicator, связывая ее с каждой переменной главного языка, специальным способом, эмулирующим поведение null значений sql.
- •Values (:Id_num, :salesperson, :loc:i_a, :comm:i_b);
- •Indicator. Переменные indicator следуют за другим именами переменных в команде sql, без каких бы то ни было посторонних символов
Into :id_num, :salesperson, :loc, :comm;
EXEC SQL UPDATE Salespeople
SET comm = comm + .01
WHERE CURRENT OF High_cust;
end;
EXEC SQL CLOSE CURSOR High_cust;
Обратите внимание, что некоторые реализации требуют, чтобы вы указывали в определении курсора, что курсор будет использоваться для выполнения команды UPDATE на определенных столбцах. Это делается с помощью заключительной фразы определения курсора - FOR UPDATE <column
list>. Чтобы обьявить курсор High_cust таким способом так, чтобы вы могли модифицировать командой UPDATE столбец comm, вы должны ввести
следующее предложение:
EXEC SQL DECLARE CURSOR High_Cust AS
SELECT *
FROM Salespeople
WHERE snum IN
(SELECT snum
FROM Customers
WHERE rating = 300)
FOR UPDATE OF comm;
Это обеспечит вас определенной защитой от случайных модификаций,
которые могут разрушить весь порядок в базе данных.
ПЕРЕМЕННАЯ INDICATOR
Пустые (NULLS) значения - это специальные маркеры, определяемые самим SQL. Они не могут помещаться в главные переменные. Попытка вставить NULL значения в главную переменную будет некорректна, так как главные языки не поддерживают NULL значений в SQL по определению. Хотя результат при попытке вставить NULL значение в главную переменную определяет проектировщик, этот результат не должен противоречить теории базы данных, и поэтому обязан произвести ошибку: код SQLCODE в виде отрицательного числа, и вызвать подпрограмму управления ошибкой. Естеcтвенно, вам нужно этого избежать. Поэтому, вы можете выбрать NULL значения с допустимыми значениями, не приводящими к разрушению вашей программы. Даже если программа и не разрушится, значения в главных переменных станут неправильными, потому что они не могут иметь NULL значений. Альтернативным методом, предоставляемым для этой ситуацией
является - функция переменной indicator(указатель).
Переменная indicator, обьявленная в разделе объявлений SQL, напоминает
другие переменные. Она может иметь тип главного языка, который соответствует числовому типу в SQL. Всякий раз, когда вы выполняете операцию,
которая должна поместить NULL значение в переменную главного языка,
вы должны использовать переменную indicator для надежности.
Вы помещаете переменную indicator в команду SQL непосредственно после
переменной главного языка, которую вы хотите защитить, без каких-либо пробелов или запятых, хотя вы и можете, при желании, вставить слово
Indicator.
Переменной indicator в команде, изначально присваивается значение 0.
Однако, если производится значение NULL , переменная indicator становится равной отрицательному числу. Вы можете проверить значение переменной indicator, чтобы узнать, было ли найдено значение NULL. Давайте
предположим, что поля city и comm таблицы Продавцов, не имеют ограничения NOT NULL и что мы объявили в разделе обьявлений SQL, две
ПАСКАЛЬевские переменные целого типа i_a и i_b.
( Нет ничего такого в разделе обьявлений, что могло бы представить их
как переменные indicator. Они станут переменными indicator, когда будут использоваться как переменные indicator. )
Имеется одна возможность:
EXEC SQL OPEN CURSOR High_cust;
while SQLCODE = O do
begin
EXEC SQL FETCH High_cust
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.
Последнее в принципе не запрещено, но результат часто бывает непредвиденным.
ИСПОЛЬЗОВАНИЕ ПЕРЕМЕННОЙ INDICATOR
ДЛЯ ЭМУЛЯЦИИ NULL ЗНАЧЕНИЙ SQL
Другая возможность состоит в том, чтобы обрабатывать переменную