Чтение онлайн

на главную - закладки

Жанры

Понимание SQL

Грубер Мартин

Шрифт:

EXEC SQL CLOSE CURSOR Cust_assigns;

{Поэтому мы будем начинать новый вывод в следующий раз через цикл.

Значение в котором мы получим из этого курсора сохраняется в переменной - salesnum.}

EXEC SQL UPDATE Orders

SET snum=:salesnum

WHERE CURRENT OF Wrong_Orders;

end; {Если SQLCODE=0}.

end; { Пока SQLCODE . . . выполнить }

EXEC SQL CLOSE CURSOR Wrong_Orders;

* end; { основная программа }

Для данной программы

которую я использовал, решение будет состоять в том, чтобы просто включить поле onum, первичным ключом таблицы Порядков, в курсор Wrong_Orders. В команде UPDATE, вы будете затем использовать предикат WHERE onum=:ordernum (считая целую переменную - odernum, обьявленной), вместо WHERE CURRENT Of Wrong_Orders.

Результатом будет программа наподобии этой (большинство комментариев из предыдущей программы здесь исключены ):

EXEC SQL BEGIN DECLARE SECTION;

SQLCODE: integer;

odernum integer;

cnum integer;

snum integer;

custnum: integer;

salesnum: integer;

EXEC SQL END DECLARE SECTION;

EXEC SQL DECLARE Wrong_Orders AS CURSOR FOR

SELECT onum, cnum, snum

FROM Orders a

WHERE snum < >

(SELECT snum

FROM Customers b

WHERE a.cnum=b.cnum);

EXEC SQL DECLARE Cust _ assigns AS CURSOR FOR

SELECT cnum, snum

FROM Customers;

begin { основная программа }

EXEC SQL OPEN CURSOR Wrong_Orders;

while SQLCODE=O do {Цикл до тех пор пока Wrong_Orders не опустеет}

begin

EXEC SQL FETCH Wrong_Orders

INTO (:odernum, :cnum, :snum);

if SQLCODE=O then

begin

EXEC SQL OPEN CURSOR Cust_Assigns;

repeat

EXEC SQL FETCH Cust_Assigns

INTO (:custnum, :salesnum);

until :custnum=:cnum;

EXEC SQL CLOSE CURSOR Cust_assigns;

EXEC SQL UPDATE Orders

SET snum=:salesnum

WHERE CURRENT OF Wrong_Orders;

end; {If SQLCODE=0}

end; { While SQLCODE . . . do }

EXEC SQL CLOSE CURSOR Wrong_Orders;

* end; { main program }

EXEC SQL BEGIN DECLARE SECTION;

SQLCODE integer;

newcity packed array[1. .12] of char;

commnull boolean;

citynull boolean;

response char;

EXEC SQL END DECLARE SECTION;

EXEC SQL DECLARE CURSOR Salesperson AS

SELECT * FROM SALESPEOPLE;

begln { main program }

EXEC SQL OPEN CURSOR Salesperson;

EXEC SQL FETCH Salesperson

INTO (:snum, :sname, :city:i_cit, :comm:i_com);

{Выборка первой строки}

while SQLCODE=O do

{Пока эти строки в таблице Продавцов.}

begin

if i_com < O then commnull:=true;

if i_cit < O then citynull:=true;

{ Установить логические флаги которые могут показать NULLS.}

if citynull then

begin

write ('Нет текущего значения city

для продавца ',

snum, ' Хотите предоставить хотя бы одно? (Y/N)');

{Подсказка покажет значение city состоящее из NULL значений.}

read (ответ);

{Ответ может быть сделан позже.}

end {если конечно - citynull}

else { не citynull }

begin

if not commnull then

{ Чтобы выполнять сравнение и операции только для не-NULL значений связи }

begin

if city='London' then comm:=comm * .02 * .02

else comm:=comm + .02;

end;

{Даже если значение и не - commnull, begin и end здесь для ясности.}

write ('Текущий city для продавца',

snum, 'есть', city,

* Хотите его изменить? (Y/N)');

Обратите Внимание: Продавец не назначеный в данное время в определенный город, не будет иметь изменений комиссионых при определении находятся ли он в Лондоне.

read (ответ);

{Ответ теперь имеет значение независимо от того что citynull - верен или неверен.}

end; {иначе не citynull}

if response='Y' then

begin

write ('Введите новое значение city:');

read (newcity);

if not commnull then

{Эта операция может быть выполнена только для не-NULL значений. }

case newcity of:

begin

'Barcelona':comm:=comm + .01,

'San Jose': comm:=comm *.01

end; {случно и если не commnull}

EXEC SQL UPDATE Salespeople

SET city=:newcity, comm=:comm:i_com

WHERE CURRENT OF Salesperson;

{Переменная индикатора может поместить NULL значение в поле comm если так назначено.}

end; { Если ответ='Y', или если ответ < > 'Y',

изменений не будет. }

EXEC SQL FETCH Salesperson

INTO (:snum, :sname, :city:i_clt,

:comm:l_com);

{выборка следующей строки}

end; {если SQLCODE=0}

EXEC SQL CLOSE CURSOR Salesperson;

* end; {основной программы}

Приложение B. ТИПЫ ДАННЫХ В SQL

ТИПЫ ДАННЫХ РАСПОЗНАВАЕМЫЕ С ПОМОЩЬЮ ANSI, состоят из символов и различных типов чисел, которые могут классифицироваться как точные числа и приблизительные числа. Точные числовые типы - это номера, с десятичной точкой или без десятичной точки. Приблизительные числовые типы - это номера в показательной (экспоненциальной по основанию - 10) записи.

Поделиться:
Популярные книги

Монстр из прошлого тысячелетия

Еслер Андрей
5. Соприкосновение миров
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Монстр из прошлого тысячелетия

Белые погоны

Лисина Александра
3. Гибрид
Фантастика:
фэнтези
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Белые погоны

Черный Маг Императора 14

Герда Александр
14. Черный маг императора
Фантастика:
аниме
сказочная фантастика
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Черный Маг Императора 14

Самодержец

Старый Денис
5. Внук Петра
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Самодержец

Наследие Маозари 8

Панежин Евгений
8. Наследие Маозари
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Наследие Маозари 8

Древесный маг Орловского княжества

Павлов Игорь Васильевич
1. Орловское княжество
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества

Кодекс Охотника. Книга II

Винокуров Юрий
2. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
боевая фантастика
юмористическое фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга II

Двойник короля 15

Скабер Артемий
15. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 15

Вечная Война. Книга II

Винокуров Юрий
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Вечная Война. Книга II

Призыватель нулевого ранга. Том 3

Дубов Дмитрий
3. Эпоха Гардара
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Призыватель нулевого ранга. Том 3

Олд мани

Голд Яна
Любовные романы:
современные любовные романы
остросюжетные любовные романы
фемслеш
5.00
рейтинг книги
Олд мани

Леди Малиновой пустоши

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Леди Малиновой пустоши

Весь цикл «Десантник на престоле». Шесть книг

Ланцов Михаил Алексеевич
Десантник на престоле
Фантастика:
альтернативная история
8.38
рейтинг книги
Весь цикл «Десантник на престоле». Шесть книг

Рубежник

Билик Дмитрий Александрович
1. Бедовый
Фантастика:
юмористическая фантастика
городское фэнтези
мистика
5.00
рейтинг книги
Рубежник