MySQL - как сохранить результат выполнения

Я написал процедуру в MySQL, которая возвращает случайное значение из таблицы. Но у меня много таблиц, и я хочу использовать эту процедуру много раз, поэтому я добавляю в качестве таблицы имен параметров процедуры, из которой я хочу получить значение, имя которого я передам процедуре также в качестве аргумента:

delimiter //

CREATE PROCEDURE randomDefVal(val varchar(50), tableName varchar(50),OUT randomVal varchar(50))

  BEGIN

  SET @tmpTableName = tableName;

  SET @sql_querry = concat('SELECT',@tmpVal,'FROM',@tmpTableName,'ORDER BY rand() LIMIT 1');

  PREPARE stmt FROM @sql_text;

  EXECUTE stmt using @randomVal;

  DEALLOCATE PREPARE stmt;       

END

Но когда я запускаю этот код, у меня появляется ошибка:

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NULL' at line 1

Кто-нибудь может объяснить, как я могу сохранить результат EXECUTE в переменную?

//РЕШЕНИЕ

Для тех людей, у которых та же проблема, что и у меня, я хочу показать пример решения, которое я сделал:

delimiter //

CREATE PROCEDURE tmpProcedure(tableName varchar(20))

BEGIN

DECLARE my_query varchar(60);

DECLARE value varchar(20);

SET @my_query = concat('Select Name FROM ',tableName,' ORDER BY rand() LIMIT 1 INTO @outvar');

PREPARE stmt from @my_query;

EXECUTE stmt;

SET val = (SELECT @outvar); 

END//

Я надеюсь, что это будет полезно для вас.

1 ответ

Я вижу несколько ошибок в вашем коде, особенно в отношении имен переменных, написанных по-разному или не объявленных вообще. Проверьте этот код, который должен быть действительным:

delimiter //

CREATE PROCEDURE randomDefVal(val varchar(50), tableName varchar(50),OUT randomVal varchar(50))

BEGIN

SET @tmpTableName = tableName;
SET @tmpVal = val;
SET @randomVal = randomVal;

SET @sql_querry = concat('SELECT',@tmpVal,'FROM',@tmpTableName,'ORDER BY rand() LIMIT 1');

PREPARE stmt FROM @sql_text;

EXECUTE stmt using @randomVal;

DEALLOCATE PREPARE stmt;

END 
//
Другие вопросы по тегам