Лабораторные № 5-6
.docx
Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации
Ордена Трудового Красного Знамени
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Московский технический университет связи и информатики»
Кафедра «Интеллектуальные системы в управлении и автоматизации»
Отчет по лабораторным работам №5-6
по дисциплине «Технологии баз данных»
Выполнил: Кондратьев И.В
Студент группы БСТ1851
Создать хранимую процедуру Customer_Insert
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 ArtistID
FROM ARTIST
WHERE Nationality=artistnationality;
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
(CustomerID,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.ArtistID);
END LOOP;
DBMS_OUTPUT.PUT_LINE ('Новый клиент успешно добавлен в базу ');
END;
Exec CustomerInsert('Selma Warning', '206', '555-0099', 'US');
select * from CUSTOMER;
Создадим процедуру NewCustomerWithTransaction
CREATE OR REPLACE PROCEDURE NewCustomerWithTransaction
(
newname 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;
IF rowcount > 0 THEN
BEGIN
DBMS_OUTPUT.PUT_LINE('Customer Already Exists, changes denied');
RETURN;
END;
END IF;
INSERT INTO CUSTOMER(CustomerID,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('Wrong records in ARTIST/WORK/TRANSACTION, changes denied');
RETURN;
END;
END IF;
IF rowcount=0 THEN
BEGIN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('There are no available lines in TRANSACTION, changes denied');
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 successfully added');
INSERT INTO CUSTOMER_ARTIST_INT(ArtistID,CustomerID) VALUES (aid,CustID.CurrVal);
END;
Exec NewCustomerWithTransaction( 'ABC', '12', '12', '12', '12', '12', '12');
SELECT CUSTOMER.Name, Copy, Title, ARTIST.Name
FROM CUSTOMER, TRANSACTION, WORK, ARTIST
WHERE CUSTOMER.CustomerID = TRANSACTION.CustomerID AND
TRANSACTION.WorkID = WORK.WorkID AND
WORK.ArtistID = ARTIST.ArtistID;
SELECT CUSTOMER.Name, ARTIST.Name
FROM CUSTOMER, CUSTOMER_ARTIST_INT, ARTIST
WHERE CUSTOMER.CustomerID = CUSTOMER_ARTIST_INT.CustomerID
AND
ARTIST.ArtistID= CUSTOMER_ARTIST_INT.ArtistID;
Задания
Модифицировать процедуру 1, обеспечив добавление всех данных о новых покупателях с учетом их интереса к художникам определенных национальностей. Добавьте 2 новых покупателей (вызов процедуры 1)
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 integer(4);
CURSOR artistcursor IS SELECT ArtistID FROM ARTIST WHERE
Nationality=artistnationality;
BEGIN
SELECT Count(*) INTO rowcount
FROM CUSTOMER
WHERE Name=newname
AND Area_code=newareacode
AND Phone_Number=newphone
AND State=newstate
AND City = newcity;
IF rowcount > 0 THEN
BEGIN
DBMS_OUTPUT.PUT_LINE('Клиент уже есть в базе данных - никаких действий не предпринято');
RETURN;
END;
END IF;
INSERT INTO CUSTOMER (CustomerID,Name, Street, City, State, ZIP,Area_Code,Phone_Number) Values (CustID.NextVal,newname,newstreet,newcity,newstate,newZIP,newareacode,newphone);
FOR artist IN artistcursor LOOP
INSERT INTO CUSTOMER_ARTIST_INT(CustomerID,ArtistID) VALUES
(CustID.CurrVal,artist.ArtistID);
END LOOP;
DBMS_OUTPUT.PUT_LINE('Новый клиент успешно добавлен в базу');
END;
Exec CustomerInsert( 'A11','A1','A1','A1','A1','A1','A1','A1');
Exec CustomerInsert( 'A22','A2','A2','A2','A2','A2','A2','A2');
Добавить в таблицу CUSTOMER новое поле Second_Name
alter table Customer
add Second_Name varchar(25) NULL;
Модифицировать 2 процедуру
CREATE OR REPLACE PROCEDURE NewCustomerWithTransaction
(
newname IN char,
newstreet in char,
newcity in char,
newstate in char,
newZIP in char,
newareacode IN char,
newphone IN char,
newsecondname 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;
IF rowcount > 0 THEN
BEGIN
DBMS_OUTPUT.PUT_LINE('Customer Already Exists, changes denied');
RETURN;
END;
END IF;
INSERT INTO CUSTOMER (CustomerID,Name, Street, City, State, ZIP,Area_Code,Phone_Number, Second_Name) Values (CustID.NextVal,newname,newstreet,newcity,newstate,newZIP,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('Wrong records in ARTIST/WORK/TRANSACTION, changes denied');
RETURN;
END;
END IF;
IF rowcount=0 THEN
BEGIN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('There are no available lines in TRANSACTION, changes denied');
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 successfully added');
INSERT INTO CUSTOMER_ARTIST_INT(ArtistID,CustomerID) VALUES (aid,CustID.CurrVal);
END;
Exec NewCustomerWithTransaction( 'GG', 'G1', 'G1', 'G11', 'G1', 'G1', 'G1', 'G1', 'G1', 'G1', 'G1', '11');
Exec NewCustomerWithTransaction( 'B22', 'B2', 'B2', 'B2', 'B2', 'B2', 'B2', 'B2', 'B2', 'B2', 'B2', '22');
Москва 2021