#mysql #stored-procedures
#mysql #хранимые процедуры
Вопрос:
Я использую хранимую функцию MySQL, в которой я создал функцию и передал имя столбца в качестве параметра этой функции. Предположим
CREATE DEFINER=`root`@`localhost` FUNCTION `test_func`(column_1 varchar(100)) RETURNS varchar(100) CHARSET latin1
select column_1 from table where id = 1 ;
Здесь я хочу получить значение столбца ‘column_1’ с идентификатором 1. Но я получаю само имя столбца, а не значение.
Пожалуйста, помогите мне написать правильный синтаксис.
Ответ №1:
С вашим подходом есть несколько проблем. Прежде всего, вы не можете использовать значение своего аргумента для ссылки на базовый столбец. Хорошо, что вы можете использовать подготовленные инструкции в качестве обходного пути для этого.
Вторая проблема заключается в том, что функции MySQL не позволяют использовать подготовленные операторы. Чтобы обойти это ограничение, вам нужно вместо этого использовать хранимые процедуры. В качестве примера:
CREATE PROCEDURE test_func (IN col1 varchar(100), OUT res int)
BEGIN
SET @s=CONCAT('SELECT ',col1,' INTO @res FROM yourtable WHERE id=1');
PREPARE stmt1 FROM @s;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
SELECT @res INTO res;
END
Ответ №2:
После долгого поиска я обнаружил, что хранимая функция может использоваться только для возврата одного значения или вычисленного ответа (арифметического). Для вашего запроса просто используйте хранимую процедуру. Это так же просто, как создать запрос из внешнего интерфейса. И вот синтаксис:
Используйте CONCAT(X1,X2,X3 . . .)
, чтобы сделать это так, как вам хотелось бы.
CREATE DEFINER=`root`@`localhost` PROCEDURE `Test`(table longtext,column longtext,e_id longtext)
SET @s=CONCAT('Select ',table,' from ', column, 'Where employee = ',e_id);
PREPARE stmt1 FROM @s;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END
Ответ №3:
Я не уверен, что вы пытаетесь спросить. Но вот решение с использованием подготовленных операторов:
SET @selectStatement = CONCAT('Select ', columnName1,' from tab1 where id = 1'); -- Build Select statement like this
PREPARE stmt FROM @selectStatement; -- parse and prepare insert statement from the above string
EXECUTE stmt; -- execute statement
DEALLOCATE PREPARE stmt; -- release the statement memory.
Я не знаю полного сценария, но этого можно избежать, изменив некоторый дизайн.