2010-06-04 3 views
2

см. Процедуру InsertHelpQuestion2 ниже.MySQL - динамический SQL внутри хранимой процедуры

DROP PROCEDURE InsertHelpQuestion2; 
CREATE PROCEDURE InsertHelpQuestion2(user_id char(50),scenerio_id char(50),component_id char(50)) 
BEGIN 
    DECLARE uu_id char(50); 
    SELECT BinToUUID(NewUUID()) INTO uu_id from helpquestion LIMIT 1; 
    SET @fields_part = 'INSERT INTO helpquestion(HelpQuestionKey,UserKey'; 
    SET @values_part = CONCAT(' VALUES(UUIDToBin(\"', uu_id, '\"), UUIDToBin(\"', user_id, '\")'); 
    IF (scenerio_id) THEN 
     SET @fields_part = CONCAT(@fields_part, ', ScenarioKey'); 
     SET @values_part = CONCAT(@values_part, ', UUIDToBin("', scenerio_id, '")'); 
    END IF; 
    IF (component_id) THEN 
     SET @fields_part = CONCAT(@fields_part, ', ComponentKey'); 
     SET @values_part = CONCAT(@values_part, ', UUIDToBin("', component_id, '")'); 
    END IF; 
    SET @query_full = CONCAT(@fields_part , @values_part, ';'); 
    PREPARE STMT FROM @query_full; 
    EXECUTE STMT; 
END 

У него есть 3 параметра user_id, scenerio_id, component_id. Все это внешние ключи.

NewUUID(), UUIDToBin - хранимые функции.

В полях имеют внешнюю ссылку, мне нужно написать Динамический SQL внутри процедуры, так что следующие вызовы работают

CALL InsertHelpQuestion2('F70724DC-AC0D-102D-9C16-00163EEDFCFC', '0F69476A-ABF2-102D-9C16-00163EEDFCFC', '06FFEE04-1FD9-11DF-9B60-001F16F664A9'); 

CALL InsertHelpQuestion2('F70724DC-AC0D-102D-9C16-00163EEDFCFC', '0F69476A-ABF2-102D-9C16-00163EEDFCFC', ''); 

CALL InsertHelpQuestion2('F70724DC-AC0D-102D-9C16-00163EEDFCFC', '', ''); 

Но первый звонок

CALL InsertHelpQuestion2('F70724DC-AC0D-102D-9C16-00163EEDFCFC', '0F69476A-ABF2-102D-9C16-00163EEDFCFC', '06FFEE04-1FD9-11DF-9B60-001F16F664A9'); 

yeilds следующую ошибку

[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VALUES(UUIDToBin("69490F3A-6FD3-11DF-964F-F4CE462E9D80"), UUIDToBin("F70724DC-AC' at line 1 

Любая ошибка в конкатенации строк?

ответ

1

Похоже, что вам может понадобиться закрывающая скобка.

SET @query_full = CONCAT (@fields_part, @values_part, ');');

+0

yup, thats! это должно быть как SET @query_full = CONCAT (@fields_part, @values_part, ');'); –

1

Используйте print @query_full, чтобы просмотреть запрос, который вы пытаетесь выполнить. Вы можете скопировать/вставить это в отдельном окне, чтобы отладить его.

Очевидной ошибкой является escape-последовательность.

select '\"' 
-> 
\" 
+0

Я попробовал select @query_full; незадолго до окончания процедуры завершения процедуры PREPARE STMT FROM @query_full; и EXECUTE STMT; И теперь вызов возвращает @query_full как BLOB, но я не могу получить значение –

+0

Не могли бы вы получить ошибку escape-последовательности, я ее не понял. –

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