используйте переменную для имени таблицы в MySQL Sproc - PullRequest
26 голосов
/ 02 мая 2010

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

Вот что я пытаюсь:

CREATE PROCEDURE `usp_SelectFromTables`(
 IN TableName varchar(100)
)
BEGIN
        SELECT * FROM @TableName;
END

Я также пробовал это без знака @, и это просто говорит мне, что TableName не существует ... что я знаю :)

Ответы [ 3 ]

54 голосов
/ 14 февраля 2012
SET @cname:='jello';
SET @vname:='dwb';
SET @sql_text = concat('select concept_id,concept_name,',@vname,' from enc2.concept a JOIN enc2.ratings b USING(concept_id) where concept_name like (''%',@cname,'%'') and 3 is not null order by 3 asc');

PREPARE stmt FROM @sql_text;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
14 голосов
/ 14 декабря 2012

Дополнительный бит, который вызвал у меня проблемы.

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

Вместо того, чтобы помещать переменную @a в concat буквально, вам необходимо включить ее в текст строки.

delimiter //

CREATE PROCEDURE removeProcessed(table_name VARCHAR(255), keyField VARCHAR(255), maxId INT, num_rows INT)

BEGIN
  SET @table_name = table_name;
  SET @keyField = keyField;
  SET @maxId = maxId;
  SET @num_rows = num_rows;

  SET @sql_text1 = concat('SELECT MIN(',@keyField,') INTO @a FROM ',@table_name);
  PREPARE stmt1 FROM @sql_text1;
  EXECUTE stmt1;
  DEALLOCATE PREPARE stmt1;

  loop_label:  LOOP
    SET @sql_text2 = concat('SELECT ',@keyField,' INTO @z FROM ',@table_name,' WHERE ',@keyField,' >= ',@a,' ORDER BY ',@keyField,' LIMIT ',@num_rows,',1');
    PREPARE stmt2 FROM @sql_text2;
    EXECUTE stmt2;
    DEALLOCATE PREPARE stmt2;

    ...Additional looping code...

    END LOOP;
END
//

delimiter ;

Таким образом, в @sql_text1 присвойте результат запроса @a в строке, используя:

') INTO @a FROM '

Затем в @sql_text2 используйте @a в качестве фактической переменной:

,' WHERE ',@keyField,' >= ', @ а ,' ORDER BY '

13 голосов
/ 02 мая 2010

Это зависит от СУБД, но для обозначения обычно требуется динамический SQL, и возникает проблема, заключающаяся в том, что возвращаемые значения из функции зависят от входных данных при ее выполнении. Это дает системные льготы. Как правило (и, следовательно, возможно, с учетом исключений), СУБД не позволяют использовать заполнители (параметры) для структурных элементов запроса, таких как имена таблиц или столбцов; они позволяют указывать только такие значения, как значения столбцов.

Некоторые СУБД имеют поддержку хранимых процедур, которая позволит вам создать строку SQL и затем работать с ней, используя операции «prepare» или «execute немедленный» или аналогичные операции. Однако обратите внимание, что вы внезапно становитесь уязвимыми для атак с использованием SQL-инъекций - тогда тот, кто сможет выполнить вашу процедуру, сможет частично контролировать то, что выполняется SQL.

...