У меня есть хранимая процедура, которую я пытаюсь создать с параметрами.
DELIMITER //
CREATE PROCEDURE insert_avg(IN area INT, IN checkid INT, IN legend INT)
this_proc: BEGIN
SELECT
CASE legend
WHEN 1 THEN "Input_Day"
WHEN 2 THEN "Input_Week"
WHEN 3 THEN "Input_Month"
ELSE LEAVE this_proc
END CASE;
INTO @LEGEND;
INSERT INTO
'input_teamboards'
(
'Input_KPI',
'Input_Month',
'Input_Week',
'Input_Day',
'Input_Value',
'Input_Comparison',
'Input_Area',
'Input_Created'
)
VALUES
(
7,
IFNULL(SELECT 'Input_Month' FROM 'input' WHERE 'check_id' = checkid, NULL, MONTH(NOW())),
IFNULL(SELECT 'Input_Week' FROM 'input' WHERE 'check_id' = checkid, NULL, WEEKOFYEAR(NOW())),
IFNULL(SELECT 'Input_Day' FROM 'input' WHERE 'check_id' = checkid, NULL, DAYOFYEAR(NOW())),
(SELECT
AVG('Input_value')
FROM
'input'
WHERE
'Area_ID' = area AND @LEGEND = 1),
2,
area,
NOW()
)
END//
DELIMITER ;
Как вы можете видеть, переменная @LEGEND
используется как часть подзапроса для имени столбца ниже.
У меня проблема с оператором case, он продолжает выдавать ошибки внутри оператора case:
"# 1064 - у вас есть ошибка в вашем синтаксисе SQL; проверьте правильность синтаксиса в руководстве, соответствующем вашей версии сервера MariaDB, рядом с" LEAVE this_proc END CASE; INTO @LEGEND; INSERT INTO
input_teamboards
"в строке 8"
Я использовал эти ссылки до сих пор, но застрял на том, что я делаю неправильно?
Mysql Сохранение переменной с результатом SELECT CASE
Mysql - Как выйти/выйти из хранимой процедуры
инструкция case в хранимой процедуре
Любая помощь приветствуется!
Я бы переписал твой процесс как этот. Смотрите ниже код для дальнейшего объяснения.
DELIMITER //
CREATE PROCEDURE insert_avg(IN area INT, IN checkid INT, IN legend INT)
this_proc:BEGIN
IF legend NOT IN (1, 2, 3)
LEAVE this_proc;
END IF;
INSERT INTO input_teamboards
(
Input_KPI,
Input_Month,
Input_Week,
Input_Day,
Input_Value,
Input_Comparision,
Input_Area,
Input_Created
)
SELECT
7,
COALESCE(Input_Month, MONTH(NOW())),
COALESCE(Input_Week, WEEKOFYEAR(NOW())),
COALESCE(Input_Day, DAYOFYEAR(NOW())),
(SELECT AVG(Input_value) FROM input WHERE Area_ID = area AND
((legend = 1 AND Input_Day = 1) OR
(legend = 2 AND Input_Week = 1) OR
(legend = 3 AND Input_Month = 1))),
2,
area,
NOW()
FROM input
WHERE check_id = checkid;
END//
DELIMITER ;
Основное изменение, которое я сделал здесь, - переписать ваш запрос вставки. Я перефразировал это как INSERT INTO... SELECT
. Это должно работать, потому что большинство ваших подзапросов ссылались на одну и ту же таблицу input
. Для среднего подзапроса я обработал логику с параметром legend
, просто проверив его значение, а затем проверив соответствующий соответствующий столбец. Это позволяет нам удалить выражение CASE
вы изначально имели в начале вашего процесса.
IF legend < 1 OR legend > 3
должно быть legend not in (1,2,3)
если legend
имеет значение NULL.
Input_Day
,Input_Week
иInput_Month