Oracle 트리거 사용 안내

28300 단어 Oacle
트리거, 함수, 가방 은 모두 재 활용 할 수 있 는 것 이기 때문에 만 들 때 create or replace 라 는 만능 문 구 를 사용 해 야 합 니 다. 그 다음 에 주인공 trigger 의 등장 입 니 다. 주인공 이 나타 나 려 면 약간의 변동 이 필요 합 니 다. 보통 큰 인물 들 이 마음대로 나타 나 지 않 기 때문에 before [after] insert [update / delete] on table Name 을 붙 여야 합 니 다.
 
create or replace

      trigger is tri_update[/insert/delete/UID]_tableName

             before[after]  insert[update/delete/or 。。。] on  tableName

      [for each row]--        ,             ,        

      [declare

         locateParamater1 type;

        locateParamater1 type;]

      --  begin...end;

      begin

        --do something;

      end;

 
(1) new 와 old 에 대해 서 는 사용 하기 전에 실제 와 연락 하여 생각해 보 세 요. insert 할 때 old 가 없 을 거 예요. delete 할 때 new 가 없 을 거 예요. update 할 때 old 와 new 가 동시에 가지 고 있 을 거 예요. 그리고 new 와 old 는 모두 rowtype 이 라 고 지적 하면 해당 줄 을 대표 할 수 있어 요.new 와 old 의 실제 용법 에 대해 서 는 실례 를 보십시오.
(2) when 에 대해 서 는 안에 있 는 old 와 new 를 주의해 야 합 니 다. 사칭 이 없습니다.그리고 raiseapplication_error 는 그의 참가 형식 (number, 'Some thing you want to say') 을 주의해 야 한다. 그 중의 number 는 - 2000 에서 - 20999 까지 이다.
 
/*  :
、  SC      ,  (   )SC_NUMBER(             )      。*/

create or replace
       trigger tr_Insert_Sc after insert on sc
       for each row
         begin
           --insert      :new
           update SC_Number set ccount=ccount+1 where SC_Number.Sno=:new.Sno;
          end;
/*
、   SC     ,  (   )SC_NUMBER    。*/
insert into sc values('008','C01','92');
delete from sc where sno='008' and cno='C01'
select * from sc where sno='008'
select * from SC_Number;
create or replace 
       trigger tr_Delete_Sc after delete on sc
       for each row
         begin
           update SC_Number set ccount=ccount-1 where SC_Number.Sno=:old.Sno;
          end;
/*
、   SC     ,       ,     SC_NUMBER       ,
    “  (    )           ”  。*/  
insert into sc values('008','C01','92');
delete from sc where sno='008' and cno='C01'
select * from sc where sno='008'
select * from sc where sno='002'
select * from SC_Number; 
update sc set sno='008' where sno='002'
update sc set  grade=90 where sno='008' and cno='C06'
create or replace 
       trigger tr_Edit_SC after update on SC
       for each row
         declare
         student_name student.sname%type;
         begin
             if :new.sno=:old.sno then
               select sname into student_name from student where student.sno=:new.sno;
               dbms_output.put_line(student_name||'Have changed');
             end if;
             if :new.sno<>:old.sno then
               update SC_Number set ccount=ccount-1 where SC_Number.Sno=:old.Sno;
                update SC_Number set ccount=ccount+1 where SC_Number.Sno=:new.Sno;
             end if;
          end;
          
/* 1、  STUDENT    ,           (    CS      )。*/
select * from student;
update student set  student.sname='XXX' where student.sno='003';
create or replace
        trigger  tr_Edit_Student_cons before update on student
        for each row
          when(old.sdept='CS')
          begin
            raise_application_error(-20044,'You Cannot edit the information of cs department');
           end;
/*2、     ,    ‘S’            3 。*/
insert into course  values('S01','Oracle',3,4)
delete from course where course.cno='S01';  
select * from course;
create or replace
       trigger tr_Edit_Course_cons before insert on course
       for each row
         when(new.credit<=5 and new.cno like 'S%')
         begin
           raise_application_error(-20023,'You can not insert the course name ');
         end;

/*
、    90          。*/    
update sc set grade=98 where sno='003' and cno='C10'
delete from sc where sno='003' and cno='C10'
select * from sc;
create or replace 
       trigger tr_delete_SC before delete on SC
       for each row 
         when(old.grade>90)
         begin
           raise_application_error(-20017,'My grade beyond 90,You cannot delete me');
         end;
            
/*         
  Student     ,CS          30 。*/
select * from student;
insert into student values('044','Shawn',21,'m','CS');
delete from student where student.sno='044';
create or replace
       trigger tr_insert_Student before insert on student
       for each row
         when(new.sdept='CS' and new.sage>30)
         begin
           raise_application_error(-20078,'I am a Cs student.My age should little than 30');
         end;
           
/*

   Student        ,      ,    。*/
select * from student;
update student set sage=38 where sno='004'
create or replace 
       trigger tr_update_Student before update on student
       for each row
       when(new.sage<old.sage)
       begin
         raise_application_error(-20089,'Only can beyond the old age!');
       end;
/*

  Student        ,   SC              60,   60,
     ,      ,    SC           。*/
select  round(avg(grade),2),sno  from sc group by sno
delete from student where student.sno='004'
select * from sc

select * from student where student.sno='001'
create or replace 
       trigger tr_delete_student_cons before delete on student
       for each row
         declare 
         avg_score number(4,2);
       begin
         select round(avg(grade),2) into avg_score  from sc where sc.sno=:old.sno;
         if avg_score>70.00 then
           raise_application_error(-20058,'My average score beyond 60!!!!');
           else
             delete from sc where sc.sno=:old.sno;
         end if;
         
       end;

 
 
 
 

좋은 웹페이지 즐겨찾기