Итак, у меня есть несколько таблиц на MySQL:
CREATE TABLE IF NOT EXISTS `salarygrade` (
`GRADE` INT(11) NOT NULL,
`HOURLYRATE` FLOAT NOT NULL,
PRIMARY KEY (`GRADE`));
================================================================================
CREATE TABLE IF NOT EXISTS `staffongrade` (
`STAFFNO` INT(11) NOT NULL,
`GRADE` INT(11) NOT NULL,
`STARTDATE` DATE NULL DEFAULT NULL,
`FINISHDATE` DATE NULL DEFAULT NULL,
INDEX `STAFFONGRADE_FK` (`STAFFNO` ASC),
INDEX `STAFFONGRADE2_FK` (`GRADE` ASC),
PRIMARY KEY (`GRADE`, `STAFFNO`),
CONSTRAINT `FK_STAFFONG_STAFFONGR_SALARYGR`
FOREIGN KEY (`GRADE`)
REFERENCES `salarygrade` (`GRADE`),
CONSTRAINT `FK_STAFFONG_STAFFONGR_STAFF`
FOREIGN KEY (`STAFFNO`)
REFERENCES `staff` (`STAFFNO`));
================================================================================
CREATE TABLE IF NOT EXISTS `campaign` (
`CAMPAIGN_NO` INT(11) NOT NULL,
`TITLE` VARCHAR(30) NOT NULL,
`CUSTOMER_ID` INT(11) NOT NULL,
`THEME` VARCHAR(40) NULL DEFAULT NULL,
`CAMPAIGNSTARTDATE` DATE NULL DEFAULT NULL,
`CAMPAIGNFINISHDATE` DATE NULL DEFAULT NULL,
`ESTIMATEDCOST` INT(11) NULL DEFAULT NULL,
`ACTUALCOST` FLOAT NULL DEFAULT NULL,
PRIMARY KEY (`CAMPAIGN_NO`),
INDEX `OWNS_FK` (`CUSTOMER_ID` ASC),
CONSTRAINT `FK_CAMPAIGN_OWNS_CUSTOMER`
FOREIGN KEY (`CUSTOMER_ID`)
REFERENCES `customer` (`CUSTOMER_ID`)
ON DELETE RESTRICT
ON UPDATE RESTRICT);
===========================================================================
CREATE TABLE IF NOT EXISTS `workson` (
`STAFFNO` INT(11) NOT NULL,
`CAMPAIGN_NO` INT(11) NOT NULL,
`WDATE` DATE NOT NULL,
`HOUR` FLOAT NULL DEFAULT NULL,
PRIMARY KEY (`STAFFNO`, `CAMPAIGN_NO`, `WDATE`),
INDEX `WORKSON_FK` (`STAFFNO` ASC),
INDEX `FK_WORKSON_WORKSON2_CAMPAIGN_idx` (`CAMPAIGN_NO` ASC),
CONSTRAINT `FK_WORKSON_WORKSON2_CAMPAIGN`
FOREIGN KEY (`CAMPAIGN_NO`)
REFERENCES `campaign` (`CAMPAIGN_NO`)
ON DELETE RESTRICT
ON UPDATE RESTRICT,
CONSTRAINT `FK_WORKSON_WORKSON_STAFF`
FOREIGN KEY (`STAFFNO`)
REFERENCES `staff` (`STAFFNO`));
И я хочу создать хранимую процедуру с именем sp_finish_campaign (in c_title varchar(30))
, которая принимает название кампании и завершает кампанию, обновляя CAMPAIGNFINISHDATE
на текущую дату и ACTUALCOST
на стоимость кампании, которая рассчитывается исходя из количества часов, отведенных на нее разными сотрудниками в разные даты, и уровня заработной платы (это изменяется в зависимости от идентификатора персонала и временных рамок на основеSTARTDATE
и FINISHDATE
таблицы staffongrade
.
Для вычисления ACTUALCOST
я создал вспомогательную функцию:
DELIMITER //
CREATE FUNCTION rate_on_date(staff_id int, given_date date)
RETURNS int
DETERMINISTIC
BEGIN
DECLARE salaryGrade int;
SET salaryGrade = (select grade from staffongrade
where staffno = staff_id AND (given_date BETWEEN STARTDATE AND FINISHDATE));
RETURN salaryGrade;
END //
DELIMITER ;
, которая возвращает выплату grade
на основедля параметров staff_id
и given_date
я даю:
select rate_on_date(1, "2018-02-02") as Grade_On_Date;
Для параметраЯ полагаю, что мне придется получить его из таблицы workson
, которая выглядит следующим образом:
Я пытался использовать оператор выборачтобы получить выплату:
select hourlyrate as 'grade' from salarygrade
where rate_on_date(1, "2018-02-02") = grade;
Для расчета ACTUALCOST
Я предполагаю, что мне нужно будет сделать расчет поумножить столбец HOUR
на стоимость оценки и использовать столбцы WDATE
и STAFFNO
в таблице workson
в качестве параметров для моей хранимой процедуры, которая рассчитает и обновит CAMPAIGNFINISHDATE
и ACTUALCOST
кампанииввод названия кампании в него. Но как мне это сделать?
Я просто не понимаю, как делать эту процедуру, а также не совсем понимаю, как правильно использовать эти вспомогательные функции в моей хранимой процедуре. Я чувствую, что этот вопрос довольно длинный, но я не знаю, что спросить, и в каком направлении я должен идти, чтобы решить эту проблему.