Into (:custnum, :salesnum);
until :custnum = :cnum;
{Повторять FETCH до тех пор пока ... команда будет просматривать
Cust_Assigns курсор до строки которая соответствует текущему
значению cnum найденого в Wrong_Orders}
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; { основная программа }
ОТВЕТЫ НА УПРАЖНЕНИЯ 377
___________________________________________________________________
2. Для данной программы которую я использовал, решение будет состоять в том,
чтобы просто включить поле 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;
378 ПОНИМАНИЕ SQL
___________________________________________________________________
ПРИЛОЖЕНИЕ. A
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 }
3. 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}
ОТВЕТЫ НА УПРАЖНЕНИЯ 379
___________________________________________________________________
else { не citynull }
begin