Oracle
[days17] 트리거(Trigger)의 :NEW, :OLD **추가 필요
다연
2020. 11. 23. 17:43
반응형
1. 성적테이블(학번, 이름, 국, 영, 수), 점수테이블(학번, 총점, 평균, 등수) 만들기
create table t_score
(
hak varchar2(10) primary key
,name varchar2(20)
,kor number(3)
,eng number(3)
,mat number(3)
);
create table t_grade
(
hak varchar2(10) primary key
,tot number(3)
,avg number(5,2)
,rank number(3)
,constraint tgrade_hak_fk foreign key(hak) references t_score(hak)
);
2. t_score(h,n,k,e,g) insert가 발생하면 자동으로 t_grade(총,평) insert해주는 트리거 생성
create or replace trigger tri_insert
after
insert on t_score
for each row --행 트리거 필수!!
declare
vtot number(3);
vavg number(5,2) ;
begin
vtot := :NEW.kor +:NEW.eng+ :NEW.mat;
vavg := vtot / 3;
insert into t_grade values (:NEW.hak, vtot, vavg, 1); --등수는 입력전 무조건 1
--commit (트리거는 auto commit이라 필요 없음)
--exception
end;
값 넣어보기
insert into t_score values('A001', '홍길동', 23,34,66 );
insert into t_score values('A002', '김지숙', 43,56, 96 );
select * from t_score;
select * from t_grade;
3. t_score이 update되면 해당 국영수 값이 DBMS에 출력되는 트리거 생성
create or replace trigger tri_update
after
update on t_score
for each row -- :NEW :OLD
declare
vtot number(3);
vavg number(5,2);
begin
vtot := :NEW.kor + :NEW.eng + :NEW.mat;
vavg := vtot / 3 ;
update t_grade
set tot = vtot , avg = vavg
where hak = :OLD.hak;
--dbms_output.put_line( :new.kor || ', ' || :new.eng || ', ' || :new.mat );
--dbms_output.put_line( :old.kor || ', ' || :old.eng || ', ' || :old.mat );
-- exception
end;
A002학생의 국어점수 43->89, 영어점수 56->77로 수정
update t_score
set kor = 89, eng = 77
where hak ='A002';
commit;
4. 등수 매기는 저장 프로시저 생성
create or replace procedure up_rank
is
begin
update t_Grade j
set rank = (select count(*)+1 from t_Grade i where i.tot>j.tot);
--where 이 없기에 모든 레코드 수정
--exception
end;
exec tri_rank;
select * from t_grade;
5. t_score 테이블에 학생 삭제되면 t_grade 테이블에 학생 삭제 + 등수 매기는 트리거 생성
create or replace trigger t_delete
after
delete on t_score
for each row
begin
delete from t_grade
where hak = :old.hak;
tri_rank; --pl/sql 내에서 또 다른 저장 프로시저 호출 가능
--이거 호출하면 수정이되든 삭제되든 매번 랭크 새로 매김
--exception
end;
반응형