Материал: tbd56

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

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

Ордена Трудового Красного Знамени

Федеральное государственное бюджетное образовательное учреждение высшего образования

МОСКОВСКИЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ СВЯЗИ И ИНФОРМАТИКИ

ФАКУЛЬТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ

ЛАБОРАТОРНАЯ РАБОТА №5-6

по дисциплине «ТЕХНОЛОГИИ БАЗ ДАНЫХ»

Кафедра ИСУиА

Выполнил:

МОСКВА, 2018 г.

Цель работы:

Знакомство с PL/SQL, разработка процедур.

Задачи:

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

Ход работы:

Модифицируем процедуру CustomerInsert, данную в работе, в соответствии с требованиями из задания. Текст процедуры приведен ниже:

CREATE OR REPLACE PROCEDURE CustomerInsert(

newname IN CHAR, newstreet IN CHAR, newcity IN CHAR, newstate IN CHAR,

newzip IN CHAR, newareacode IN CHAR, newphone IN CHAR, artistnationality IN CHAR

) AS rowcount INT(4);

CURSOR artistcursor IS

SELECT ArtistID FROM ARTIST WHERE Nationality = artistnationality;

BEGIN

SELECT COUNT(*) INTO rowcount FROM CUSTOMER WHERE

Name = newname AND Street = newstreet AND City = newcity AND

State = newstate AND Zip = newzip AND Area_Code = newareacode AND Phone_Number = newphone;

IF rowcount > 0 THEN

BEGIN

DBMS_OUTPUT.PUT_LINE ('Client already exists in database. No actions were made');

RETURN;

END;

END IF;

INSERT INTO CUSTOMER VALUES (CustID.NextVal, newname, newstreet, newcity, newstate, newzip, newareacode, newphone);

FOR artist IN artistcursor LOOP

INSERT INTO CUSTOMER_ARTIST (CustomerID, ArtistID) VALUES (CustID.CurrVal, ARTIST.ArtistID);

END LOOP;

DBMS_OUTPUT.PUT_LINE('New client has been added');

END;

/

Добавим нового клиента с помощью этой процедуры (рисунок 1):

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

Добавим в таблицу CUSTOMER новую колонку Second_Name и модифицируем процедуру 2 в соответствии с этим. Текст процедуры представлен ниже:

CREATE OR REPLACE PROCEDURE NewCustomerWithTransaction(

newname IN char, newsecondname IN char, newareacode IN char, newphone IN char,

artistname IN char, worktitle IN char, workcopy IN char, price IN number

) AS

rowcount integer(2);

tid int;

aid int;

CURSOR transcursor IS

SELECT TransactionID, ARTIST.ArtistID FROM ARTIST, WORK, TRANSACTION WHERE Name=artistname AND Title = worktitle AND Copy = workcopy AND TRANSACTION.CustomerID IS NULL AND ARTIST.ArtistID = 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 AND Second_Name = newsecondname;

IF rowcount > 0 THEN

BEGIN

DBMS_OUTPUT.PUT_LINE('Customer already exists');

RETURN;

END;

END IF;

INSERT INTO CUSTOMER (CustomerID,Name,Area_code, Phone_number, Second_Name) VALUES (CustID.NextVal, newname, newareacode, newphone, newsecondname);

rowcount:=0;

DBMS_OUTPUT.PUT_LINE('Customer has been added');

FOR trans IN transcursor

LOOP

DBMS_OUTPUT.PUT_LINE('Got here');

tid:=trans.TransactionID;

aid:=trans.ArtistID;

rowcount:=rowcount+1;

END LOOP;

IF rowcount > 1 THEN

BEGIN

ROLLBACK;

DBMS_OUTPUT.PUT_LINE('Wrong data in ARTIST/WORK/TRANSACTION');

RETURN;

END;

END IF;

IF rowcount = 0 THEN

BEGIN

ROLLBACK;

DBMS_OUTPUT.PUT_LINE('No available rows in 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('Client has been added to the Database');

INSERT INTO CUSTOMER_ARTIST (ArtistID, CustomerID) VALUES (aid, CustID.CurrVal);

END;

/

Вызовем данную процедуру и проверим ее выполнение (рисунки 2-4):

Р исунок 2 – Компиляция процедуры

Рисунок 3 – Проверка выполнения процедуры

Рисунок 4 – Проверка выполнения процедуры

Создадим свою процедуру WorkInsertion. Ее текст приведен ниже:

CREATE OR REPLACE PROCEDURE WorkInsertion(

newworkname IN char, newcopy IN char, newartistname IN char, newinptice IN char

)

AS

rowcount int(2);

artid number(38);

BEGIN

SELECT COUNT(*) INTO rowcount FROM WORK WHERE Title=newworkname AND ArtistID = (SELECT ArtistID FROM ARTIST WHERE Name = newartistname);

IF rowcount>0 THEN

BEGIN

DBMS_OUTPUT.PUT_LINE ('This work is already in database');

RETURN;

END;

END IF;

SELECT ArtistID INTO artid FROM ARTIST WHERE Name = newartistname;

INSERT INTO WORK(WorkID, Title, Copy, ArtistID) VALUES (WorkID.NextVal, newworkname, newcopy, artid);

INSERT INTO TRANSACTION(TransactionID, DateAcquired, AcquisitionPrice, WorkID) VALUES (TransID.NextVal, SysDate, newinptice, WorkID.CurrVal);

END;

/

Данная процедура добавляет новую картину художника и создает свободную транзакцию на ее покупку. Скомпилируем ее и проверим работу (рисунки 5-6).

Рисунок 5 – Компиляция и выполнение процедуры

Рисунок 6 – Результат выполнения процедуры