SQL 存儲過程 觸發器 事務


一、存儲過程

存儲過程:就像函數一樣的
會保存在:數據庫中--》可編程性 --》 存儲過程

創建存儲過程:
create proc JiaFa --存儲關鍵字proc

@a int,               --需要的參數
@b int

as
                         --存儲過程的內容
declare @c int;
set @c = @a + @b;
return @c;
go                     --執行完畢后全部選中,執行創建



執行存儲過程:關鍵字exec
exec JiaFa 3,5;              --無返回值時

declare @f int;               --有返回值時
exec @f = JiaFa 3,5;       --存儲名后面填參數
print @f;

例:根據用戶傳入的參數查詢汽車表符合該條件的汽車數量
create proc ChaXun       --創建存儲過程
@n varchar(20)
as
declare @num int
select @num = count(*) from car where name like '%'+@n+'%'
return @num
go

 

declare @m int              --執行存儲過程
exec @m = ChaXun '奧迪'
print @m

 

二、觸發器

 

是一個特殊的存儲過程    通過增刪改的動作來觸發執行,沒有參數,沒有返回值

滿足條件時執行,否則不執行

 

create trigger Insert _Student            --命名規范  關鍵字:tigger  注意下划線

                     Insert/delete/update_表名   在[表名]表 添加/刪除/修改 數據是執行

on student                                        --針對於哪一個表    on

for /instead of   insert                      --針對於哪一個動作來觸發   for     同js: onclick = "show()"

as

      觸發執行的代碼段 觸發過程
go

※ for的意思是在動作執行之后觸發

※ instead of delete 的意思是刪除之前引發,可以理解為替代,寫了這個之后,寫的執行代碼就沒有用了,就被觸發器的代碼覆蓋了

 

例:

create trigger Delete_Info

on info
instead of delete
as
declare @c varchar(20)
select @c = code from deleted

delete from work where infocode=@c
delete from family where infocode=@c
delete from info where code=@c
go

 

觸發器常用的為級聯刪除

例:
create trigger delete_student
on student
instead of delete
as
--如果要刪除student表數據,那么需要級聯刪除
declare @sno varchar(20);
set @sno = sno from deleted      --deleted固定格式,為刪除執行所能刪除的數據,並沒有執行刪除,而是把他們顯示出來,在這獲得要刪除的數據的sno,

                   然后先刪除其他表中此sno的數據
delete from score where sno = @sno;
delete from student where sno = @sno;
go

 三、事務

保障流程的完整執行 (兩條多條sql語句要么同時成功,要么同時失敗)

例:就像銀行取錢,先在你賬上扣錢,然后存入別人的賬上,但是從你賬上扣完錢了,突然網斷了,對方沒有收到錢,那么此時你的錢也沒了,別人的錢也沒加上,為了防止此類情況的出現,事務。

 

begin tran               --在流程開始的位置

  sql語句

if @@ERROR>0           --判斷是否有錯誤
begin
  rollback tran          --回滾事務,到begin tran的位置,就當沒發生過
end
else
begin
  commit tran           --提交事務,都沒問題,那么就一把進行提交
end

 

例:購物車實例

begin tran                                       --開啟事務
declare @tran_error int;                   --存儲錯誤
set @tran_error = 0;                       --默認沒有錯誤

update Fruit set Numbers = Numbers-1 where Ids='k002'
set @tran_error = @tran_error + @@ERROR;
update Login set Account=Account-1 where UserName='wangwu'
set @tran_error = @tran_error + @@ERROR;
insert into Orders values('d002','wangwu','2016-8-7')
set @tran_error = @tran_error + @@ERROR;
insert into OrderDetails values('d002','k002',10)
set @tran_error = @tran_error + @@ERROR;


if @tran_error>0
begin
rollback tran                                   --回滾事務,到begin tran的位置,就當沒發生過
end
else
begin
commit tran                                   --提交事務,都沒問題,那么就一把進行提交
end


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM