第9章 自定义函数、存储过程和触发器(1)
- 格式:ppt
- 大小:273.00 KB
- 文档页数:27
存储过程,存储函数和触发器的语法结构
存储过程和存储函数的语法结构如下:
存储过程:
```
CREATE PROCEDURE procedure_name (parameter1 datatype, parameter2 datatype)
BEGIN
-- 存储过程的具体逻辑代码
END;
```
存储函数:
```
CREATE FUNCTION function_name (parameter1 datatype, parameter2 datatype)
RETURNS datatype
BEGIN
-- 存储函数的具体逻辑代码
RETURN value;
END;
```
触发器的语法结构如下:
```
CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name
FOR EACH ROW
BEGIN
-- 触发器的逻辑代码
END;
```
其中,`parameter1, parameter2`为参数列表,`datatype`为参数的数据类型,`procedure_name`为存储过程的名称,
`function_name`为存储函数的名称,`value`为存储函数的返回值,`trigger_name`为触发器的名称,`trigger_time`为触发器的触发时间(BEFORE或AFTER),`trigger_event`为触发器的触发事件(INSERT、UPDATE或DELETE),`table_name`为触发器关联的表名。
`BEGIN`和`END`之间是存储过程、存储函数或触发器的具体逻辑代码。
Sqlserver中存储过程,触发器,⾃定义函数(⼀)Sqlserver中存储过程,触发器,⾃定义函数1.存储过程有关内容存储过程的定义;存储过程的分类;存储过程的创建,修改,执⾏;存储过程中参数的传递,返回与接收;存储过程的返回值;存储过程使⽤游标。
1.1存储过程的定义:存放在服务器上预先编译好的sql语句,可以给存储过程传递参数,也可以从存储过程返回值。
优点:提供了安全访问机制,⽐如可以将不同的存储过程的执⾏权限赋予权限不同的⽤户;改进了执⾏性能,因为存储过程是预编译的;减少了⽹络流量,因为在调⽤存储过程时,传递的字符串很短,没有很长的sql语句;增强了代码的重⽤性。
1.2分类:系统存储过程,sp_开头;扩展存储过程,xp_开头,允许其他⾼级语⾔编写,如c#,以dll形式存在;⽤户⾃定义存储过程:T_SQL存储过程;临时存储过程;局部:命名以 # 开头;全局:命名以 ## 开头;CLR存储过程。
1.3存储过程的创建,修改,执⾏:⾸先确定三个组成部分:输⼊参数和输出参数;sql语句;返回的状态值,指明执⾏状态。
简单语法:eg1:查询指定数据库表orders中的记录个数1create proc CountOfOrders--指定存储过程名2as--指定存储过程的主体3begin4declare@CountOfOrders as int--声明⼀个作为int类型的存储过程的内部变量5select@CountOfOrders=Count(*) fromt orders--将sql语句的返回值赋给前⾯定义的变量6print convert(verchar(10),@CountOfOrders)--将变量转换为字符串型打印7end8go--确定⼀个执⾏计划9exec CountOfOrders--执⾏过程以stuinfo表为例⼦:1create proc countofinfoq2as3begin4declare@CountOfOrders as int--声明⼀个作为int类型的存储过程的内部变量5select@CountOfOrders=Count(*) from stuDB.dbo.stuInfo--将sql语句的返回值赋给前⾯定义的变量6--print convert(varchar(10),@CountOfOrders)--将变量转换为字符串型打印7print@CountOfOrders8end9exec countofinfoqeg2:查询任意数据库表的记录个数,这⾥需要指定参数,要注意参数的定义和执⾏的时的参数传递1create proc CountOfTable2@TableName as Varchar(20)--定义⼀个普通的参数3as4begin5declare@Count as int6exec('select * into tmptable from '+@TableName)--参数的使⽤⽅法,这⾥exec相当于调⽤⼀个新的存储过程7select@Count=Count(*) from tmptable--⽤临时表缓存原表的数据,对临时表操作完后,删除临时表8drop table tmptable9return@Count--存储过程的返回值,只能是整数值!!!10end11declare@Count as int--声明⼀个变量接收返回值12exec@Count=CountOfTable 仓库13print@Count以stuinfo表为例⼦:1select*from stuinfo2drop table stuinfobak13select*into stuDB.dbo.stuinfobak1 from stuinfo4go5create proc CountOfTable16@TableName as Varchar(20)--定义⼀个普通的参数7as8begin9declare@Count as int10exec('select * into stuDB.dbo.stuinfobak2 from '+@TableName)--参数的使⽤⽅法,这⾥exec相当于调⽤⼀个新的存储过程11select@Count=Count(*) from stuDB.dbo.stuinfobak2--⽤临时表缓存原表的数据,对临时表操作完后,删除临时表12drop table stuinfobak213return@Count--存储过程的返回值,只能是整数值!!!14end15go16declare@Count as int--声明⼀个变量接收返回值17exec@Count=CountOfTable1 stuinfo18print@CountView Code调⽤:1declare@Count as int--声明⼀个变量接收返回值2declare@Table as varchar(20)3set@Table='仓库'4exec@Count=CountOfTable @Table5print@Counteg3:参数传递⽅式:1create proc ParamsTransfer2@类别名称varchar(15),3@单价money=$10,4@库存量smallint,5@订购量smallint=5--带默认值,假如没有给它传值,则使⽤默认值6as7begin8select*from产品9join类别on产品.id =类别.id10where11类别.类别名称=@类别名称and12产品.单价>@单价and13产品.库存量>@库存量and14产品.订购量>@订购量15end16exec ParamsTransfer 饮料,1,10,20--顺序传值17exec ParamsTransfer @单价=1,@订购量=20,@库存量=10,@类别名称='饮料'--不按顺序传值18exec ParamsTransfer 饮料,default,10,default--使⽤默认值19exec ParamsTransfer 饮料,default,10--不指定default也是使⽤默认值20exec ParamsTransfer @类别名称='饮料',@库存量=10--不按顺序并且使⽤默认值的传值--eg4:存储过程的返回值: return⼀个整数值;使⽤output参数;返回结构集。
存储过程、触发器和用户自定义函数实验实验内容一练习教材中存储过程、触发器和用户自定义函数的例子。
教材中的BookSales数据库,在群共享中,文件名为BookSales.bak。
实验内容二针对附件1中的教学活动数据库,完成下面的实验内容。
1、存储过程(1)创建一个存储过程,该存储过程统计“高等数学”的成绩分布情况,即按照各分数段统计人数。
CREATE Proc MATH_NUM @MATH CHAR(20)='高等数学'ASSELECT @MATH as canme,count(case when score>=90 then 1 end)as[90以上],count(case when score>=80 and score<90 then 1 end)as[80-90],count(case when score>=70 and score<80 then 1 end)as[70-80],count(case when score>=60 and score<70 then 1 end)as[60-70],count(case when score<60 then 1 end)as[60以下] FROM study,course WHERE o=o and ame=@MATHGROUP BY ame(2)创建一个存储过程,该存储过程有一个参数用来接收课程号,该存储过程统计给定课程的平均成绩。
CREATE Proc AVG_SCORE @cno CHAR(20)ASSELECT @cno as 课程号,ame as 课程名,STR(AVG(score),5,2) as 平均成绩FROM study,courseWHERE o=o and o=@cno GROUP BY ame(3)创建一个存储过程,该存储过程将学生选课成绩从百分制改为等级制(即A、B、C、D、E)。
存储过程、存储函数概述存储过程和存储函数指存储在数据库中供所有用户程序调用的子程序叫存储过程、存储函数。
存储过程和存储函数的相同点:完成特定功能的程序。
存储过程和存储函数的不同点:存储函数可以用return语句返回,存储过程不能用return 语句返回。
存储过程的创建和调用创建和使用存储过程语法:create [or replace] procedure 过程名(参数列表) --or replace替换一个存储过程as --声明部分,同declare同一个意思plsql子程序体;注意:当程序体执行完之后在plsql当中会有一个存储数据库对象。
例子:使用存储过程打印hellowordcreate or replace procedure sayhellowordas 说明部分begindbms_output.put_line('helloword');end;/调用存储过程:方法1、exec syhellloword();方法2、beginsayhelloworld();sayhelloworld();end;/通过sqlplus调用存储过程打印出结果带参数的存储过程创建带参数的存储过程给指定员工涨100工资,并且打印涨前涨后的薪水实例:create or replace procedure raisesala(eno in number) --in为输入参数as --声明部分psal emp.sal%type; --声明变量begin--查询员工涨前薪水select psal into sal from emp where empno = eno;--修改员工薪水加100update emp set sal = sal +100 where empno = eno;--打印涨前和涨后的薪水dbms_output.put_line('涨前'||psal||'涨后'psal+100)end;/--结果输出,打开sqlplus通过如下语法执行进行修改薪水beginraisesala(7839); --括号内的值为打印输入的人员编号raisesala(7566);commit; --因为提交过事务,所以需要使用commit进行结束end;/执行后结果:。