트리거 내 루프 제어

트리거 내 루프

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
create trigger suggestionAlarm after update on suggestion 
FOR EACH ROW
begin
DECLARE done INT DEFAULT FALSE;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
declare _id cursor for select id from likelist where bno=new.bno;
declare tempid VARCHAR(40);
if new.statusCode = 'S02' then
insert into alarm(alarmcode, bno, isFrom)
values('A02-1', new.bno, new.id);
open _id;
ins_loop: LOOP
fetch _id into tempid;
if done then leave ins_loop;
end if;
insert into alarm(alarmcode, bno, isFrom)
values('A03', new.bno, tempid);
end loop;
close _id;
else
insert into alarm(alarmcode, bno, isFrom)
values('A02-2', new.bno, new.id);
end if;
end;

사실 루프문은 처음 트리거 생성 때 트러블슈팅으로 넣어놨던 것이라 고생은 별로 안했는데, 하다보니 알게 된 것들을 기록

  1. 커서 핸들러가 정확한 위치에 정의되지 않으면 에러가 발생
    에러 내용은 다음과 같다.
    Variable or condition declaration after cursor or handler declaration

  2. 루프문 제어의 경우 다양한 방식이 있는데, 나는 커서를 이용했기 때문에 위의 sql를 치는 것이 좋은 것 같다
    만약 커서를 사용하지 않았더라면

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    create trigger suggestionAlarm after update on suggestion 
    FOR EACH ROW
    begin
    declare _id cursor for select id from likelist where bno=new.bno;
    declare tempid VARCHAR(40);
    declare x int ;
    if new.statusCode = 'S02' then
    insert into alarm(alarmcode, bno, isFrom)
    values('A02-1', new.bno, new.id);
    if((select count(*) from likelist where bno=new.bno) > 0) then
    set x = 1;
    open _id;
    while x < (select count(*) from likelist where bno=new.bno) do
    fetch _id into tempid;
    insert into alarm(alarmcode, bno, isFrom)
    values('A03', new.bno, tempid);
    set x = x+1;
    end while;
    close _id;
    end if;
    else
    insert into alarm(alarmcode, bno, isFrom)
    values('A02-2', new.bno, new.id);
    end;

    이렇게 해도 됐겠지만…

    위 소스를 그대로 치면 1과 같은 에러가 난다. 커서 핸들러가 없다고.