Создать динамическую хранимую процедуру в mysql только с именем таблицы

#mysql #stored-procedures

#mysql #хранимые процедуры

Вопрос:

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

Я использую этот код:-

 CREATE PROCEDURE `test1`(IN tab_name VARCHAR(40))
BEGIN
SET @t1 =CONCAT("SELECT * FROM '",tab_name,"' ");
PREPARE stmt3 FROM @t1;
EXECUTE stmt3;
DEALLOCATE PREPARE stmt3;
END
  

Отображается ошибка, и ошибка:-

MySQL сказал: Документация

1064 — У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с » в строке 3

Любой может мне помочь.

Ответ №1:

Обратные тики окружают имя таблицы.

 DROP PROCEDURE IF EXISTS `test1`;
DELIMITER $$
CREATE PROCEDURE `test1`(IN tab_name VARCHAR(40))
BEGIN
    SET @t1 =CONCAT("SELECT * FROM `",tab_name,"`"); -- back-ticks around tbl name
    PREPARE stmt3 FROM @t1;
    EXECUTE stmt3;
    DEALLOCATE PREPARE stmt3;
END$$
DELIMITER ;
  

или (phpMyAdmin или те, которые не требуют разделителей):

 DROP PROCEDURE IF EXISTS `test1`;
CREATE PROCEDURE `test1`(IN tab_name VARCHAR(40))
BEGIN
    SET @t1 =CONCAT("SELECT * FROM `",tab_name,"`"); -- back-ticks around tbl name
    PREPARE stmt3 FROM @t1;
    EXECUTE stmt3;
    DEALLOCATE PREPARE stmt3;
END
  

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

Комментарии:

1. спасибо, Дрю, я изменил некоторый код, который вы дали, он работает правильно. еще раз спасибо за помощь, я использую ПРОЦЕДУРУ CREATE test1 tab_name VARCHAR(40)), НЕ ДЕТЕРМИНИРОВАННУЮ, БЕЗ ОПРЕДЕЛЕНИЯ БЕЗОПАСНОСТИ SQL SQL BEGIN SET @t1 =CONCAT(«ВЫБРАТЬ * ИЗ ",tab_name," «); ПОДГОТОВИТЬ stmt3 ИЗ @t1; ВЫПОЛНИТЬ stmt3; ОСВОБОДИТЬ PREPARE stmt3; END

2. Прохладный. Рад это слышать, Кунвар.

3. Да, я знаю, что вы имеете в виду выше. Обратная галочка искажается в комментарии. Нужно сделать что-то вроде escape-последовательности, чтобы она отображалась. Но да, обратные галочки.

4. ИЗ `»,tab_name,»`»); … так что просто косая черта перед обратными галочками (в комментариях, а не в вашем реальном коде!)