Как использовать переменную как имя столбца в триггере mysql [duplicate]

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

0
задан elstiv 17 September 2015 в 10:29
поделиться

2 ответа

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

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: Ahh !! не заметил, что это триггер. Думал, что это процедура. Да, вы не можете, но ваш запрос получить @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);
2
ответ дан Rahul 19 August 2018 в 03:29
поделиться
  • 1
    спасибо, но как я могу вызвать результат этого в моем триггере, так как мне нужно заполнить запись этим итоговым значением? Могу ли я использовать функцию CALL? – elstiv 17 September 2015 в 10:37
  • 2
    @elstiv, см. править в ответ, если это помогает. – Rahul 17 September 2015 в 10:46
  • 3
    Я получаю сообщение об ошибке, говоря, что я не могу использовать Dynamic Query в триггере. – elstiv 17 September 2015 в 15:48
  • 4
    @elstiv, Да, мой плохой не заметил, что это триггер. В любом случае, см. Редактирование в ответ, главным образом, EDIT , если это помогает. – Rahul 17 September 2015 в 20:33

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

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;
0
ответ дан Zafar Malik 19 August 2018 в 03:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: