2014-10-29 2 views
0

그래서 MySQL 버전 5.5 저장 프로 시저를 만들려고 해요. 나는 무엇이 잘못되었지만 내가 성취하고자하는 것이 무엇인지 잘 모릅니다.MySQL 저장 프로 시저 선택 삽입

레코드 받기 7 일 이상 된 테이블 -A에서 가져 오기. 그리고 나서 Table-B에 삽입하십시오. 그러나 표 B에 있는지 확인해야합니다. 존재한다면 건너 뜁니다. 그렇지 않으면 삽입하십시오.

DROP PROCEDURE IF EXISTS `move_record`; 
DELIMITER // 
CREATE PROCEDURE `move_record`() 
BEGIN 
     DECLARE done INT DEFAULT FALSE; 
     DECLARE dt DATETIME; 
     DECLARE uid,value BIGINT(20); 
     DECLARE category VARCHAR(30); 
     DECLARE data,comments VARCHAR(255); 
     DECLARE cancel TINYINT(1) DEFAULT NULL; 

     DECLARE curs CURSOR FOR SELECT `datetime`,user_id,category,data,comments,cancel FROM `record` WHERE `datetime` < DATE_SUB(CURDATE(), INTERVAL 7 DAY); 

     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 

     OPEN curs; 

     myloop: LOOP 
     FETCH NEXT FROM curs INTO dt,uid,category,data,comments,cancel; 
     IF done THEN 
      LEAVE myloop; 
     END IF; 

     IF NOT EXISTS (SELECT * FROM `record_arc` 
         WHERE record_arc.`datetime` = dt 
         AND record.user_id = uid) 
     INSERT INTO `record_arc` (`datetime`,user_id,category,data,comments,cancel) VALUES (dt,uid,category,data,comments,cancel); 

     END IF; 
     END LOOP myloop; 

     CLOSE curs; 
     DEALLOCATE curs; 
END// 
DELIMITER ; 
+0

LEAVE read_loop ????? "LEAVE myloop"이어야합니다. – knkarthick24

+0

당신이 받고있는 오류를 알려주십시오. – knkarthick24

+0

# 1064 - SQL 구문에 오류가 있습니다. INSERT INTO'record_arc' ('datetime', user_id, category, data, comments, cancel) VALU '25 번 라인 근처에서 사용할 올바른 구문에 대해서는 MySQL 서버 버전에 해당하는 매뉴얼을 확인하십시오. – user3562733

답변

1

은 어쩌면 당신은 루프없이이 작업을 수행 할 수 있습니다

그래서 여기 내 코드입니다.

INSERT INTO `record_arc`(
    `datetime`, 
    user_id, 
    category, 
    data, 
    comments, 
    cancel 
) 
SELECT 
    `datetime`, 
    user_id, 
    category, 
    data, 
    comments, 
    cancel 
FROM `record` r 
WHERE 
    `datetime` < DATE_SUB(CURDATE(), INTERVAL 7 DAY) 
    AND NOT EXISTS(
     SELECT 1 
     FROM `record_arc` r2 
     WHERE 
      r2.`datetime` = r.`datetime` 
      AND r2.user_id = r.user_id 
    ) 
+0

감사합니다. Btw 많은 레코드가있는 경우 성능에 영향을 줍니까? 전의. 각 실행마다 100,000 개의 행이 있거나 더 많은 행이 있습니다. – user3562733

+1

이것은 루프 구현보다 빠릅니다. 일반적으로 집합 기반 접근 방식을 사용해야합니다. –

0

별칭 잘못 사용했습니다. 아래 코드를 확인하십시오.

IF NOT EXISTS (SELECT 1 FROM `record_arc` 
          WHERE record_arc.`datetime` = dt 
          AND record_arc.user_id = uid) 
+0

그래, 여전히 같은 오류가 있습니다. – user3562733