2016-02-29 3 views
0
DECLARE LENGTH INT(20) DEFAULT 0; 
DECLARE DIM_0 VARCHAR(255); 
DECLARE DIM_1 VARCHAR(255); 
DECLARE DIM_2 VARCHAR(255); 
DECLARE DIM_3 VARCHAR(255); 
DECLARE DIM_4 VARCHAR(255); 

SET LENGTH = F_DIM_ITEM_NUM(DIM_I); 
DECLARE i int(20) DEFAULT 0; 
WHILE i < LENGTH 
DO 
    SET concat('DIM_',i) = F_DIM_ITEM_GET(DIM_I, i + 1); 
    SET i = i + 1; 
END WHILE; 

Кажется, что возврат функции F_DIM_ITEM_GET не присваивается var DIM_i, или есть другие ошибки. Как я могу заставить его работать? Любой совет будет принят во внимание!Ошибка синтаксиса процедуры MySQL, как назначить значение промежуточной переменной?

+0

С быстрым взглядом вы пытаетесь изменить код MySQL во время выполнения, я верю. Для выполнения этой задачи вам необходимо использовать [Dynamic SQL] (http://dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html). 'SET concat ('DIM_', i) = F_DIM_ITEM_GET (DIM_I, i + 1);' не изменяет сам код, например 'SET DIM_1 = F_DIM_ITEM_GET (DIM_I, i + 1);' именно это вы пытаетесь сделать , –

+0

спасибо @JonathonOgden, это очень помогает мне. – Ivo

ответ

1

concat('DIM_',i) не является переменной, а строковым литералом (константой), и вы не можете присвоить ему значение. Вы можете попытаться использовать dynamic sql through prepared statements для создания оператора sql, который будет выполняться динамически с использованием конкатенации строк, а затем выполнить его.

Создание SQL динамически (очевидно, объявить DSQL переменную первого), выполнить его, и бесплатно его:

DSQL = 'SET ' + concat('DIM_',i) + '= F_DIM_ITEM_GET(DIM_I, i + 1)'; 
PREPARE stmt FROM DSQL; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

Кроме того, необходимо объявить переменную i перед его использованием.

+0

спасибо @Shsdow, он работает! – Ivo