Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

4 курс (заочка) / Лабораторные работы / Лабораторная работа 5-6

.docx
Скачиваний:
37
Добавлен:
08.01.2022
Размер:
558.85 Кб
Скачать

ФЕДЕРАЛЬНОЕ АГЕНСТВО СВЯЗИ

ОРДЕНА ТРУДОВОГО КРАСНОГО ЗНАМЕНИ ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ БЮДЖЕТНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ МОСКОВСКИЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ СВЯЗИ И ИНФОРМАТИКИ

Кафедра «Интеллектуальные системы в управлении и автоматизации»

Лабораторные работы №5-6

По дисциплине «Технологии баз данных»

Выполнила: Иванова Иоанна, студентка группы БСТ17xx

Цель работы

Освоить написание хранимых процедур на языке PL/SQL.

Задачи

  1. Модифицировать процедуру 1 (см. Приложение), обеспечив добавление всех данных о новых покупателях с учетом их интереса к художникам определенных национальностей.

  2. Добавить двоих новых покупателей (вызов процедуры 1).

  3. Добавить в таблицу CUSTOMER новое поле second_name;

  4. Модифицировать процедуру 2 (см. Приложение).

  5. Добавить двоих новых покупателей (вызов процедуры 2).

Ход выполнения

  1. Модифицируем процедуру 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;

  1. После сохранения данной процедуры в базу добавим двух новых покупателей путем вызова процедуры CustomerInsert.

Рисунок 1- Наполнение таблицы customer до выполнения процедуры CustomerInsert

Рисунок 2 - Наполнение таблицы customer_artist_int до выполнения процедуры CustomerInsert

Рисунок 3- Выполнение процедур CustomerInsert

Рисунок 4 - Наполнение таблицы customer после выполнения процедуры CustomerInsert

Рисунок 5 - Наполнение таблицы customer_artist_int после выполнения процедуры CustomerInsert

  1. Добавим в таблицу CUSTOMER новое поле second_name

  1. Модифицируем процедуру 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;

  1. Для того, чтобы протестировать вставку данных при помощи процедуры 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