2024/05/27

伐木工熊大發表於2024-05-27

今日學習有關知識時長:78分鐘

程式碼行數:80行

發表部落格數量:1篇

今日學習的內容主要是有關資料庫操作中的觸發器和儲存過程。

觸發器(trigger)就相當於事件繫結,當你進行某類sql語句操作時將會自動呼叫你你所設定的觸發器來進行操作。

儲存過程(procedure)就相當於我們Java中的方法,可以帶有引數和返回值,可以在儲存過程中設定多條語句,呼叫儲存過程就相當於自動呼叫這些語句。呼叫時可以直接使用exec+儲存器名稱+引數。

--建立 course 與 sc 表間來維護參照完整性而使用的一個級聯刪除觸發器、一個級聯修改觸發器和一個受限插入觸發器。

create trigger trg_CascadeDelete on Course --級聯刪除觸發器
for delete
as
begin
    delete from sc where Cno in(select Cno from  deleted)
end;
go

create trigger trg_CascadeUpdate on Course --級聯修改觸發器
for update
as
begin 
    if update(Cno)
    begin
        declare @OldCno char(10),@NewCno char(10);
        select @OldCno=Cno from deleted;
        select @NewCno=Cno from inserted;
        update SC set Cno=@NewCno where Cno=@OldCno;
    end
end;
go

create trigger trg_RestrictInsert ON SC --受限插入觸發器
for insert 
as 
begin
    if exists(select * from inserted where Cno not in(Select Cno from Course))
    begin
        raiserror('該課程號不存在',16,1);
        rollback transaction;
    end
end;
go

--統計成績 60 分以下的人數
create procedure UnderSixty
as
begin
    select count(*) 低於60分的人數 from sc where Grade<60;
end;
exec UnderSixty;
go

--統計給定 cno 的課程的平均成績,並返回平均成績
create procedure CourseAvgGrade(@Cno char(10),@Avg float output)
as
begin
    select @Avg=avg(Grade) from sc where Cno=@Cno;
end;
declare @avggrade float
exec CourseAvgGrade '1',@avggrade
select @avggrade as 平均分;
go

--將 sc 表中 grade 從百分制改為等級制(5、4、3、2、1)。即 0-20 分為 1,21-40為 2,4 1-60 為 3,61-80 為 4,81-100 為 5。
create procedure Grades
as
begin
    update sc
    set Grade=
    case
        when Grade between 81 and 100 then 5
        when Grade between 61 and 80 then 4
        when Grade between 41 and 60 then 3
        when Grade between 21 and 40 then 2
        when Grade between 0 and 20 then 1
        else Grade
    end
end;
exec Grades;