2013-06-13 1 views
0

"클라이언트"테이블에 클라이언트와 일치하는 지불 일정을 저장하는 "schedPayments"테이블을 반복하고 싶습니다. 클라이언트 테이블에는 현재 "상태"열이 포함되어 "과거 기한"에 0이 있고 "현재"에 1이 유지됩니다. 클라이언트 테이블의 잔액이 schedPayments 테이블의 예상 잔액보다 많고 오늘 날짜가 결제일보다 늦은 경우 클라이언트 테이블의 상태 열을 0으로 설정해야합니다.MySQL 저장 프로 시저 계정 상태 업데이트 오류 코드 : 1329

내 솔루션으로 벽에서 완전히 벗어나지 만 오류 코드 : 1329가 계속 나타납니다. 데이터 없음 - 0 행을 가져 오거나 선택 또는 처리했습니다. MySQL Workbench에는 내가 원했던 몇 가지 주요 디버깅 기능이 없습니다. 이 문서는 또한이 상황에서 내가 필요로하는 것을 확실히 다루지는 않는다.

CREATE PROCEDURE `project`.`status_update`() 
BEGIN 
DECLARE balance DECIMAL(20) DEFAULT 0; 
DECLARE cID INT(10) DEFAULT 0; 
DECLARE currentID INT(10) DEFAULT 0; 
DECLARE supposedBal DECIMAL(20) DEFAULT 0; 
DECLARE payDate DATE; 
DECLARE cur1 CURSOR FOR SELECT ClientID,SupposedBalance,Date FROM project.schedpayments; 

OPEN cur1; 

status_loop: LOOP 
    FETCH cur1 INTO cID, supposedBal, payDate; 
    BLOCK2: BEGIN 
     DECLARE cur2 CURSOR FOR SELECT balance FROM project.client WHERE ID=cID; 
     OPEN cur2; 
     FETCH cur2 INTO balance; 
     IF currentID > cID THEN 
      SET currentID = cID; 
      IF (CURDATE() > payDate) AND (supposedBal < balance) THEN 
       UPDATE feeagree SET Status=0 WHERE ID=cID; 
      END IF; 
      CLOSE Cur2; 

     END IF; 
    END BLOCK2; 

END LOOP; 
CLOSE cur1; 
END $$ 

당신은 내가 블록과 그 전체 과정을 동봉 한 방법의 흔적을 볼 수는 END BLOCK2 끝났다 첫 번째 블록을 생각 컴파일러의 결과; 오류 코드 1325가 발생했습니다. 커서가 이미 열려 있습니다.

필자는이 작업을 필요한 것보다 더 복잡하게 만들고 있으므로 도움이 될 것입니다. 내가이 재료를 배울 수있는 유일한 방법은 화재에 의한 재판이고, 오늘은 매우 뜨겁다.

+0

테이블에 대한 샘플 데이터와 해당 샘플 데이터와 관련된 원하는 결과를 게시 할 수 있습니까? 나는 당신이 이것을 위해 커서가 필요 없다고 생각합니다. – peterm

답변

0

모든 커서가 필요하지 않으며 하나의 UPDATE 문으로 목표를 달성 할 수있는 것처럼 보입니다.

그것은 당신의 테이블 구조 및 샘플 데이터를 보지 않고 정확하게 어렵다하지만 SP의 더 간결 버전 DONE 최종 재설정에 = 거짓 DONE이

CREATE PROCEDURE status_update() 
    UPDATE feeagree 
    SET Status = 0 
    WHERE ID IN 
    (
    SELECT p.cID 
     FROM schedpayments p JOIN client c 
     ON p.cID = p.ID 
     WHERE p.Date < CURDATE() 
     AND p.SupposedBalance < c.balance 
     GROUP BY p.cID 
); 
0
... 

DECLARE done TINYINT DEFAULT FALSE; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE = true; 
OPEN cur1; 

status_loop: LOOP 
    FETCH cur1 INTO cID, supposedBal, payDate; 
    IF DONE = true THEN LEAVE status_loop; END IF; 

... 

SET DONE = false; 
END LOOP; 

세트처럼 보일 수 있습니다 내부 블록의 내용이 TRUE로 설정되는 경우