2010-06-04 9 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 

세 개의 매개 변수가 있습니다. user_id, scenerio_id, component_id 모두 외래 키입니다.

NewUUID(), UUIDToBin은 저장된 함수입니다. 필드로

내가 다음 호출

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'); 

다음과 같은 오류

[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 
에게 yeilds 있도록 절차를 내부 동적 SQL을 작성해야 외국 참조가

문자열 연결 오류가 발생 했습니까?

답변

1

마치 닫는 괄호가 필요할 수 있습니다.

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

+0

그래, 그거야! 그것은 같아야한다 SET @query_full = CONCAT (@fields_part, @values_part, ');'); –

1

을 사용하면 실행하려는 쿼리를 볼 수 있습니다. 그것을 별도의 창에 복사/붙여 넣기하여 디버깅 할 수 있습니다.

하나의 명백한 오류가 이스케이프 시퀀스 인 것 같습니다.

select '\"' 
-> 
\" 
+0

@query_full을 선택하려고했습니다. 프로 시저의 종료 직전에 PREPARE STMT FROM @query_full을 주석 처리하기 직전. 및 EXECUTE STMT; 이제 BLOB로 @query_full을 호출하지만 값을 얻을 수 없습니다 –

+0

제발 이스케이프 시퀀스 오류를 얻을 수 있습니까? 알아 냈습니다. –