Подготовленный оператор в хранимой процедуре MySQL
Я пытался построить хранимую процедуру mysql, но, похоже, у меня разные ошибки, я просто пытаюсь запустить подготовленный оператор из хранимой процедуры, чтобы добиться динамического вставления некоторых данных в таблицу.
Может кто-нибудь проверить и сказать, где моя ошибка?
Спасибо
DELIMITER $$
CREATE PROCEDURE insert_tracking(IN deviceid VARCHAR(15),IN timing timestamp,IN valid tinyint(1),IN latitude double,IN longitude double,IN speed double,IN course double,IN power double,IN comando varchar(45))
BEGIN
DECLARE query VARCHAR(150);
SET query = "INSERT INTO tracking_? (device_id,time,valid,latitude,longitude,speed,course,power,command) VALUES (?,?,?,?,?,?,?,?,?)";
PREPARE stmt FROM query;
EXECUTE stmt USING deviceid,deviceid,timing,valid,latitude,longitude,speed,course,power,comando;
END $$
Я также попробовал это объединение, но оно не работает.
DELIMITER $$
CREATE PROCEDURE insert_tracking(IN deviceid VARCHAR(15),IN timing timestamp,IN valid tinyint(1),IN latitude double,IN longitude double,IN speed double,IN course double,IN power double,IN comando varchar(45))
BEGIN
DECLARE query VARCHAR(200);
SET query = CONCAT('INSERT INTO tracking_',deviceid,' (device_id,time,valid,latitude,longitude,speed,course,power,command) VALUES (?,?,?,?,?,?,?,?,?)');
PREPARE stmt FROM query;
EXECUTE stmt USING deviceid,timing,valid,latitude,longitude,speed,course,power,comando;
DEALLOCATE PREPARE stmt;
END $$
После редактирования у меня это, я протестировал оператор concat, и они работают отдельно, но у подготовленного оператора продолжают возникать проблемы, он не работает.
DELIMITER $$
CREATE PROCEDURE insert_tracking(IN deviceid VARCHAR(15),IN timing timestamp,IN valid tinyint(1),IN latitude double,IN longitude double,IN speed double,IN course double,IN power double,IN comando varchar(45))
BEGIN
SET @deviceid = deviceid;
SET @nsert = CONCAT('INSERT INTO tracking_',@deviceid);
SET @query = CONCAT(@nsert,' (device_id,time,valid,latitude,longitude,speed,course,power,command) VALUES ("?","?","?","?","?","?","?","?","?")');
SET @fquery = @query;
PREPARE stmt FROM @fquery;
EXECUTE stmt USING deviceid,timing,valid,latitude,longitude,speed,course,power,comando;
END $$
1 ответ
Я считаю, что это потому, что имена таблиц и столбцов не могут быть заменены параметрами в подготовленных утверждениях. Попробуйте ввести полное имя таблицы и проверьте, хотите ли вы проверить.
Код взят из ( http://dev.af83.com/2007/05/30/use-parameters-for-field-and-table-names-in-a-mysql-prepare-statement-to-create-truly-dynamic-sql.html) кредиты автору
Эта функция может разрешать динамические имена таблиц и столбцов
DELIMITER //
DROP FUNCTION IF EXISTS substrCount//
CREATE FUNCTION substrCount(x varchar(255), delim varchar(12)) returns int
return (length(x)-length(REPLACE(x, delim, '')))/length(delim);//
DROP FUNCTION IF EXISTS charsplit//
CREATE FUNCTION charsplit(x varchar(255), delim varchar(12), pos int) returns varchar(255)
return replace(substring(substring_index(x, delim, pos), length(substring_index(x, delim, pos - 1)) + 1), delim, '');//
DROP FUNCTION IF EXISTS replacefirst//
CREATE FUNCTION replacefirst(haystack varchar(255), needle varchar(255),replacestr varchar(255)) returns varchar(255)
BEGIN
IF LOCATE(needle,haystack)>0 THEN
SET @replaced=concat(left(haystack,LOCATE(needle,haystack)-LENGTH(needle)),replacestr,right(haystack,LENGTH(haystack)-LOCATE(needle,haystack)));
ELSE
SET @replaced=haystack;
END IF;
RETURN @replaced;
END;//
DROP FUNCTION IF EXISTS properprepare//
CREATE FUNCTION properprepare(template varchar(255), args varchar(255)) returns varchar(255)
BEGIN
SET @i=0;
SET @numargs = substrCount(args,',');
WHILE @i <= @numargs DO
SET @i= @i+ 1;
SET template=replacefirst(template,'?',charsplit(args,',',@i));
END WHILE;
RETURN template;
END;//
DELIMITER ;