2013-06-10 2 views
1

저장된 함수를 만들려고하지만 오류가 발생하여 스크립트가 제대로 작동하지 않습니다. 오류가없는 것으로 생각됩니다. 하지만이 오류가 왜 나는지 모르겠다.내 MySQL 스크립트 구문에 오류가 있습니다.

1064 - SQL 구문에 오류가 있습니다.

: 이

그리고 이것은 내 스크립트 'numBon =이 SELECT codeArt, LigneBonEntrée FROM QTE위한 DECLARE의 (CR1)의 커서' 근처를 사용할 수있는 권리 구문에 대한 MySQL 서버 버전에 해당하는 설명서를 확인

DELIMITER $$ 

CREATE [email protected] FUNCTION verifierQteDemandee(numBonIn INT) RETURNS BOOLEAN 
BEGIN 
    DECLARE numLignesBonEntrée, numLignesBonSortie INTEGER; 
    DECLARE codeArtLigneBonEntrée, codeArtLigneBonSortie, qteLigneBonEntrée, qteLigneBonSortie INTEGER; 
    DECLARE no_more_rows BOOLEAN; 
    DECLARE qteArticle INTEGER; 
    DECLARE test BOOLEAN DEFAULT TRUE; 

    SET numLignesBonEntrée = (SELECT COUNT(*) FROM LigneBonEntrée WHERE numBon = numBonIn); 

    SET numLignesBonSortie = (SELECT COUNT(*) FROM numLignesBonSortie WHERE numBon = (SELECT estLieA FROM LigneBonEntrée WHERE numBon = numBonIn)); 

    IF numLignesBonEntrée <> numLignesBonSortie THEN 
     SET test = FALSE; 
    ELSE 
     DECLARE cr1 CURSOR FOR SELECT codeArt, qte FROM LigneBonEntrée WHERE numBon = numBonIn ORDER BY codeArt ASC; 

     DECLARE cr2 CURSOR FOR SELECT codeArt, qte FROM LigneBonSortieWHERE numBon = (SELECT estLieA FROM LigneBonEntréeWHERE numBon = numBonIn) ORDER BY codeArt ASC; 

     DECLARE CONTINUE HANDLER FOR NOT FOUND 
     SET no_more_rows = TRUE; 

     OPEN cr1; 
     OPEN cr2; 

     the_loop: LOOP 
      FETCH cr1 INTO codeArtLigneBonEntrée, qteLigneBonEntrée; 
      FETCH cr2 INTO codeArtLigneBonSortie, qteLigneBonSortie; 
      IF no_more_rows THEN 
       CLOSE cr; 
       LEAVE the_loop; 
      END IF; 

      IF codeArtLigneBonEntrée <> codeArtLigneBonSortie THEN 
       SET test = FALSE; 
      END IF; 

      IF qteLigneBonEntrée <> qteLigneBonSortie THEN 
       SET test = FALSE; 
      END IF; 

     END LOOP the_loop; 
    END IF; 
    RETURN test; 

END$$ 

DELIMITER ; 

답변

1

DECLARE는 다른 로직보다 먼저 프로 시저의 맨 위에 있어야합니다. 다음을 시도하십시오.

DELIMITER $$ 

CREATE [email protected] FUNCTION verifierQteDemandee(numBonIn INT) RETURNS BOOLEAN 
BEGIN 
    DECLARE numLignesBonEntrée, numLignesBonSortie INTEGER; 
    DECLARE codeArtLigneBonEntrée, codeArtLigneBonSortie, qteLigneBonEntrée, qteLigneBonSortie INTEGER; 
    DECLARE no_more_rows BOOLEAN; 
    DECLARE qteArticle INTEGER; 
    DECLARE test BOOLEAN DEFAULT TRUE; 

    -- Moved declarations to before other logic 
    DECLARE cr1 CURSOR FOR SELECT codeArt, qte FROM LigneBonEntrée WHERE numBon = numBonIn ORDER BY codeArt ASC; 
    DECLARE cr2 CURSOR FOR SELECT codeArt, qte FROM LigneBonSortieWHERE numBon = (SELECT estLieA FROM LigneBonEntréeWHERE numBon = numBonIn) ORDER BY codeArt ASC; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND 
     SET no_more_rows = TRUE; 

    SET numLignesBonEntrée = (SELECT COUNT(*) FROM LigneBonEntrée WHERE numBon = numBonIn); 

    SET numLignesBonSortie = (SELECT COUNT(*) FROM numLignesBonSortie WHERE numBon = (SELECT estLieA FROM LigneBonEntrée WHERE numBon = numBonIn)); 

    IF numLignesBonEntrée <> numLignesBonSortie THEN 
     SET test = FALSE; 
    ELSE 

     OPEN cr1; 
     OPEN cr2; 

     the_loop: LOOP 
      FETCH cr1 INTO codeArtLigneBonEntrée, qteLigneBonEntrée; 
      FETCH cr2 INTO codeArtLigneBonSortie, qteLigneBonSortie; 
      IF no_more_rows THEN 
       CLOSE cr; 
       LEAVE the_loop; 
      END IF; 

      IF codeArtLigneBonEntrée <> codeArtLigneBonSortie THEN 
       SET test = FALSE; 
      END IF; 

      IF qteLigneBonEntrée <> qteLigneBonSortie THEN 
       SET test = FALSE; 
      END IF; 

     END LOOP the_loop; 
    END IF; 
    RETURN test; 

END$$ 

DELIMITER ; 

MySQL의 문서는 : http://dev.mysql.com/doc/refman/5.0/en/declare.html

DECLARE에만 BEGIN ... END 복합 문 내에서 허용되며 다른 문 전에, 그 시작해야합니다.

선언은 특정 순서를 따라야합니다. 커서 선언은 핸들러 선언 앞에 이 나타나야합니다. 변수 또는 조건 선언은 커서 또는 핸들러 선언 앞에 나타나야합니다.

+0

감사합니다. 문제가 있습니다. –

+0

이런 일이 발생합니다. –