다연이네

[days17] 트리거(Trigger)의 :NEW, :OLD **추가 필요 본문

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;

t_score
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;

:NEW :OLD

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;

 

반응형

'Oracle' 카테고리의 다른 글

[days17] PL/SQL의 패키지(Package)  (0) 2020.11.23
[days17] 트리거(Trigger) 예제  (0) 2020.11.23
[days16] Trigger (트리거)  (0) 2020.11.20
[days16] PL/SQL 블록 내에서 에러처리  (0) 2020.11.19
[days15] Stored Function (저장함수)  (0) 2020.11.18
Comments