2015-09-17 5 views
0

У меня есть триггер, который хранит значение аргумента case в переменной @SHIFTIME, и это нормально работает, возвращая значения Shift1, Shift2 или Shift3. Теперь мне нужно использовать результат этой переменной в инструкции select, относящейся к COLUMN NAME. Я попытался хранить это в переменной @SHIFTSELECT:MySQL выбрать имя столбца из переменной

SET @SHIFTSELECT := (SELECT @SHIFTIME FROM `oee_machinenames` where `oee_machinenames`.`ID` = New.NAME); 

Так @SHIFTIME это имя столбца и я ожидаю @SHIFTSELECT интерпретировать это как:

SELECT `Shift1` FROM `oee_machinenames` where `oee_machinenames`.`ID` = New.NAME 

но проблема в том, что @SHIFTSELECT возвращается то же значение, что и @SHIFTIME, а именно имя столбца (Shift1, Shift2 или Shift3) вместо требуемого результата ROW. Это мой полный триггер:

CREATE TRIGGER `oee_upd_final` AFTER INSERT ON `oee_main_interim` 
FOR EACH ROW BEGIN 
DECLARE SHIFTIME TEXT; 
DECLARE SHIFTSELECT TEXT; 
SET @SHIFTIME := (Select 

     (Case 
     When ((CurTime() > oee_machinenames.Shift1) And 
     (CurTime() < oee_machinenames.Shift2)) Then 'Shift1' 
     When ((CurTime() > oee_machinenames.Shift2) And 
     (CurTime() < oee_machinenames.Shift3)) Then 'Shift2' 
     When ((CurTime() > oee_machinenames.Shift3) Or 
     (CurTime() < oee_machinenames.Shift1)) Then 'Shift3' End) 
    From 
     oee_machinenames 
     where 
     oee_machinenames.ID = New.NAME 

    Group By 
     oee_machinenames.ID); 

SET @SHIFTSELECT := (SELECT @SHIFTIME FROM `oee_machinenames` where `oee_machinenames`.`ID` = New.NAME); 


INSERT INTO `oee_main_interim_final` (id,NAME,ts,Left_IO,Left_NIO,Recovery,Right_IO, 
Right_NIO,RunMode,S_TYPE,Shift,STD,curr_S_Type,Reporting_Date, Shift_TS) 
VALUES(NULL, New.NAME, New.TS, NEW.Left_IO, New.Left_NIO, New.Recovery, New.Right_IO, New.Right_NIO, New.RunMode, New.S_TYPE, 


(select @SHIFTIME), 

    (Select 
    `STD` From `oee_variant` Where `Machine_ID` = New.NAME And `S_TYPE` = 

(Select 
    `S_TYPE` 

From 
    `v_getmaxid` 
Where 
    `NAME` = New.Name And 
    v_getmaxid.Max_id In (Select 
    Max(v_getmaxid.Max_id) As Max_Max_id 
    From 
    `v_getmaxid` 
    Where 
    `NAME` = New.Name)) 

    And `oee_variant`.`Operators` = 
    (Select `Operators` from `oee_machinenames` where `ID` = New.NAME)), 


(Select 
    `S_TYPE` 

From 
    `v_getmaxid` 
Where 
    `NAME` = New.Name And 
    v_getmaxid.Max_id In (Select 
    Max(v_getmaxid.Max_id) As Max_Max_id 
    From 
    `v_getmaxid` 
    Where 
    `NAME` = New.Name)), 

(select((case when (((@SHIFTIME = 'Shift3') and 
    (cast(New.TS as time) >= '00:00:01')) 
or (cast(New.TS as time) <= '05:59:00')) 
then (New.TS - interval 1 day) else cast(New.TS as date) end)) AS Reporting_Date), 

(SELECT @SHIFTSELECT) 

     ); 
     END 
+0

так, как я могу обойти эту проблему, пожалуйста? – elstiv

ответ

1

НЕТ, вы не можете использовать имя столбца в качестве переменной, если это не динамический запрос (или) вы делаете это в коде приложения. Динамический способ запроса будет как

SET @sql = CONCAT("SELECT ", @SHIFTIME," FROM `oee_machinenames` where `oee_machinenames`.`ID` = New.NAME"); 
PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

Затем измените подготовленное заявление, чтобы быть

SET @result = ''; 
SET @sql = CONCAT("SELECT ? INTO @result FROM `oee_machinenames` where `oee_machinenames`.`ID` = New.NAME"); 
PREPARE stmt FROM @sql; 
EXECUTE stmt USING @SHIFTIME; 
SELECT @result; // Set the data to some other variable 
DEALLOCATE PREPARE stmt; 

EDIT: Ааа !! не заметил, что это триггер. Думал, что это процедура. Да, вы не можете, но ваш запрос, чтобы получить @SHIFTIME и SET @SHIFTSELECT := ..., обе части могут быть объединены с измененным запросом, как показано ниже, и поэтому не будет необходимости в динамическом запросе.

Select 

     (Case 
     When ((CurTime() > oee_machinenames.Shift1) And 
     (CurTime() < oee_machinenames.Shift2)) Then oee_machinenames.Shift1 
     When ((CurTime() > oee_machinenames.Shift2) And 
     (CurTime() < oee_machinenames.Shift3)) Then oee_machinenames.Shift2 
     When ((CurTime() > oee_machinenames.Shift3) Or 
     (CurTime() < oee_machinenames.Shift1)) Then oee_machinenames.Shift3 End) 
    From 
     oee_machinenames 
     where oee_machinenames.ID = New.NAME 

    Group By 
     oee_machinenames.ID); 
+0

спасибо, но как я могу вызвать результат этого в моем триггере, так как мне нужно заполнить запись этим итоговым значением? Могу ли я использовать функцию CALL? – elstiv

+0

@elstiv, см. Редактирование в ответ, если это помогает. – Rahul

+0

Я получаю сообщение об ошибке, говоря, что я не могу использовать Dynamic Query в триггере. – elstiv

0

Вы можете использовать согласно ценам ниже

SET @qry = CONCAT('SELECT ',@SHIFTIME,' INTO @SHIFTSELECT FROM `oee_machinenames` where `oee_machinenames`.`ID` = New.NAME'); 
PREPARE stmt FROM @qry; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
Смежные вопросы