一、存儲過程
存儲過程:就像函數一樣的
會保存在:數據庫中--》可編程性 --》 存儲過程
創建存儲過程:
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