Файл: Практикум направление подготовки 09. 03. 03 Прикладная информатика Уровень высшего образования Бакалавриат.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 17.03.2024

Просмотров: 64

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
k_bill, содержащая внешний ключ.

Таблицы k_bill (Счета) и k_payment (Платежи) связаны связью «Произведена оплата счета» (см. рис. 10.1) с мощностью 1:М. Эта связь означает, что по одному счету может быть произведено несколько оплат, но каждая оплата относится к одному и только одному счету. В этой связи дочерней является таблица k_payment, содержащая внешний ключ. Для связывания используется идентифицирующая связь, включающая атрибут номер счета (bill_num) в состав атрибутов первичного ключа таблицы k_payment. Использование идентифицирующей связи означает, что для идентификации платежа недостаточно его номера, требуется указание номера счета, по которому произведен платеж.

3. SQL-скрипт для создания и заполнения БД «Продажи» (sales):

CREATE database sales;

USE sales;
CREATE TABLE k_staff (

staff_num INT NOT NULL AUTO_INCREMENT,

staff_name VARCHAR(45) NOT NULL,

staff_post VARCHAR(45) NULL,

staff_hiredate DATE NULL,

staff_termdate DATE NULL,

k_dept_dept_num INT NOT NULL,

PRIMARY KEY (staff_num));
CREATE TABLE k_dept (

dept_num INT NOT NULL AUTO_INCREMENT,

dept_full_name VARCHAR(45),

dept_short_name VARCHAR(10),

k_staff_staff_num INT NULL DEFAULT NULL,

PRIMARY KEY (dept_num));
alter table k_staff add CONSTRAINT fk_k_staff_k_dept1 FOREIGN KEY (k_dept_dept_num) REFERENCES k_dept (dept_num) ON DELETE NO ACTION ON UPDATE NO ACTION;
alter table k_dept add CONSTRAINT fk_k_dept_k_staff1 FOREIGN KEY (k_staff_staff_num) REFERENCES k_staff (staff_num) ON DELETE NO ACTION ON UPDATE NO ACTION;

CREATE TABLE k_firm (

firm_num INT NOT NULL AUTO_INCREMENT,

firm_name VARCHAR(45) NOT NULL,

firm_addr VARCHAR(45) NULL,

firm_phone VARCHAR(20) NULL,

PRIMARY KEY (firm_num));
CREATE TABLE k_contract (

contract_num INT NOT NULL AUTO_INCREMENT,

contract_date DATE NOT NULL,

contract_type ENUM('A','B','C') NOT NULL,

k_firm_firm_num INT NOT NULL,

k_staff_staff_num INT NOT NULL,

PRIMARY KEY (contract_num),

CONSTRAINT fk_k_kontrakt_k_firm1

FOREIGN KEY (k_firm_firm_num) REFERENCES k_firm (firm_num)

ON DELETE NO ACTION ON UPDATE NO ACTION,

CONSTRAINT fk_k_kontrakt_k_staff1

FOREIGN KEY (k_staff_staff_num) REFERENCES k_staff (staff_num)

ON DELETE NO ACTION ON UPDATE NO ACTION);
CREATE TABLE k_bill (

bill_num INT NOT NULL AUTO_INCREMENT,

bill_date DATE NOT NULL,

bill_sum DECIMAL(9,2) NOT NULL,

bill_term DATE NOT NULL,

bill_peni DECIMAL(6,2) NULL,

k_contract_contract_num INT NOT NULL,

PRIMARY KEY (bill_num),

CONSTRAINT fk_k_bill_k_contract1

FOREIGN KEY (k_contract_contract_num) REFERENCES k_contract (contract_num)

ON DELETE NO ACTION ON UPDATE NO ACTION);
CREATE TABLE k_payment (


payment_num INT NOT NULL,

payment_date DATE NOT NULL,

payment_sum DECIMAL(9,2) NOT NULL,

k_bill_bill_num INT NOT NULL,

PRIMARY KEY (payment_num, k_bill_bill_num),

CONSTRAINT fk_k_payment_k_bill1

FOREIGN KEY (k_bill_bill_num) REFERENCES k_bill (bill_num)

ON DELETE NO ACTION ON UPDATE NO ACTION);
CREATE TABLE k_price (

price_num INT NOT NULL AUTO_INCREMENT,

price_name VARCHAR(45) NOT NULL,

price_sum DECIMAL(9,2) NULL,

price_type VARCHAR(1) NULL,

PRIMARY KEY (price_num));
CREATE TABLE k_protokol (

k_bill_bill_num INT NOT NULL,

k_price_price_num INT NOT NULL,

kolvo INT NOT NULL,

price_sum DECIMAL(9,2) NOT NULL,

PRIMARY KEY (K_bill_bill_num, k_price_price_num),

CONSTRAINT fk_k_bill_has_k_price_k_bill1

FOREIGN KEY (k_bill_bill_num) REFERENCES k_bill (bill_num)

ON DELETE NO ACTION ON UPDATE NO ACTION,

CONSTRAINT fk_k_bill_has_k_price_K_price1

FOREIGN KEY (k_price_price_num) REFERENCES k_price (price_num)

ON DELETE NO ACTION ON UPDATE NO ACTION);
# Заполнение
INSERT INTO k_firm (firm_name, firm_addr)

