Материал: Graber_Martin_-_SQL_dlya_prostykh_smertnykh_-_2014

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Приложение А. Ответы купражнениям

з. CREATE VIEW Nameorders

AS SELECT sname, AVG (amt), SUM (amt) FROM Salespeople, Orders

WHERE Salespeople.snum = Orders.snum GROUP ВУ sname;

4. CREATE VIEW Multcustomers AS SELECT •

FROM Salespeople а WHERE 1 <

(SELECT COUNT(•)

FROM Customers Ь

WHERE а. snum = Ь. snum);

ГЛАВА21

1.#1 является необновляемым из-за использования DISТINCT.

#2 является необновляемым, поскольку он использует соединение, функцию аг­

регирования и GROUP ВУ.

#3 является необновляемым, поскольку он базируется на # 1, который, в свою очередь, является необновляемым.

#4 является обновляемым.

2. CREATE VIEW Commissions AS SELECT snum,comm

FROM Salespeople

WHERE comm BEТWEEN .10 AND .20

WITH

СНЕСК OPTION;

з. CREATE TABLE Orders

(onum

integer NOT NULL PRIMARY КЕУ,

amt

decimal,

odate

date DEFAULТ VALUE = CUROATE,

snum

integer,

cnum

integer);

CREATE VIEW

Entryorders

AS SELECT onum, amt, snum, cnum

FROM

Orders;

ГЛАВА22

1.GRANT UPDATE (rating) ON Customers ТО Janet;

2.GRANT SELECT ON Orders ТО Stephen WITH GRANT OPTION; з. REVOKE INSERT ON Salespeople FROM Claire;

4.War 1: CREATE VIEW Jerrysview

AS SELECT •

FROM Customers

WHERE rating BEТWEEN 100 AND 500

312

Приложение А. Ответы купражнениям

WHITH СНЕСК OPTION;

Шаг 2: GRANT INSERT, UPDATE ON Jerrysview то Jerry; 5. Шаг 1: CREATE VIEW Janetsview

AS SELECT •

FROM Customeгs

WHERE гating =

(SELECT MIN (rating) FROM Customers);

Шаг 2:GRANT SELECT ON Janetsview то Janet;

ГЛАВА23

1.CREATE DBSPACE Myspace (pctindex 15,

pctf ree

40);

2.CREATE SYNONYM Orders FOR Diane.Orders;

3.Они должны откатываться назад.

4.Исключительное использование.

5.Только для чтения.

ГЛАВА24

1. SELECT a.tname, а.оwпег, b.cname, b.datatype FROM SYSTEMCATALOG а, SYSTEMCOLUMNS Ь WHERE a.tname = b.tname

AND а.оwпег = b.owner AND a.numcolumns > 4;

Замечание: Поскольку большинство имен столбцов соединяемых таблиц различно, не все случаи использования алиасов а и Ь в представленной команде являются необ­ ходимыми. Имена алиасов представлены для большей ясности.

2.SELECT tname, synowner, COUNT (ALL synonym) FROM SYTEMSYNONS

GROUP ВУ tname, synowner;

3.SELECT COUNT (•)

FROM SYSTEMCATALOG а WHERE numcolumns/2 <

(SELECT COUNT (DISTINCT cnumber) FROM SYSTEMINDEXES Ь

WHERE a.owner =b.tabowner AND а. tname = Ь. tname);

ГЛАВА25

1. ЕХЕС SQL BEGIN DECLARE SECТION;

313

Приложение А. Ответы купражнениям

SQLCOOE: intege г;

требуется всегда

cnum snum

iпtegeг;

integeг;

custпum: integeг;

salesnum: iпtegeг;

ЕХЕС SQL ENO DECLARE SECTION;

ЕХЕС SQL DECLARE Wгопg_Огdегs AS CURSOR FOR SELECT cпum, snum

FROM Огdегs а

WHERE snum < > (SELECT sпum

FROM Customeгs Ь

WHERE a.cпum = b.cпum);

{ Здесь используется SQL. Рассмотренный запрос локализует строки

таблицы Oгdes, которые не согласуются со строками таблицы Customeгs.}

ЕХЕС SQL DECLARE Cust_assigns AS CURSOR FOR

SELECT cnum,sпum FROM Customeгs;

Этот курсор используется для поддержки правильных значений столбца sпum.}

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

ЕХЕС SQL OPEN CURSOR Wгопg_Огdегs; while SQLCODE = О do

{Цикл пока значение переменной Wгong_Oгdeгs пусто.}

begin

ЕХЕС SOL FETCH Wгong_Oгdeгs INTO (: cпum, : snum);

if SQLCODE=O then

begiп

Если значение переменной Wгопg_Огdегs пусто, то в этом цикле ничего не должно выполняется.}

ЕХЕС SQL OPEN CURSOR Cust_Assigпs;

гереаt

