Mysql хранимая процедура не принимает имя таблицы в качестве параметра - PullRequest
4 голосов
/ 07 июля 2011

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

Давайте посмотрим мой процесс в MySQL:

DELIMITER $$
USE `db_test`$$

DROP PROCEDURE IF EXISTS test_proc$$

CREATE DEFINER=`root`@`localhost` 
PROCEDURE `test_proc`(IN serviceName VARCHAR(10),IN newsInfoTable VARCHAR(100))
BEGIN                  
    SELECT COUNT(*) FROM newsInfoTable WHERE newsServiceName=serviceName;           
END$$

DELIMITER ;

Параметры вызова хранимой процедуры:

USE db_test;
CALL test_proc('abc','tbl_test_news');

Здесь параметр имени службы работает нормально.Но если я включу переменную newsInfoTable в качестве входного параметра таблицы, появится сообщение об ошибке.

Таблица 'db_test.newsinfotable' не существует

Почему это происходит толькопараметр таблицы?Как извлечь из этой ошибки или

Как передать имя таблицы в хранимую процедуру в качестве параметра?

Ответы [ 4 ]

8 голосов
/ 07 июля 2011

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

Одним из способов решения этой проблемы является использование динамического SQL.

CREATE DEFINER=`root`@`localhost` PROCEDURE `test_proc`(IN serviceName VARCHAR(10),IN newsInfoTable VARCHAR(100))
BEGIN                  
    SET @sql = CONCAT('SELECT COUNT(*) FROM ',newsInfoTable,' WHERE newsServiceName=?;'); 
    PREPARE s1 from @sql;
    SET @paramA = serviceName;
    EXECUTE s1 USING @paramA;
END$$
6 голосов
/ 07 июля 2011

Вы можете использовать EXECUTE IMMEDIATE для решения "меньше значит больше" (для меня меньше кода = хорошо)

CREATE PROCEDURE test_proc(IN serviceName VARCHAR(10), IN newsInfoTable VARCHAR(100))
BEGIN                  
    EXECUTE IMMEDIATE CONCAT('SELECT COUNT(*) FROM ',newsInfoTable,' WHERE newsServiceName=''', serviceName, ''''); 
END
0 голосов
/ 01 апреля 2014

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

DELIMITER $$
CREATE PROCEDURE select_count(IN table_name VARCHAR(20))
BEGIN
  IF table_name = 'xxx' THEN
     SELECT * FROM xxx;
  ELSEIF table_name = 'yyy' THEN
     ...
  ENDIF
END$$
0 голосов
/ 07 июля 2011

эта часть запроса не может быть динамической.

вы можете рассмотреть реализацию в виде строки, которая динамически выполняется во время выполнения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...