VALUES('Альфа', 'Москва');

INSERT INTO k_firm (firm_name, firm_addr)

VALUES('Бета', 'Казань');

INSERT INTO k_firm (firm_name, firm_addr)

VALUES('Гамма', 'Париж');

INSERT INTO k_firm (firm_name, firm_addr)

VALUES('Дельта', 'Лондон');

INSERT INTO k_firm (firm_name, firm_addr)

VALUES('Омега', 'Токио');
INSERT INTO k_dept (dept_short_name, dept_full_name)

VALUES('Sales', 'Отдел продаж');

INSERT INTO k_dept (dept_short_name, dept_full_name)

VALUES('Mart', 'Отдел маркетинга');

INSERT INTO k_dept (dept_short_name, dept_full_name)

VALUES('Cust', 'Отдел гарантийного обслуживания');
INSERT INTO k_staff (staff_name, k_dept_dept_num, staff_hiredate, staff_post)

VALUES('Иванов', 1, '1999-01-01', 'Менеджер');

INSERT INTO k_staff (staff_name, k_dept_dept_num, staff_hiredate, staff_post)

VALUES('Петров', 2, '2010-10-13','Менеджер');

INSERT INTO k_staff (staff_name, k_dept_dept_num, staff_hiredate, staff_post)

VALUES('Сидоров', 3, '2005-12-01','Менеджер');

INSERT INTO k_staff (staff_name, k_dept_dept_num, staff_hiredate, staff_post)

VALUES('Семенов', 1, '1990-01-01','Директор');

INSERT INTO k_staff (staff_name, k_dept_dept_num, staff_hiredate, staff_post)

VALUES('Григорьев', 3, '2008-12-19','Программист');
INSERT INTO k_contract

(contract_type, k_firm_firm_num, k_staff_staff_num, contract_date) VALUES('A', 1, 1,'2011-11-01');

INSERT INTO k_contract

(contract_type, k_firm_firm_num, k_staff_staff_num, contract_date) VALUES('B', 1, 2,'2011-10-01');

INSERT INTO k_contract

(contract_type, k_firm_firm_num, k_staff_staff_num, contract_date) VALUES('C', 1, 1,'2011-09-01');

INSERT INTO k_contract

(contract_type, k_firm_firm_num, k_staff_staff_num, contract_date) VALUES('A', 2, 2,'2011-11-15');

INSERT INTO k_contract

(contract_type, k_firm_firm_num, k_staff_staff_num, contract_date) VALUES('B', 2, 2,'2011-08-01');

INSERT INTO k_contract

(contract_type, k_firm_firm_num, k_staff_staff_num, contract_date) VALUES('C', 3, 1,'2011-07-15');



INSERT INTO k_contract

(contract_type, k_firm_firm_num, k_staff_staff_num, contract_date) VALUES('A', 4, 1,'2011-11-12');
INSERT INTO k_bill

