
Лёшка / Маркин Тест 3 / SQL / Ответы (6)
.doc1) Каким образом можно создать и использовать пользовательское исключение?
Ответ: Исключение может быть сначала создано (с помощью запроса CREATE EXCEPTION), а затем вызвано, или же сразу сгенерировано с сообщением, задаваемым непосредственно в операторе вызова исключения.
2) Какой оператор используется для выхода из текущего цикла, а также для перехода на метку:
Ответ: LEAVE
3) Какие из четырех типов переменных (локальные переменные, контекстные переменные, входные параметры и выходные параметры) могут использоваться в хранимых процедурах, а какие – в триггерах?
Ответ: Локальные переменные могут использоваться везде, большинство контекстных переменных используются только в триггерах, а входные параметры и выходные параметры используются только в хранимых процедурах
4) Создать хранимую процедуру для вывода количества ремонтных заявок, на выполнение которых назначен исполнитель, чья фамилия начинается с заданной буквы. Результат представить в виде: код исполнителя, фамилия исполнителя, количество ремонтных заявок. CREATE PROCEDURE proc_exec(firstchar VARCHAR(1))RETURNS (executorcd INTEGER, fio_exec VARCHAR(30), count_req INTEGER)
AS
BEGIN
Выберите операторы для продолжения текста процедуры:
Ответ:б) FOR SELECT e.executorcd, e.fio, count(r.requestcd) FROM executor e, request r
WHERE SUBSTRING(fio FROM 1 FOR 1)=:firstchar AND e.executorcd=r.executorcd
GROUP BY executorcd, fio INTO :executorcd, :fio_exec, :count_req
DO SUSPEND;
END
5) Создана процедура, которая выводит данные об абонентах, даты оплаты которых больше одной из заданных дат и меньше другой:
CREATE PROCEDURE abs(d1 date,d2 date) returns (AccCd varchar(6),fio varchar(20),st varchar(20), houseno integer, flat integer)
as
begin
Продолжите текст процедуры:
Ответ: а) for select a.accountcd, a.fio, (select streetnm from street where streetcd=a.streetcd), a.houseno,a.flatno from abonent a where a.accountcd in (select accountcd from paysumma where paydate<=:d1 and paydate >=:d2) into :AccCd,:fio,:st,:houseno,:flat do suspend;end
6) Создать хранимую процедуру, которая для всех абонентов, чья фамилия начинается с заданной буквы, увеличивает значения всех начисленных сумм на 50.
CREATE PROCEDURE alter_nachisl(firstchar VARCHAR(1))
AS BEGIN
Выберите операторы для продолжения текста процедуры:
Ответ: в) UPDATE nachislsumma SET nachislsum=nachislsum+50
WHERE accountcd IN (SELECT accountcd FROM abonent
WHERE SUBSTRING(fio FROM 1 FOR 1)=:firstchar);
END
7) Создана процедура изменения даты подачи всех ремонтных заявок заданного абонента на новую дату.
create procedure my_proc16 (abfio varchar(20), incdate date) as begin
Выберите операторы для продолжения текста процедуры:
Ответ: а) update request r
set r.incomingdate=:incdate
where r.accountcd in (select a.accountcd from abonent a where a.fio=:abfio);
end
8) Создать хранимую процедуру, которая выводит общую сумму оплат заданного абонента за заданный год. Результат представить в виде: номер лицевого счета абонента, общая сумма оплат, год, за который произведена оплата.
CREATE PROCEDURE pay_year(account VARCHAR(30), p_year SMALLINT)
RETURNS (accountcd VARCHAR(30), sum_year NUMERIC(15,4), payyear SMALLINT)
AS BEGIN
Выберите операторы для продолжения текста процедуры:
Ответ: б) FOR SELECT accountcd, sum(paysum), payyear FROM paysumma WHERE accountcd=:account
GROUP BY accountcd, payyear
INTO :accountcd, :sum_year, :payyear
DO SUSPEND;
END
9) Создать процедуру для вывода общей суммы начислений абонента с заданным номером лицевого счета. Результат представить в виде: номер лицевого счета абонента, ФИО абонента, общая сумма его начислений. CREATE PROCEDURE proc(account VARCHAR(30)) RETURNS (Accountcd VARCHAR(30), Fio VARCHAR(30),s_nach NUMERIC(15,4)) AS BEGIN Выберите операторы для продолжения текста процедуры:
Ответ: в) FOR SELECT a.accountcd, a.fio, SUM(n.nachislsum) FROM abonent a, nachislsumma n
WHERE a.accountcd=:account AND a.accountcd=n.accountcd
GROUP BY a.accountcd, a.fio INTO :accountcd, :fio, :s_nach
DO SUSPEND;
END
10) Создать процедуру для вывода информации об абонентах, общая сумма начислений которых превышает конкретную сумму. Результат представить в виде: номер лицевого счета абонента, фамилия, номер телефона, общая сумма его начислений.
CREATE PROCEDURE nach_sum(summa NUMERIC(15,4))
RETURNS (accountcd VARCHAR(30), fio VARCHAR(30), phone VARCHAR(15),sum_nach NUMERIC(15,4))
AS BEGIN
Выберите операторы для продолжения текста процедуры:
Ответ: а) FOR SELECT a.accountcd, a.fio, a.phone, sum(n.nachislsum)
FROM abonent a, nachislsumma n WHERE a.accountcd=n.accountcd
GROUP BY a.accountcd, a.fio, a.phone HAVING sum(n.nachislsum)>:summa INTO :accountcd, :fio, :phone, :sum_nach
DO SUSPEND;
END
11) Чем могут вызываться хранимые процедуры?
Ответ: всё вышеперечисленное
12) Создана процедура для вывода ФИО абонента и полного адреса: название улицы, д. дом, кв. квартира(FUL_ADR).
create procedure my_proc21
returns (Afio varchar(20), Adres varchar(50))
as begin
Выберите операторы для продолжения текста процедуры:
Ответ: среди перечисленных вариантов нет правильного
13) Создана процедура для уменьшения на заданный процент сумм начислений по заданному коду услуги.
create procedure my_proc14 (kodserv integer, chislo numeric(18,4))
as begin
Выберите операторы для продолжения текста процедуры:
Ответ: update nachislsumma
set nachislsum = nachislsum *(1- :chislo)
where servicecd=:kodserv;
end
14) Что такое хранимая процедура?
Ответ: б) это скомпилированная программа произвольной длины на процедурном языке SQL, которая хранится в БД как часть метаданных
15) Создана процедура установления заданного исполнителя для всех ремонтных заявок с заданной неисправностью
create procedure my_proc17 (execfio varchar(20), nmfail varchar(50))
as begin
Выберите операторы для продолжения текста процедуры:
Ответ: б) update request r
set r.executorcd = (select e.executorcd from executor e where e.fio= :execfio)
where r.failurecd in (select d.failurecd from disrepair d where d.failurenm= :nmfail);
end
16) Для удаления хранимой процедуры используется запрос:
Ответ: б) DROP PROCEDURE
17) В учебной БД создана хранимая процедура, которая удаляет данные об абонентах , в чьих фамилиях больше заданного числа символов.
CREATE PROCEDURE delete_abonent (chislo INTEGER)
AS BEGIN DELETE FROM abonent WHERE CHAR_LENGTH(fio)>:chislo; END Предпринимается попытка выполнить процедуру с помощью следующего запроса:
EXECUTE PROCEDURE delete_abonent(10)
Будет ли выполнен данный запрос:
Ответ: а) нет
19) Для определения количества оплат в каждом месяце по заданной услуге разработана процедура
create procedure my_proc12 (nameserv varchar(30))
returns (Ppayyear smallint, Ppaymonth smallint, Pcount integer)
as begin
Выберите операторы для продолжения текста процедуры:
Ответ: а) for select payyear, paymonth, count(payfactcd)
from Paysumma p, Services s
where p.servicecd = s.servicecd and s.servicenm=:nameserv
group by payyear,paymonth
into :Ppayyear, :Ppaymonth, :Pcount
do suspend;
end
20) Создана хранимая процедура с помощью следующей инструкции:
CREATE PROCEDURE proc_disrep(firstchar VARCHAR(1)) RETURNS (failurecd INTEGER, failurenm VARCHAR(30))
AS
BEGIN
FOR SELECT failurecd, failurenm FROM disrepair WHERE SUBSTRING(failurenm FROM 1 FOR 1)=:firstchar
INTO :failurecd, :failurenm
DO SUSPEND;
END
Данная процедура является:
Ответ: а) Процедурой выбора
21) Какой из приведенных ниже запросов следует использовать для создания процедуры, которая будет выполнять обновление заданного номера телефона в таблице Abonent и возвращать в качестве результата фамилию абонента, у которого изменен номер, и новый номер его телефона?
Ответ: а) CREATE PROCEDURE Phone (Old_Phone VARCHAR(6), New_Phone VARCHAR(6))
RETURNS (AbFIO VARCHAR(20), AbOldPhone VARCHAR(6)) AS BEGIN
UPDATE Abonent SET Phone = :New_Phone WHERE Phone = :Old_Phone
RETURNING FIO, Phone INTO :AbFIO, :AbOldPhone;
END;
22) Для вывода информации о платежах абонента с заданным номером лицевого счета создана следующая процедура:
create procedure my_proc8 (schet varchar(30))
returns (Pservicecd integer,Ppaysum numeric(15,4),Ppaydate date,Ppaymonth smallint,Ppayyear smallint)
as begin
Ответ: в) for select servicecd,paysum,paydate,paymonth,payyear
from paysumma where accountcd =:schet
order by servicecd, paymonth, payyear
into :Pservicecd, :Ppaysum, :Ppaydate, :Ppaymonth, :Ppayyear
do suspend;
end
23) Определите, в каких случаях и для чего в хранимых процедурах используются операторы SUSPEND и EXIT.
Ответ: Оператор SUSPEND применяется в хранимых процедурах выбора для возвращения текущих значений выходных параметров, а оператор EXIT используется в выполняемых процедурах для того, чтобы прервать выполнение процедуры
24) Создана процедура для вывода информации о фактах оплат с минимальной суммой: номер лицевого счета и ФИО абонента, сумма оплаты, код услуги и дата оплаты.
create procedure my_proc26 returns (Aaccountcd varchar(30), Afio varchar(20), Ppaysum numeric(15,4), Pserv integer, Ppaydate date)
as begin
Выберите операторы для продолжения текста процедуры:
Ответ: for select a.accountcd, a.fio, p.paysum, p.servicecd, p.paydate
from abonent a, paysumma p
where a.accountcd=p.accountcd and p.paysum = (select min(p1.paysum) from paysumma p1)
order by 1,4
into :Aaccountcd, :Afio, :Ppaysum, :Pserv, :Ppaydate do suspend;
end
25) Какая из нижеприведенных процедур составлена синтаксически правильно?
Ответ: в)
create procedure my_proc4 (kod smallint)
returns (Pcount integer)
as begin
for select count(requestcd) from request where ((executorcd =:kod)
and (executed = '1'))
into :Pcount
do suspend;
end
26) Для вывода максимального значения начисления, приходящейся на определенный месяц(mesyac) заданного года(god), разработана процедура:
create procedure my_proc18 (god smallint, mesyac smallint )
returns (Maxsum numeric(15,4))
as begin
Выберите операторы для продолжения текста процедуры:
Ответ: б)
for select max(nachislsum) as Max_nachislsum
from nachislsumma
where nachislyear=:god and nachislmonth=:mesyac
into :Maxsum do suspend;
end
27) Создана хранимая процедура с помощью следующей инструкции:
CREATE PROCEDURE proc_exec(firstchar VARCHAR(1)) RETURNS (executorcd INTEGER, fio_exec VARCHAR(30), count_req INTEGER)
AS
BEGIN
FOR SELECT e.executorcd, e.fio, count(r.requestcd) FROM executor e, request r
WHERE SUBSTRING(fio FROM 1 FOR 1)=:firstchar AND e.executorcd=r.executorcd
GROUP BY executorcd, fio INTO :executorcd, :fio_exec, :count_req
DO SUSPEND;
END
Данная процедура выводит следующую информацию:
Ответ: б) количество ремонтных заявок, на выполнение которых назначены исполнители, чьи фамилии начинаются с заданной буквы. Результат имеет вид: код исполнителя, фамилия исполнителя, количество назначенных ему ремонтых заявок;
28) Создать хранимую процедуру, которая выводит общую сумму начислений абонентов за заданный год. Результат представить в виде: номер лицевого счета абонента, общая сумма начислений, год, за который произведены начисления.
CREATE PROCEDURE nach_year(n_year SMALLINT)
RETURNS (accountcd VARCHAR(30), sum_year NUMERIC(15,4), nachislyear SMALLINT)
AS BEGIN
Выберите операторы для продолжения текста процедуры:
Ответ: FOR SELECT accountcd, sum(nachislsum), nachislyear FROM nachislsumma
WHERE nachislyear=:n_year GROUP BY accountcd, nachislyear INTO :accountcd, :sum_year, :nachislyear
DO SUSPEND;
END
29)