Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прокат автомобилей.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
18.5 Mб
Скачать
  1. Курсоры

Курсор DisplayClients выводит информацию о клиентах, и список арендованных ими автомобилей соответственно.

DROP PROCEDURE DisplayClientAndTheirRentedCars

GO

CREATE PROCEDURE DisplayClientAndTheirRentedCars AS

DECLARE DisplayClients CURSOR

FOR

SELECT c.client_id

,c.name

,c.phone

FROM [dbo].[client] as c

OPEN DisplayClients

DECLARE @ClientID int

DECLARE @Name varchar(50)

DECLARE @Phone varchar(15)

DECLARE @DisplayAll varchar(100)

FETCH NEXT FROM DisplayClients into @ClientID,@Name,@Phone

WHILE @@FETCH_STATUS <> -1

BEGIN

DECLARE DisplayCarNumber CURSOR

FOR

SELECT DISTINCT contr.car_number

FROM [dbo].[contract] as contr

WHERE contr.client_id = @ClientID

OPEN DisplayCarNumber

declare @car_number varchar(50)

FETCH NEXT FROM DisplayCarNumber into @car_number

SET @DisplayAll = @Name + ', ' + @Phone + ' - '

WHILE @@FETCH_STATUS = 0

BEGIN

SET @DisplayAll = @DisplayAll + @car_number + ', '

FETCH NEXT FROM DisplayCarNumber into @car_number

END

CLOSE DisplayCarNumber

DEALLOCATE DisplayCarNumber

FETCH NEXT FROM DisplayClients into @ClientID,@Name,@Phone

PRINT left(@DisplayAll,LEN(@DisplayAll)-1)

END

CLOSE DisplayClients

DEALLOCATE DisplayClients

GO

EXEC DisplayClientAndTheirRentedCars

GO

Курсор DisplayClients выводит информацию о клиентах, и список арендованных ими автомобилей соответственно.

DROP PROCEDURE DemandForCar

GO

CREATE PROCEDURE DemandForCar AS

DECLARE @car_number varchar(9)

DECLARE @date date

DECLARE @count int

DELETE FROM car_demand

DECLARE @DemandForCar CURSOR

SET @DemandForCar = CURSOR SCROLL

FOR

SELECT c.car_number

FROM dbo.car as c

OPEN @DemandForCar

FETCH NEXT FROM @DemandForCar INTO @car_number

WHILE @@FETCH_STATUS =0

BEGIN

SET @date=GETDATE()

SELECT @count = DATEDIFF(MONTH, cont.date_of_end, @date)

FROM dbo.car as c

INNER JOIN dbo.contract as cont

on c.car_number=cont.car_number

WHERE c.car_number=@car_number

IF @count > 3

BEGIN

INSERT INTO car_demand (car_number,count_month, date_time,recomends)

VALUES(@car_number,@count,@date,'Невостребованный автомобиль')

END

else

INSERT INTO car_demand (car_number,count_month, date_time,recomends)

VALUES(@car_number,@count,@date, 'Востребованный автомобиль')

FETCH NEXT FROM @DemandForCar INTO @car_number

END

CLOSE @DemandForCar

GO

EXEC DemandForCar

GO

  1. Триггеры

Триггер report_attempts_car_rental при добавлении в таблицу contract еще одной строки с информацией о контракте, изменяет статут автомобиля в таблице car. Если же данный автомобиль уже занят или находиться на обслуживании, то триггер выдает ошибку. А информация о попытке выдать занятый автомобиль вноситься в таблицу car_logs, в частности данные кто и когда пытался выдать автомобиль.

--Создание триггера

DROP TRIGGER report_attempts_car_rental

GO

CREATE TRIGGER report_attempts_car_rental

ON [dbo].[contract]

for INSERT

AS

BEGIN

DECLARE INS CURSOR

FOR SELECT i.contract_number,i.car_number

FROM inserted i

OPEN INS

DECLARE @ContractID int

DECLARE @CarNumber varchar(9)

FETCH NEXT FROM INS into @ContractID,@CarNumber

WHILE(@@FETCH_STATUS <> - 1 )

BEGIN

IF((SELECT c.willingness_to_lease_id

FROM [dbo].[car] as c

WHERE c.car_number = @CarNumber) <> 1)

BEGIN

DELETE FROM contract

WHERE contract.contract_number = @ContractID;

DECLARE @log varchar(50) = 'Автомобиль: ' + @CarNumber + ' занят '

insert into car_logs

(date_logs,user_name, car_number)

values

(GETDATE(),SUSER_NAME(),@CarNumber)

--END

FETCH NEXT FROM INS into @ContractID,@CarNumber

RAISERROR(@log,10,10)

END

ELSE BEGIN

UPDATE car

SET car.willingness_to_lease_id = 2

FROM [dbo].[car]

WHERE @CarNumber = car.car_number

FETCH NEXT FROM INS into @ContractID,@CarNumber

END

END

CLOSE INS

DEALLOCATE INS

END

GO

--ДО

- -Таблица contract

--Таблица car

INSERT INTO contract (contract_number, client_id, employee_id, car_number,

duration_of_lease, date_of_signing, date_of_payment, date_of_end, payment_status_id)

VALUES (7500, 2, 1,'А164АУ154', 7,'2015.11.18','','2015.11.25', 1)

--ПОСЛЕ --Удачное добавление

--Ошибка добавления

Триггер report_logs_trigger при удалении отчета работника, в таблицу report_logs заносятся данные об удалении.

--Создание триггера report_logs_trigger

DROP TRIGGER report_logs_trigger

GO

CREATE TRIGGER report_logs_trigger

ON [dbo].[report]

FOR delete

as

INSERT into report_logs

SELECT Getdate()

,Suser_name()

,d.report_id

,d.employee_id

,d.car_number

,d.contract_number

,d.information_damage

,d.amount_maintenance

,d.status_car_id

FROM deleted as d

GO

ДО:

--Состояние таблицы report до удаления

--Удаление DELETE FROM car_rental.dbo.report WHERE report_id = 1; GO

ПОСЛЕ:

--Таблица report

- -Таблица report_logs