分享
 
 
 

《高性能的数据库》 第四讲 编程细节(1)

王朝other·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

第四讲 编程细节(上部分)

1、触发器

2、游标

3、函数

4、存储过程

5、事务

----------

作者:懒虫 # SapphireStudio .

欢迎访问我们的站点:www.chair3.com

欢迎转载。

-----------

这里只打算讲解四部分了,也就最简单、最常用的四部分。

1、触发器。

定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。

常见的触发器有三种:分别应用于Insert , Update , Delete 事件。(SQL Server 2000定义了新的触发器,这里不提)

我为什么要使用触发器?比如,这么两个表:

Create Table Student( --学生表

StudentID int primary key,--学号

....

)

Create Table BorrowRecord(--学生借书记录表

BorrowRecordint identity(1,1),--流水号

StudentID int , --学号

BorrowDatedatetime, --借出时间

ReturnDAteDatetime, --归还时间

...

)

用到的功能有:

1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);

2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。

等等。

这时候可以用到触发器。对于1,创建一个Update触发器:

Create Trigger truStudent

On Student

for Update

--------------------------

--Name:truStudent

--func:更新BorrowRecord 的StudentID,与Student同步。

--Use :None

--User:System

--Author:懒虫 # SapphireStudio (www.chair3.com)

--Date:2003-4-16

--Memo:临时写写的,给大家作个Sample。没有调试阿。

-------------------------------------

As

if Update(StudentID)

begin

Update BorrowRecord

Set br.StudentID=i.StudentID

From BorrowRecord br , Deletedd ,Inserted i

Where br.StudentID=d.StudentID

end

理解触发器里面的两个临时的表:Deleted , Inserted 。注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。

一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted表,然后删除Student记录并写入新纪录。

对于2,创建一个Delete触发器

Create trigger trdStudent

On Student

for Delete

----------------------------------------------

--Name:trdStudent

--func:同时删除 BorrowRecord 的数据

--Use :None

--User:System

--Author:懒虫 # SapphireStudio (www.chair3.com)

--Date:2003-4-16

--Memo:临时写写的,给大家作个Sample。没有调试阿。

----------------------------

As

Delete BorrowRecord

From BorrowRecord br , Delted d

Where br.StudentID=d.StudentID

从这两个例子我们可以看到了触发器的关键:A.2个临时的表;B.触发机制。

这里我们只讲解最简单的触发器。复杂的容后说明。

事实上,我不鼓励使用触发器。触发器的初始设计思想,已经被“级联”所替代。

2.游标

在SQL 2000之前,游标可谓是SQL Server心中的痛: 老牛般的速度(CPU),河马般的胃口(内存)。可你却不能不用他。

什么叫游标呢?说白了就是像高级语言一样,是存放数据集,并逐条访问的一种机制。

比如在Delphi里面,要实现类似于这样的功能:(呵呵,不好意思,我只会Delphi,所以只能举一个Delphi的例子)

//这是一段Delphi的源代码

adoDataSet1.Close;

adoDataSet1.CommandText:=' Select * From Student order by StudentID ';

adoDataSet1.Open;

While Not adoDAtaSet1.Eof Do

Begin

YourVar:=adoDAtaSet1.FieldByName('StudentID').AsInteger;

DoSomeThing();

....

adoDataSet1.Next;

End

在SQL Server 并没有很好的数据逐条访问机制,如果有,那就是游标。

还是举例子:

对于表

Create Table BorrowRecord(--学生借书记录表

BorrowRecordint identity(1,1),--流水号

StudentID int , --学号

StudentFeeIDint , --费用结算号 (外键)

BorrowDatedatetime, --借出时间

ReturnDAteDatetime, --归还时间

Fee Money --借书费用

...

)

Create Table StudentFee(--学生费用结算表

StudentFeeIDintprimarykey , --费用结算号 (主键)

StudentID int , --学号

BorrowBookAllFee Money, --所有借书总费用

...

)

两者关系为多对一的关系,关联字段为StudentFeeID

由于某种原因StudentFee表的数据遭到了破坏,我想StudentFee循环一遍将“所有借书总费用”重算 。

-------------------------------------------------

-----------------------------

--Name:一部分代码

--func:更新学生借书总费用

--Use :

--User:

--Author:懒虫 # SapphireStudio (www.chair3.com)

--Date:2003-4-16

--Memo:临时写写的,给大家作个Sample。没有调试阿。

--------------------------------

--声明一个游标

Declare curStudentFee Cursor

for

Select StudentFeeID From StudentFee

--声明两个费用变量

Declare @mBorrowBookAllFee Money--总费用

Declare @iStudentFeeID Int--借书结算号

--初始化

Set @mBorrowBookAllFee=0

Set @iStudentFeeID=0

--打开游标

Open curStudentFee

--循环并提取记录

Fetch Next From curStudentFee Into @iStudentFeeID

While ( @@Fetch_Status=0 )

begin

--从借书记录中计算某一学生的借书总记录的总费用

Select @mBorrowBookAllFee=Sum(BorrowBookAllFee)

From BorrowRecord

Where StudentFeeID=@iStudentFeeID

--更新到汇总表。

Update StudentFee Set BorrowBookAllFee=@mBorrowBookAllFee

Where StudentFeeID=@iStudnetFeeID

Fetch Next From curStudentFee Into @mFee

end

--关闭游标

Close curStudentFee

--释放游标

Deallocate curStudentFee

--------

-----------------------------

关注游标的要点:1、声明、打开、关闭、释放 ; 2、@@Fetch_Status 游标提取状态标志,0表示正确

这里,我也要提到,我不鼓励使用游标。更多的情况下,在SQL 2000 里面 ,函数已经能够实现绝大部分游标的功能。

好累,好不容易算是将1、2点讲完,算是上部分把。后面的几点等会再说了……:(:(。

大家给点鼓励?

懒虫 # SapphireStudio ,精彩世界,尽在 3腿网 ( www.chair3.com )。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有