ЕХЕС SOL FЕТСН Cust_Assigпs INTO (:custпum, :salesпum);

until :custпum = :cпum;

Повторение команды FETCH uпtil ... приведет к тому, что курсор Cust_Assigпs

перемещается wаг за шагом до тех пор, пока строка, содержащая текущее

значение cnum из Wгong_Orders не будет найдена.}

ЕХЕС SQL CLOSE CURSOR Cust_assigns;

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

salesnum.}

ЕХЕС SOL UPDATE Ordeгs

314

Приложение А. Ответы купражнениям

SЕТ sпum = :salesпum

WHERE CURRENT OF Wroпg_Orders; епd; { Еспи SQLCODE = О }

end; {Пока SQLCDDE ... выполнить} ЕХЕС SQL CLOSE CURSOR Wroпg_Orders;

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

2. В программе, которую использовал автор, решение заключалось в простом включении onum( первичный ключ таблицы Orders в курсоре Wrong_orders). В коман­ де UPDATE следует использовать предикат WHERE onum = :ordemum (в предположе­ нии, что объявлена переменная целого типа ordemum) вместо WHERE CURRENT OF Wrong_Orders. Результирующая программа будет выглядеть примерно так (большинст­ во комментариев из предыдущей версии опущено):

ЕХЕС SQL BEGIN DECLARE SECTION;

SQLCODE:

iпteger;

oderпum

iпteger;

cпum

iпteger;

sпum

iпteger;

custпum:

iпteger;

salesпum: iпteger;

ЕХЕС SQL END DECLARE SECTION;

ЕХЕС SQL DECLARE Wroпg_Orders AS CURSOR FOR

SELECT oпum,

cnum,

sпum

 

 

 

FROM Orders а

 

 

 

 

WHERE sпum < >

 

 

 

 

(SELECT snum

 

 

 

 

FROM Customers

Ь

 

 

WHERE

a.cnum

= b.cnum);

ЕХЕС SQL DECLARE Cust_assigns AS CURSOR FOR

SELECT cnum,sпum

 

 

 

 

FROM Custome rs;

 

 

 

begin

{ основная

программа

 

 

ЕХЕС SQL OPEN CURSOR Wroпg_Orders;

while

SQLCODE = О

do { Цикл,

выполняемый до тех пор, пока Wroпg_Orders

пуст

}

 

 

 

 

 

begiп

 

 

 

 

 

ЕХЕС SQL FЕТСН

Wroпg_Orders

 

 

INTO (: oderпum,

: cпum,

: snum);

if SQLCODE=O

then

 

 

 

 

begin

 

 

 

 

 

 

ЕХЕС SOL OPEN CURSOR Cust_Assigns

 

repeat

 

 

 

 

 

 

ЕХЕС SQL FETCH Cust_Assigпs

 

INTO (: custпum,

: salesnum);

 

uпtil

:custпum = :cпum;

315

Приложение А. Ответы к упражнениям

ЕХЕС SOL CLOSE CURSOR Cust_assigпs; ЕХЕС SOL UPDATE Огdегs;

SET sпum = :salesпum

WHERE CURRENT OF Wгопg_Огdегs; епd; { if SOLCODE =О }

епd; { While SOLCODE ... do} ЕХЕС SOL CLOSE CURSOR Wгопg_Огdегs;

епd; { основная программа }

З. ЕХЕС SOL BEGIN DECLARE SECTION;

SOLCODE

integeг;

newcity

packed аггау[1 .. 12] of сhаг;

commпull

boolean;

cityпull

Ьооlеап;

гesponse

cha г;

ЕХЕС SOL ENO DECLARE SECTION;

ЕХЕС SOL DECLARE CURSOR Salespeгsoп AS SELECT • FROM SALESPEOPLE;

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

ЕХЕС SOL OPEN CURSOR Salespeгsoп;

ЕХЕС SOL FЕТСН Salespeгsoп

INTO (:sпum, :sпame, :city:i_cit:comm:i_com);

{ Выбор (fetch) первой строки. }

while SOLCODE =О do

Цикл выполняется пока (while) есть строки в таблице Salespeгsoп.} begiп

if i_com < О theп commпull : = tгue; if i_cit < О theп cityпull : =tгue:

Установить булевы флаги, которые соответствуют NULL-значениям if cityпull then

begiп

wгite ("Для Salespeгsoп не обнаружено текущее значение столбца city', sпum, 'Необходимо предпринять какие-либо действия? (У(да)/N(нет))');

Данное приглашение соответствует случаю, когда значение city пусто (NULL)}

геаd ( геsропsе):

Значение переменной геsропsе используем позже.

епd { if citynull } else { поt citynull }

begiп

if поt commпull then

{Выполняем сравнение и действия для случая, когда значение переменной commnull отлично от NULL

begin

316

Источник: https://studfile.net/preview/16418473/