#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; END2. Прохладный. Рад это слышать, Кунвар.
3. Да, я знаю, что вы имеете в виду выше. Обратная галочка искажается в комментарии. Нужно сделать что-то вроде escape-последовательности, чтобы она отображалась. Но да, обратные галочки.
4. ИЗ `»,tab_name,»`»); … так что просто косая черта перед обратными галочками (в комментариях, а не в вашем реальном коде!)