используйте переменную для имени таблицы в mysql sproc
Я пытаюсь передать имя таблицы в мою хранимую процедуру mysql, чтобы использовать этот sproc для выбора из разных таблиц, но он не работает...
это то, что я"пытаюсь:
CREATE PROCEDURE `usp_SelectFromTables`(
IN TableName varchar(100)
)
BEGIN
SELECT * FROM @TableName;
END
Я также пробовал его без знака@, и это просто говорит мне, что TableName не существует...который я знаю:)
3 ответов
Это зависит от СУБД, но нотация обычно требует динамического SQL и сталкивается с проблемой, что возвращаемые значения из функции зависят от входных данных при ее выполнении. Это дает системе conniptions. Как правило (и поэтому, вероятно, с исключениями), СУБД не позволяют использовать заполнители (параметры) для структурных элементов запроса, таких как имена таблиц или столбцов; они позволяют только указать значения, такие как столбец ценности.
некоторые СУБД имеют поддержку хранимых процедур, которая позволит вам создать строку SQL, а затем работать с ней, используя "prepare" или "execute immediate" или аналогичные операции. Обратите внимание, однако, что вы внезапно уязвимы для атак SQL - инъекций-кто-то, кто может выполнить вашу процедуру, может частично контролировать, что SQL выполняется.
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;
дополнительный бит, который вызвал у меня проблемы.
Я хотел установить имя таблицы и поле динамически в запросе, как спросил @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,' >= ',
@a,' ORDER BY '