til/Oracle

ANSI-SQL/프로시저/트리거

값진 2022. 5. 23. 21:06

요구사항

회원 테이블과 게시판 테이블을 만들어 포인트 제도를 적용시킨다. 회원이 글을 작성하면 포인트를 100점 얻고, 글을 삭제하면 포인트를 50점 잃는다. > 회원은 글을 쓰거나 삭제할 수 있고, 포인트를 누적시킬 수 있다.

이를 ANSI-SQL, 프로시저, 트리거로 작성하며 비교해본다.

create table tblUser (
    id varchar2(30) primary key,
    point number default 10000 not null
);

create table tblBoard (
    seq number primary key,
    subject varchar2(1000) not null,
    id varchar2(30) not null references tblUser(id)
);

create sequence seqBoard;

insert into tblUser values ('hong', default);
select * from tblUser;

회원의 점수제도를 가시화 하면, 회원 > 글쓰기 > + 100 / 회원 > 글삭제 > - 50 두가지가 있고, 고려해야할 두가지 사항이 있다.
- A. 글을 쓴다.(삭제한다.)
- B. 포인트를 누적시킨다.

 

 

ANSI-SQL

-- 1.1 글쓰기
insert into tblBoard values (seqBoard.nextVal, '게시판입니다.', 'hong');

-- 1.2 포인트 누적하기
update tblUser set point = point + 100 where id = 'hong';

-- 1.3 글삭제
delete from tblBoard where seq = 1;

-- 1.4 포인트 누적하기
update tblUser set point = point - 50 where id = 'hong';

- 절차를 개발자가 직접 제어해야한다.
- 실수하면 일부의 일부가 누락될 수 있다.

 

ANSI-SQL은 확실히 까다롭고 어렵다.

 

 

프로시저

create or replace procedure procAddBoard (
    psubject varchar2,
    pid varchar2
)
is
begin

    -- 2.1 글쓰기
    insert into tblBoard values (seqBoard.nextVal, psubject, pid);

    -- 2.2 포인트 누적하기
    update tblUser set point = point + 100 where id = pid;
    
    commit;

exception
    when others then
        rollback;    

end;



create or replace procedure procDeleteBoard (
    pseq number
)
is
    vid varchar2(30);
begin

    --삭제글의 작성자
    select id into vid from tblBoard where seq = pseq;
    
    -- 2.3 글삭제
    delete from tblBoard where seq = pseq;
    
    -- 2.4 포인트 누적하기
    update tblUser set point = point - 50 where id = vid;
    
    
    commit;

exception
    when others then
        rollback;    

end;


begin
    --procAddBoard('다시 글을 씁니다.', 'hong');
    procDeleteBoard(2);
end;

 

 

트리거

create or replace trigger trgBoard
    after
    insert or delete
    on tblBoard
    for each row
begin

    if inserting then
        update tblUser set point = point + 100 where id = :new.id;
    elsif deleting then
        update tblUser set point = point - 50 where id = :old.id;
    end if;

end;


insert into tblBoard values (seqBoard.nextVal, '또 다시 글을 씁니다.', 'hong');
delete from tblBoard where seq = 3;