2013-08-20 3 views
1

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

Может ли кто-нибудь проверить и сообщить мне, где моя ошибка?

Благодаря

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 $$ 
+0

что ошибка? – Cfreak

+0

Общая ошибка: у вас есть ошибка в синтаксисе sql в строке 1 рядом с '= deviceid;' –

ответ

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 ; 
+0

Я изменил код, чтобы увидеть его упрощенным, так что я не уверен, как подготовить имя таблицы динамически, любой знает что-то об этом? –

+0

К сожалению, вы не можете. Насколько я знаю, Подготовленный оператор предназначен для значений столбцов, а не для имени таблицы. – skv

+0

Но вы можете использовать конкатенацию строк для формирования запроса соответственно, можете ли вы попробовать этот – skv

Смежные вопросы