09-19:存储过程
2018-09-19 本文已影响0人
神坛下的我
触发器笔记(续)
- 触发器是一类特殊的存储过程
- DDL触发器(insert,delete,update)
- 后触发器 for,DDL触发器是建立在表上的,所有语法on table for insert,
delete,update操作会相应激活触发器,同一个触发器针对多种动作都会触发,
通过查询inserted和deleted幻表中是否存在数据来判断是哪种操作。
针对dml操作产生数据变化,额外做记录,使用后触发器 - 替代触发器(前触发器)instead of
将dml替代掉,针对dml操作产生数据变化,需要判断和验证通过才执行的使用
替代触发器。
create trigger trg_teacher_add
on teacher
instead of insert
as
begin
declare @countno int
select @countno = count(*) from student
print convert(char(2),@countno)+'位教师'
if @countno <= 11
begin
insert into teacher select * from inserted
end
else
begin
print '无法添加新教师,已经满员'
end
end
...
- 新版的dml触发器是关闭秦涛,如一张表有替代插入触发器,数据通过验证,
仍然需要将数据插入到本表中,如果打开了触发器嵌套,则形成 自己插入自
己激活触发器又插入自己的死循环,解决方案为,插入表,触发器内部插入该
表的视图,或者插入视图,触发器建立在视图上,在触发器中插入本表。
- DCL触发器(create,drop,alter)
- 星期三不准删除表
create trigger trg_drop_table
on datebase
for drop_table
as
begin
declare @day int
select @day = datepart(dw,getdate())
if(@day = 4)
begin
raiserror('星期三不准删除表',16,20)
rollback transaction
end
end
- 查看表编号
select object_id('student')
存储过程
- 是数据库预编译的对象,能够提高数据查询的效率。
- 存储过程好处:
- 提高查询效率
- 减少网络传输
- 可以灵活的返回多种数据
- 存储过程用于需要经过逻辑计算之后执行的dml,dql甚至ddl批量操作
- 车次与票务表
create table train
(
tid char(6) primary key,
startCity varchar(20),
endCity varchar(20),
begintime datetime,
siteno int,
rowno int,
coachno int
)
create table ticket
(
tkno char(12) primary key,
issell int
)
- 增加一个车次,填写了车次相关信息后,自动添加票务信息
create procedure prc_addTrain @tid char(6),
@startCity varchar(20),
@endCity varchar(20),
@begintime datetime,
@siteno int, --每排的座位数
@rowno int, --每节车厢的排数
@coachno int, --车厢
@outno int output
as
begin
insert into train values(@tid,@startCity,@endCity,@begintime,@siteno,@rowno,@coachno)
declare @i int = 0,@j int = 0,@k int = 0,@coachnot char(2),
@rownot char(2)
while (@i < @coachno) --循环车厢
begin
set @i = @i + 1
while(@j < @rowno) --循环每节车厢的行
begin
set @j = @j+1
while(@k < @siteno) -- 循环每一行的座位
begin
set @k = @k+1
if(@i < 10)
begin
set @coachnot = '0' + convert(char(2),@i)
end
else
begin
set @coachnot = convert(char(2),@i)
end
if(@j < 10)
begin
set @rownot = '0' + convert(char(2),@j)
end
else
begin
set @rownot = convert(char(2),@j)
end
-- print @coachnot+@rownot+
-- convert(char(1),char(@k + 64))
insert into ticket values(@tid+'-'+@coachnot+@rownot+
convert(char(1),char(@k + 64)),0)
end
set @k = 0
end
set @j = 0
end
set @outno = @siteno * @rowno * @coachno
end
-- 输出参数使用:存储过程定义的时候,在输入参数之后,写输出参数
带out关键值,并在存储过程中给out参数赋值,调用的时候声明相应变量
来接收输出参数。
declare @outno int
exec prc_addTrain 'T05031','成都','广安','2011-12-23',5,10,2,@outno output
print '本次增加车票数量为'+convert(varchar(10),@outno)
-- 得到字符的ASCII值:select ASCII('a')
- 每位同学都要加分,1.60分以下加20%;2.60-80加18%但不超过90分;3.80分
以上加15%但不超过100分,显示加分后的成绩