(k_contract_contract_num, bill_date, bill_term, bill_sum)

VALUES(1, '2011-11-12', '2011-12-12', 1000);

INSERT INTO k_bill

(k_contract_contract_num, bill_date, bill_term, bill_sum)

VALUES(1, '2011-12-12', '2012-01-12', 2000);

INSERT INTO k_bill

(k_contract_contract_num, bill_date, bill_term, bill_sum)

VALUES(1, '2012-01-12', '2012-02-12',2000);

INSERT INTO k_bill

(k_contract_contract_num, bill_date, bill_term, bill_sum)

VALUES(2, '2011-12-12', '2012-01-12', 6000);

INSERT INTO k_bill

(k_contract_contract_num, bill_date, bill_term, bill_sum)

VALUES(2, '2012-01-12', '2012-02-12', 2000);

INSERT INTO k_bill

(k_contract_contract_num, bill_date, bill_term, bill_sum)

VALUES(3, '2012-01-12', '2012-02-12', 2500);

INSERT INTO k_bill

(k_contract_contract_num, bill_date, bill_term, bill_sum)

VALUES(4, '2011-12-12', '2012-01-12', 1500);

INSERT INTO k_bill

(k_contract_contract_num, bill_date, bill_term, bill_sum)

VALUES(5, '2011-12-12', '2012-01-12', 1200);

INSERT INTO k_bill

(k_contract_contract_num, bill_date, bill_term, bill_sum)

VALUES(5, '2012-01-12', '2012-02-12', 10000);
INSERT INTO k_price (price_num, price_name, price_sum, price_type)

VALUES (1, 'Материализация духов', 1000.00, 'У');

INSERT INTO k_price (price_num, price_name, price_sum, price_type)

VALUES (2, 'Раздача слонов', 100.00, 'У');

INSERT INTO k_price (price_num, price_name, price_sum, price_type)

VALUES (3, 'Слоновый бивень', 3000.00, 'Т');

INSERT INTO k_price (price_num, price_name, price_sum, price_type)

VALUES (4, 'Моржовый клык', 1500.00, 'Т');

INSERT INTO k_price (price_num, price_name, price_sum, price_type)

VALUES (5, 'Копыто пегаса', 5000.00, 'Т');
# Отключение режима safe mode (запрет изменений без указания первичного ключа)

# при помощи команды SQL

# Если режим safe mode включен, то MySQL-сервер выдает ошибку 1175
SET SQL_SAFE_UPDATES = 0;
UPDATE k_dept SET k_staff_staff_num=2

WHERE dept_short_name='Mart';

UPDATE k_dept SET k_staff_staff_num=3

WHERE dept_short_name='Cust';

UPDATE k_dept SET k_staff_staff_num=1

WHERE dept_short_name='Sales';
INSERT INTO k_protokol (k_bill_bill_num, k_price_price_num, kolvo, price_sum)

VALUES (1, 1, 1, 1000.00);

INSERT INTO k_protokol (k_bill_bill_num, K_price_price_num, kolvo, price_sum)

VALUES (2, 1, 2, 1000.00);

INSERT INTO k_protokol (K_bill_bill_num, K_price_price_num, kolvo, price_sum)

VALUES (3, 2, 20, 100.00);

INSERT INTO k_protokol (K_bill_bill_num, K_price_price_num, kolvo, price_sum)

VALUES (4, 3, 2, 3000.00);

INSERT INTO k_protokol (k_bill_bill_num, k_price_price_num, kolvo, price_sum)

VALUES (5, 1, 1, 1000.00);

INSERT INTO k_protokol (k_bill_bill_num, k_price_price_num, kolvo, price_sum)

VALUES (5, 2, 10, 100.00);

INSERT INTO k_protokol (k_bill_bill_num, K_price_price_num, kolvo, price_sum)


VALUES (6, 1, 2, 1000.00);

INSERT INTO k_protokol (k_bill_bill_num, k_price_price_num, kolvo, price_sum)

VALUES (6, 2, 5, 100.00);

INSERT INTO k_protokol (k_bill_bill_num, K_price_price_num, kolvo, price_sum)

