《数据库系统概念》7-函数、存储过程、触发器

一、函数和存储过程

a)通过函数和存储过程可以将业务逻辑保存在数据库,在需要的时候调用。比如学生在一个学期可以修的最大课程数、导师的最小授课数等,这些判断具有比较复杂的逻辑,虽然在数据库外也可以实现这样的控制,但用函数或存储过程在数据库的入口来把关,可以与应用程序独立开来,便于维护。但感觉将业务逻辑独立写在存储过程也不一定就能便于维护。

b)SQL标准规定的函数定义方法为:

create function dept count(dept_name varchar(20))

returns integer

begin

declare d_count integer;

select count(*) into d_count

from instructor

where instructor.dept_name= dept_name

return d count;

end

函数定义好后,可以在查询语句中调用,就像内置函数一样:

select dept name, budget

from instructor

where dept count(dept name) > 12;

c)函数还可以返回表,称为表函数(table functions),这相当于带参数的视图

create function instructors of (dept_name varchar(20))

returns table ( ID varchar (5), name varchar (20), dept_name varchar (20), salary numeric (8,2))

return table

(select ID, name, dept_name, salary

from instructor

where instructor.dept_name = instructor of.dept_name);

类似的功能也可以使用存储过程:

create procedure dept_count_proc(in dept_name varchar(20), out d_count integer) begin select count(*) into d_count

from instructor

where instructor.dept_name= dept_count proc.dept_name

end

in和out表示数据的输入输出。存储过程还可以重载。

d)存储过程和函数的区别:

函数只能通过return语句返回单个值或者表对象。而存储过程不允许执行return,但是通过out参数返回多个值;

函数是可以嵌入在sql中使用的,可以在select中调用,而存储过程不行;

函数限制比较多,比如不能用临时表,只能用表变量.还有一些函数都不可用等等.而存储过程的限制相对就比较少;

一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。

二、SQL的语法结构

a)SQL也像Java、C等语言一样支持if、for等语法结构,用declare声明变量、用set赋值,但一段SQL要写在begin…end之间,使用begin atomic…end的话,内部的语句构成一个事务。

b)while和repeat

while boolean expression do

sequence of statements;

end while

repeat

sequence of statements;

until boolean expression

end repeat

c)for

declare n integer default 0;

for r as

select budget from department where dept name = ‘Music‘

do

set n = n− r.budget

end for

d)if

if boolean expression

then statement or compound statement

elseif boolean expression

then statement or compound statement else statement or compound statement

end if

三、触发器Trigger

a)触发器包含两个要素:被触发的时机、被触发后执行的动作。

在数据库自带的一致性约束机制无法满足业务需求时,可以用触发器来限制;也可以实现监控、报警、自动化等需求。

b)触发器的创建

create trigger timeslot_check1 after insert on section

referencing new row as nrow

for each row

when (nrow.time slot_id not in (

select time slot_id

from time_slot))

begin

rollback

end;

为在section表insert时创建的触发器,referencing new row as nrow会将被插入的行保存到nrow临时变量,然后使用for each row来遍历。

除了插入操作,删除的触发器写法为:

create trigger timeslot_check2 after delete on timeslot

referencing old row as orow

for each row

when (orow.time slot_id not in (

select time slot_id

from time_slot)

and orow.time slot_id in (

select time slot_id from section)) begin

rollback

end;

临时保存的是删除前的旧行,那么update时新行、旧行都需要:

create trigger credits_earned after update of takes on (grade)

referencing new row as nrow

referencing old row as orow

for each row

when …

begin atomic

end;

只有takes.grade被更新时才会被触发

c)除了用after定义动作发生后的触发器,还可以使用before在动作发生前触发;除了针对行的触发器(for each row),还有针对表的触发器,对应的语法有;refenencing old/new table as、for each statement

d)触发器虽然可以用来解决很多问题,但如果有替代方法,便不推荐使用触发器,因为触发器的错误只能在运行时发现,而且多个触发器的关联会造成维护的困难。

学习资料:Database System Concepts, by Abraham Silberschatz, Henry F.Korth, S.Sudarshan

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容