MySQL CREATE PROCEDURE Синтаксис - PullRequest
       20

MySQL CREATE PROCEDURE Синтаксис

1 голос
/ 15 апреля 2019

У меня есть эта таблица с большим количеством параметров:

idPumpParam|Type   |Version|A10A|A11A|A12A|A13A|A14A|...

1          |Pump1  |DL cons|1   |32  |45  |6   |67  |...

2          |Pump2  |DL var |2   |65  |8   |37  |43  |...

Для поиска параметра с моей автоматизацией я хотел бы создать процедуру в MySQL Workbench 5.7:

CREATE DEFINER = `root`@`localhost` 
PROCEDURE `procReadParam`(IN Param VARCHAR(20), 
                          IN TypePpe VARCHAR(20), 
                          IN Version VARCHAR(20))
BEGIN
    SELECT Param FROM pumpparameters.pumpparam 
    WHERE Type1 LIKE TypePpe AND Version=Version AND Frequence=Freq;
END

Процедура хорошая, сообщения об ошибке нет.

Я тестирую процедуру в MySQL Workbench:

call pumpparameters.procReadParam(A12A, 'Pump1', 'DL cons')

Это сообщение об ошибке:

Код ошибки: 1054. Неизвестный столбец «A12A» в «списке полей»

Не могли бы вы помочь мне с этим сообщением об ошибке, пожалуйста?

Ответы [ 2 ]

2 голосов
/ 15 апреля 2019

Вы пытались вызвать процедуру с Param в одинарных кавычках?Как это: call pumpparameters.procReadParam('A12A', 'Pump1', 'DL cons')

0 голосов
/ 15 апреля 2019

Если вы хотите динамически использовать столбец в процедуре, вы можете подготовить и выполнить строковый оператор SQL

Примерно так:

DELIMITER //
CREATE DEFINER = `root`@`localhost` 
PROCEDURE `procReadParam`(IN Param VARCHAR(20), 
                          IN TypePpe VARCHAR(20), 
                          IN Version VARCHAR(20))
BEGIN
  SET @sql = CONCAT('SELECT ', Param, ' FROM  pumpparameters.pumpparam WHERE Type1 = \'', TypePpe ,' AND Version =\'',Version,'\'');
  PREPARE stmt FROM @sql;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END//
DELIMITER ;

Примечания:

  • для ваших столбцов VARCHAR, вы должны окружить их значения одинарными кавычками, и, таким образом, правильно экранировать это в вашем CONCAT (с \')
  • Я заменил LIKE на =, потому что LIKE не имел там никакой цели.
  • Я удалил часть Freq, потому что вы не передаете ее как параметр

Так что вам нужно сделать несколько изменений, чтобы он работал так, как вы хотите

...