VALUES (7, 4, 1, 1500.00);

INSERT INTO k_protokol (k_bill_bill_num, K_price_price_num, kolvo, price_sum)

VALUES (8, 1, 1, 1000.00);

INSERT INTO k_protokol (k_bill_bill_num, k_price_price_num, kolvo, price_sum)

VALUES (8, 2, 2, 100.00);

INSERT INTO k_protokol (k_bill_bill_num, k_price_price_num, kolvo, price_sum)

VALUES (9, 5, 2, 5000.00);
INSERT INTO k_payment (payment_num, payment_date, payment_sum, k_bill_bill_num)

VALUES (1, '2011-12-15', 1000.00, 2);

INSERT INTO k_payment (payment_num, payment_date, payment_sum, k_bill_bill_num)

VALUES (1, '2012-01-13', 1500.00, 3);

INSERT INTO k_payment (payment_num, payment_date, payment_sum, k_bill_bill_num)

VALUES (1, '2012-01-12', 1000.00, 4);

INSERT INTO k_payment (payment_num, payment_date, payment_sum, k_bill_bill_num)

VALUES (1, '2012-01-05', 100.00, 7);

INSERT INTO k_payment (payment_num, payment_date, payment_sum, k_bill_bill_num)

VALUES (1, '2011-12-25', 1000.00, 8);

INSERT INTO k_payment (payment_num, payment_date, payment_sum, k_bill_bill_num)

VALUES (2, '2012-01-15', 500.00, 3);

INSERT INTO k_payment (payment_num, payment_date, payment_sum, k_bill_bill_num)

VALUES (2, '2012-01-12', 900.00, 7);
Задание

  1. Создайте базу данных Sales (Продажи), используя приведенный выше SQL-скрипт.

  2. Реализуйте учебные примеры по написанию и запуску хранимых процедур к разработанной БД.

2.1 Создайте процедуру, которая в качестве параметра получает фамилию сотрудника и печатает список всех договоров, которые он курирует.

Для запуска этой процедуры нужно выполнить, например, команду



или





2.2 Создайте процедуру, которая получает номер месяца и номер года и печатает договоры за указанный период.



Выполним процедуру:



2.3 Создайте процедуру «Распродажа», которая находит самый непродаваемый (по количеству) товар и уценивает его на заданный процент.


Содержимое таблицы "Прайс-лист" до выполнения процедуры:


Для запуска этой процедуры нужно выполнить, например, команду:

Содержимое таблицы "Прайс-лист" после выполнения процедуры:


Как видим, товар с номером 4 в прайс-листе уценен на 10%.
А что произойдет, если в нашей базе данных есть несколько товаров, количество продаж которых минимально? К сожалению, в нашем случае процедура выдаст ошибку: Error Code: 1172, Result consisted of more than one row. Когда в команде SELECT выбирается сразу несколько значений поля k_price из таблицы k_protokol, невозможно присвоить эти несколько значений одной переменной p. Данную ситуацию можно обработать с помощью так называемых курсоров.

Курсор (current set of record) – это временный набор строк, которые можно перебирать последовательно, с первой до последней.

Для работы с курсорами существуют следующие команды.
Объявление курсора:

DECLARE имя_курсора CURSOR FOR SELECT текст_запроса;

Таким образом, любой курсор создается на основе некоторого оператора SELECT.

Открытие курсора:

OPEN имя_курсора;

Только после открытия курсора он становится активным, и из него можно читать строки.
Чтение значений из следующей строки курсора в набор переменных:

FETCH имя_курсора INTO список_переменных;

Переменные в списке должны иметь то же количество и тип, что и столбцы курсора.
Закрытие курсора:

CLOSE имя_курсора;

При переборе строк курсора возникает необходимость проверки, добрались ли мы до конца курсора или еще нет. В разных СУБД для этого могут быть предусмотрены разные средства. В СУБД MySQL назначается обработчик состояния “NOT FOUND”. Определять его нужно сразу же после описания структуры курсора:

DECLARE CONTINUE HANDLER FOR NOT FOUND оператор;

Например, этот обработчик может выглядеть так:

DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;