2012-07-06 3 views
1

첫 프로 시저를 작성하고 오류가 발생했습니다. 나는 줄을 지우지 만 그 이유는 분명치 않다. 누군가 여기서 문제를 발견 할 수 있습니까? 그것은 변수입니까?MySQL 프로 시저가 컴파일되지 않습니다 - 변수가있는 삭제시 오류가 발생했습니다

DROP PROCEDURE IF EXISTS MPT_PROC; 
DELIMITER $$ 
CREATE PROCEDURE MPT_PROC 
MODIFIES SQL DATA 
BEGIN 

    #-- DECLARE statements 

    DECLARE v_user_id  INT DEFAULT 0; 

    DECLARE no_more_rows BOOLEAN; 
    DECLARE v_loop_cntr  INT DEFAULT 0; 
    DECLARE v_num_rows  INT DEFAULT 0; 

    DECLARE c_userfiles CURSOR 
    FOR 
     SELECT distinct f.user_id 
     FROM MPT_STG_FILEUPLOAD f 
     WHERE f.status = 'A'; #-- Accepted 

     DECLARE CONTINUE HANDLER FOR NOT FOUND 
     SET no_more_rows = TRUE; 

     OPEN c_userfiles; 

     #-- Loop through each user_id found as pending 
     the_loop: LOOP 

      FETCH c_userfiles INTO v_user_id; 

      #-- Break out of the loop if 
      #-- 1) there were no records, or 
      #-- 2) we've processed them all. 
      IF no_more_rows THEN 
       CLOSE c_userfiles; 
       LEAVE the_loop; 
      END IF; 

      DELETE FROM MPT_STG_FILEUPLOAD s 
      WHERE s.user_id = v_user_id; 

      COMMIT; #--Commiting the changes for this user 
     END LOOP the_loop; 

    END IF; 

END 
DELIMITER ; 

답변

1

MySQL에서는 DELETE 문에서 삭제하려는 테이블에 대한 별칭을 제공 할 수 없습니다.

DELETE FROM MPT_STG_FILEUPLOAD WHERE user_id = v_user_id; 

주석 구분 기호로 파운드 기호를 잃어 버리십시오. 이중 대시는 주석의 시작을 표시하는 표준입니다. 프로 시저가 끝날 무렵에는 END IF이 맞지 않는 것 같습니다.

DROP PROCEDURE IF EXISTS MPT_PROC; 
DELIMITER $$ 
CREATE PROCEDURE MPT_PROC 
MODIFIES SQL DATA 
BEGIN 
    DECLARE v_user_id  INT DEFAULT 0; 
    DECLARE no_more_rows BOOLEAN; 
    DECLARE v_loop_cntr  INT DEFAULT 0; 
    DECLARE v_num_rows  INT DEFAULT 0; 

    DECLARE c_userfiles CURSOR 
    FOR 
    SELECT distinct f.user_id 
    FROM MPT_STG_FILEUPLOAD f 
    WHERE f.status = 'A'; -- Accepted 

    DECLARE CONTINUE HANDLER FOR NOT FOUND 
    SET no_more_rows = TRUE; 

    OPEN c_userfiles; 

    -- Loop through each user_id found as pending 
    the_loop: LOOP 

    FETCH c_userfiles INTO v_user_id; 

    -- Break out of the loop if 
    -- 1) there were no records, or 
    -- 2) we've processed them all. 
    IF no_more_rows THEN 
     CLOSE c_userfiles; 
     LEAVE the_loop; 
    END IF; 

    DELETE FROM MPT_STG_FILEUPLOAD s 
    WHERE s.user_id = v_user_id; 

    COMMIT; --Commiting the changes for this user 
    END LOOP the_loop; 

END$$ 
DELIMITER ; 

user_id이 NOT "허용"으로 표시됩니다, 프로 시저가 행을 삭제 할 수있는 MPT_STG_FILEUPLOAD 테이블에 기본 키가 아닌 경우

. user_id에 해당 테이블에 두 개의 행이 있고 행 중 하나가 허용 된 것으로 표시되고 다른 행이 그렇지 않은 경우 어떻게됩니까? 두 행을 모두 삭제 하시겠습니까?

어디서나 참조되는 두 변수, v_loop_cntrv_num_rows이있는 것 같습니다. 필요하지 않은 경우 주석 처리하는 것이 좋습니다.

이 전체 절차는 단일 SQL 문에서보다 효율적으로 수행 될 수 있습니다.

+0

감사합니다! 삭제시 별칭이 어떤 이유로 받아 들여지지 않았습니다 ... ... – Leo

+0

아주 좋은 생각! 나는 그것을 지금 할 것이다! 감사. 레오 – Leo

+0

감사합니다. Spencer, 예외가 발생하는 경우 루프의 다음 값으로 이동하는 방법을 제어하는 ​​방법이 확실하지 않습니다. 아이디어가 있습니까? – Leo

관련 문제