SELECT CASE param_name END CASE INTO @var в хранимой процедуре с использованием параметров для назначения столбцов - PullRequest
0 голосов
/ 24 октября 2018

У меня есть хранимая процедура, которую я пытаюсь создать с параметрами.

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 в хранимой процедуре Любая помощь приветствуется!

1 Ответ

0 голосов
/ 24 октября 2018

Я бы переписал твой процесс как этот.См. Ниже код для дальнейшего объяснения.

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, которое вы изначально имели в начале вашего процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...