4 курс (заочка) / Лабораторные работы / Лабораторная работа 5-6
.docxФЕДЕРАЛЬНОЕ АГЕНСТВО СВЯЗИ
ОРДЕНА ТРУДОВОГО КРАСНОГО ЗНАМЕНИ ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ БЮДЖЕТНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ МОСКОВСКИЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ СВЯЗИ И ИНФОРМАТИКИ
Кафедра «Интеллектуальные системы в управлении и автоматизации»
Лабораторные работы №5-6
По дисциплине «Технологии баз данных»
Выполнила: Иванова Иоанна, студентка группы БСТ17xx
Цель работы
Освоить написание хранимых процедур на языке PL/SQL.
Задачи
Модифицировать процедуру 1 (см. Приложение), обеспечив добавление всех данных о новых покупателях с учетом их интереса к художникам определенных национальностей.
Добавить двоих новых покупателей (вызов процедуры 1).
Добавить в таблицу CUSTOMER новое поле second_name;
Модифицировать процедуру 2 (см. Приложение).
Добавить двоих новых покупателей (вызов процедуры 2).
Ход выполнения
Модифицируем процедуру CustomerInsert:
CREATE OR REPLACE PROCEDURE CustomerInsert
(
newname IN char,
newareacode IN char,
newphone IN char,
newcity IN char,
newstate IN char,
newstreet IN char,
newzip IN char,
artistnationality IN char
)
AS
rowcount integer(4);
CURSOR artistcursor IS
SELECT id
FROM ARTIST
WHERE nationality=artistnationality
BEGIN
SELECT count (*) INTO rowcount
FROM CUSTOMER
WHERE name = newname
AND city = newcity
AND state = newstate
AND street = newstreet
AND zip = newzip
AND area_code = newareacode
AND phone_number = newphone;
IF rowcount > 0 THEN
BEGIN
DBMS_OUTPUT.PUT_LINE ('Клиент уже есть в базе данных - никаких действий не предпринято');
RETURN;
END;
END IF;
INSERT INTO CUSTOMER (id, name, area_code, phone_number, city, state, street, zip)
VALUES (custId.NextVal, newname, newareacode, newphone, newcity, newstate, newstreet, newzip);
FOR artist IN artistcursor
LOOP
INSERT INTO CUSTOMER_ARTIST_INT (customerID, artistID)
VALUES (CustID.CurrVal, artist.id);
END LOOP;
DBMS_OUTPUT.PUT_LINE (‘ Новый клиент успешно добавлен в базу ');
END;
После сохранения данной процедуры в базу добавим двух новых покупателей путем вызова процедуры CustomerInsert.
Рисунок 1- Наполнение таблицы customer до выполнения процедуры CustomerInsert
Рисунок 2 - Наполнение таблицы customer_artist_int до выполнения процедуры CustomerInsert
Рисунок 3- Выполнение процедур CustomerInsert
Рисунок 4 - Наполнение таблицы customer после выполнения процедуры CustomerInsert
Рисунок 5 - Наполнение таблицы customer_artist_int после выполнения процедуры CustomerInsert
Добавим в таблицу CUSTOMER новое поле second_name
Модифицируем процедуру NewCustomerWithTransaction с учетом добавления поля second_name.
CREATE OR REPLACE PROCEDURE NewCustomerWithTransaction
(
newnawe IN char,
newareacode IN char,
newphone IN char,
artistname IN char,
worktit1e IN char,
workcopy IN char,
price IN number,
newsecondname IN char
)
AS
rowcount integer (2);
tid int:
aid int;
CURSOR transcursor IS
SELECT transaction.id as transactionId, artist.id as artlstId
FROM ARTIST, WORK, TRANSACTION
WHERE name=artistname
AND tit1e=worktit1e
AND copy=workcopy
AND TRANSACTION.customerId IS NULL
AND ARTIST.artlstId = WORK.artistId
AND WORK.workId = TRANSACTION.workId;
BEGIN
SELECT count (*) INTO rowcount
FROM CUSTOMER
WHERE name=newname
AND second_name = newsecondname
AND area_code=newareacode
AND phone_number = newphone
IF rowcount > 0 THEN
BEGIN
DBMS_OUTPUT.PUT_LINE ('Покупатеь уже существует – никаких действий не предпринято');
RETURN;
END;
END IF;
INSERT INTO CUSTOMER (id, name, area_code, phone_number, second_name)
VALUES (custId.nextVal, newname, newareacode, newphone, newsecondname);
rowcount := 0;
FOR trans In transcursor
LOOP
tid := trans.transactionId;
aid := trans.artistId;
rowcount := rowcount + 1;
END LOOP;
IF rowcount > 1 THEN
BEGIN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE (‘ Неверные данные в таблицах ARTIST/WORK/TRANSACTION -- никаких действий не предпринято ‘);
RETURN;
END;
END IF;
IF rowcount = 0 THEN
BEGIN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE (' Ни одной свободной строки в таблице TRANSACTION -- никаких действий не предпринято ');
RETURN;
END;
END IF;
DBMS_OUTPUT.PUT_LINE (tid);
UPDATE TRANSACTION
SET customerId = CustID.Currval, salesprice = price, purchaseDate = SysDate
WHERE transactionId = tid;
DBMS_OUTPUT.PUT_LINE (‘Клиент добавлен в базу данных, данные транзакций обновлены ');
INSERT INTO CUSTOMER_ARTIST_INT (ArtistID, CustomerID)
VALUES (aid, custId.CurrVal);
END;
Для того, чтобы протестировать вставку данных при помощи процедуры NewCustomerWithTransaction добавим в таблицу Work картину уже известного художника, а в таблицу Transaction сделку, в которой customerId == null:
Затем выполним процедуру NewCustomerWithTransaction:
Таблицы CUSTOMER, TRANSACTION и CUSTOMER_ARTIST_INT после выполнения процедуры:
Выводы
В процессе выполнения данной лабораторной работы были освоены навыки создания, модифицирования и вызова хранимых процедур в СУБД Oracle на PL/SQL.
Приложение
Процедура 1. CustomerInsert
CREATE OR REPLACE PROCEDURE CustomerInsert
(
newname IN char,
newareacode IN char,
newphone IN char,
artistnationality IN char
)
AS
rowcount integer(4);
CURSOR artistcursor IS
SELECT id
FROM ARTIST
WHERE nationality=artistnationality
BEGIN
SELECT count (*) INTO rowcount
FROM CUSTOMER
WHERE name = newnaine
AND area_code = newareacode
AND phone_number = newphone;
IF rowcount > 0 THEN
BEGIN
DBMS_OUTPUT.PUT_LINE ('Клиент уже есть в базе данных - никаких действий не предпринято');
RETURN;
END;
END IF;
INSERT INTO CUSTOMER (id, name, area_code, phone_number)
VALUES (custId.NextVal, newname, newareacode, newphone);
FOR artist IN artistcursor
LOOP
INSERT INTO CUSTOMER_ARTIST_INT (customerID, artistID)
VALUES (CustID.CurrVal, artist.id);
END LOOP;
DBMS_OUTPUT.PUT_LINE (‘ Новый клиент успешно добавлен в базу ');
END;
Процедура 2. NewCustomerWithTransaction
CREATE OR REPLACE PROCEDURE NewCustomerWithTransaction
(
newnawe IN char,
newareacode IN char,
newphone IN char,
artistname IN char,
worktit1e IN char,
workcopy IN char,
price IN number
)
AS
rowcount integer (2);
tid int:
aid int;
CURSOR transcursor IS
SELECT transaction.id as transactionId, artist.id as artlstId
FROM ARTIST, WORK, TRANSACTION
WHERE name=artistname
AND tit1e=worktit1e
AND copy=workcopy
AND TRANSACTION.customerId IS NULL
AND ARTIST.artlstId = WORK.artistId
AND WORK.workId = TRANSACTION.workId;
BEGIN
SELECT count (*) INTO rowcount
FROM CUSTOMER
WHERE name=newname
AND area_code=newareacode
AND phone_number = newphone
IF rowcount > 0 THEN
BEGIN
DBMS_OUTPUT.PUT_LINE ('Покупатеь уже существует – никаких действий не предпринято');
RETURN;
END;
END IF;
INSERT INTO CUSTOMER (id, name, area_code, phone_number)
VALUES (custId.nextVal, newname, newareacode, newphone);
rowcount := 0;
FOR trans In transcursor
LOOP
tid := trans.TransactionID;
aid := trans.ArtistID;
rowcount := rowcount + 1;
END LOOP;
IF rowcount > 1 THEN
BEGIN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE (‘ Неверные данные в таблицах ARTIST/WORK/TRANSACTION -- никаких действий не предпринято ‘);
RETURN;
END;
END IF;
IF rowcount = 0 THEN
BEGIN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE (' Ни одной свободной строки в таблице TRANSACTION -- никаких действий не предпринято ');
RETURN;
END;
END IF;
DBMS_OUTPUT.PUT_LINE (tid);
UPDATE TRANSACTION
SET customerId = CustID.Currval, salesprice = price, purchaseDate = SysDate
WHERE transactionId = tid;
DBMS_OUTPUT.PUT_LINE (‘Клиент добавлен в базу данных, данные транзакций обновлены ');
INSERT INTO CUSTOMER_ARTIST INT (ArtistID, CustomerID)
VALUES (aid, custId.CurrVal);
END;
Москва, 2020