存储过程(SQLServer).ppt
《存储过程(SQLServer).ppt》由会员分享,可在线阅读,更多相关《存储过程(SQLServer).ppt(47页珍藏版)》请在三一办公上搜索。
1、存储过程,杨之江,内容,存储过程概念创建和执行存储过程从存储过程中返回数据查看、修改、删除存储过程 存储过程的加密存储过程的调试重新编译存储过程C#中调用存储过程Q&A,T-SQL 来进行编程的两种方法,在利用数据库管理系统创建应用程序时,SQL语言是应用程序和数据库管理系统之间的主要编程接口。使用SQL语言编写代码时,可以用两种方法存储和执行代码。一种是在客户端存储代码,并创建向数据库管理系统发送SQL语句并处理返回结果的应用程序;第二种是将这些SQL语句存储在数据库管理系统中,这些存储在数据库管理系统中的SQL语句就是存储过程,然后再创建执行存储过程并处理返回结果的应用程序。,1 存储过程
2、概念,存储过程是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它系统存储过程系统过程主要存储在master 数据库中并以sp_为前缀,并且系统存储过程主要是从系统表中获取信息,从而为系统管理员管理SQL Server 提供支持。用户自定义存储过程用户自定义存储过程是由用户创建并能完成某一特定功能如查询用户所需数据信息的存储过程,存储过程可以,接受输入参数并以输出参数的形式将多个值返回给调用过程。包含执行数据库操作(包括调用其它存储过程)的编程语句。向调用过程返回状态值,以表明执行成功或失败(以及失败原因),使用
3、存储过程的好处,允许模块化程序设计标准的编写规范多次调用而不必重新编写该存储过程的SQL语句对存储过程进行修改但对应用程序源代码毫无影响提高了程序的可移植性改善性能,执行速度快存储过程是预编译的,而批处理的SQL 语句在每次运行时都要进行编译和优化因此速度相对要慢一些减少网络流量客户计算机上调用该存储过程时网络中传送的只是该调用语句,否则将是多条SQL 语句从而大大增加了网络流量,降低网络负载可作为安全机制使用系统管理员通过对执行某一存储过程的权限进行限制从而能够实现对相应的数据访问权限的限制避免非授权用户对数据的访问保证数据的安全,2 创建和执行存储过程,创建存储过程 CREATE PROC
4、|PROCEDURE schema_name.procedure_name parameter type_schema_name.data_type VARYING=default OUTPUT,.n WITH,.n FOR REPLICATION AS;.n;:=ENCRYPTION RECOMPILE,2 创建和执行存储过程,执行存储过程 EXEC UTE 存储过程名 实参,n,注意事项,不能将CREATE PROCEDURE语句与其它SQL语句组合到一个批处理中。创建存储过程的权限默认属于数据库所有者,该所有者可将此权限授予其他用户。存储过程是数据库对象,其名称必须遵守数据库对象命名规则
5、。只能在当前数据库中创建存储过程。,例1带有复杂 SELECT 语句的存储过程:对pubs数据库,查询居住在“Oakland”城市(authors表中的city列)的作者的姓名(au_lname列和au_fname列的值的组合)、所写的图书的书名(titles表中的title列)、图书出版日期(titles表中的pubdate列)以及出版商名(publishers表中的pub_name列)。,CREATE PROCEDURE p_city1 ASSELECT au_lname+au_fname AS 作者名,title as 书名,pubdate as 出版日期,pub_name as 出版商
6、 FROM authors join titleauthor ON authors.au_id=titleauthor.au_id JOIN titles ON titles.title_id=titleauthor.title_id JOIN publishers ON publishers.pub_id=titles.pub_id WHERE authors.city=Oakland调用:EXEC p_city1,例2带有输入参数的存储过程:查询居住在指定城市的作者的姓名、所写的图书的书名、图书出版日期和出版商名,CREATE PROCEDURE p_city2 city as varch
7、ar(20)ASSELECT au_lname+au_fname AS 作者名,title as 书名,pubdate as 出版日期,pub_name as 出版商 FROM authors join titleauthor ON authors.au_id=titleauthor.au_id JOIN titles ON titles.title_id=titleauthor.title_id JOIN publishers ON publishers.pub_id=titles.pub_idWHERE authors.city=city调用:EXEC p_city2 Salt Lake
8、City,例3带有多个输入参数并有默认值的存储过程:查询某个指定州(authors表中的state列)、电话号码(authors表中的phone列)前3位为指定数字的作者的姓名、州和电话号码,其中州的默认值为“CA”。,CREATE PROCEDURE p_state zh char(10)=CA,dh char(3)AS SELECT au_lname,au_fname,state,phone FROM authors WHERE state=zh and left(phone,3)=dh,参数的传递方式,按参数位置传递值 EXEC p_state ca,408 按参数名传递值 EXEC p
9、_state dh=408,zh=ca,例4带有多个输入参数并均指定默认值的存储过程。对pubs数据库的titles表,查询指定类型(type)以及价格(price)大于指定价格的图书的书号(title_id)、书名(title)、价格(price)和出版日期(pubdate),其中类型的默认值为“business”,价格的默认值为15,CREATE PROCEDURE p_title type varchar(20)=business,price int=15AS SELECT title_id,title,type,price,pubdate FROM titles WHERE type=
10、type and price=price,执行示例,执行1:不提供任何参数值。EXEC p_title执行2:提供全部参数值。EXEC p_title psychology,10执行3:只提供第二个参数的值。EXEC p_title price=10,例5带输出参数的存储过程。计算两个数的乘积,并将计算结果作为输出参数返回给调用者。,CREATE PROCEDURE p_multivar1 int,var2 int,var3 int outputAs Set var3=var1*var2 执行此存储过程:Declare res intEXEC p_multi 5,7,res outputPri
11、nt res,例6带输入参数和一个输出参数的存储过程。统计指定类型的图书的平均价格,并将统计的结果作为输出参数返回。,CREATE PROC p_AvgPrice type varchar(20),avg_price int outputAS SELECT avg_price=AVG(price)FROM titles WHERE type=type 执行此存储过程:DECLARE ap intEXEC p_AvgPrice business,ap outputPRINT ap,例7带有多个输入参数和多个输出参数的存储过程。统计指定类型和指定年份出版的图书的个数和平均价格,并将统计的结果作为输
12、出参数返回。,CREATE PROC p_AvgCount type varchar(20),year int,total int output,avg_price int outputAS SELECT avg_price=AVG(price),total=count(title_id)FROM titles WHERE type=type and year(pubdate)=year,执行例7存储过程,DECLARE c int,g intEXEC p_AvgCount trad_cook,1991,c output,g outputprint cprint g 执行结果为:3 16,例8
13、建立修改数据的存储过程。对pubs数据库的titles表,将指定类型的图书的价格进行适当增加,增加的规则:如果价格高于20,则加价10%;如果价格在1020之间,则加价20%,否则加价30%。,CREATE PROCEDURE p_update type char(20)AS UPDATE titles SET price=price*case when price 20 then 1.1 when price between 10 and 20 then 1.2 else 1.3 end WHERE type=type,例9建立删除数据的存储过程。对pubs数据库的titles表,删除指定类
14、型的图书中价格最低的图书记录。,CREATE PROCEDURE p6 type char(20)AS DELETE FROM titles WHERE price=(SELECT min(price)FROM titles WHERE type=type)and type=type,3 从存储过程中返回数据,存储过程以下列四种形式返回数据:输出参数,既可以返回数据,也可以返回游标变量。返回代码,始终是整型值。SELECT 语句的结果集。可从存储过程外引用的全局游标。,使用返回代码返回数据,使用RETURN 语句指定存储过程的返回代码,执行存储过程时必须将返回代码保存到变量中,以便在调用程序中
15、使用返回代码值。例如:DECLARE result intEXECUTE result=my_proc,例1对pubs数据库的titles表,建立查询指定类型的图书的书名和价格的存储过程,如果用户没有指定类型,则在屏幕上显示“请指定一个图书类型”,并从存储过程中退出。如果用户指定了图书类型,则执行相应的查询。,CREATE PROCEDURE p_FindTitle type varchar(20)=NULLAS IF type IS NULL BEGIN PRINT 必须指定一个图书类型 RETURN END ELSE BEGIN SELECT title,price FROM titles
16、 WHERE type=type END,例2.有返回状态代码的存储过程。对pubs数据库的authors表,检查用户指定的作者(作者编号)所在的州。如果所在的州是加利福尼亚州(CA),将返回状态代码“1”。否则,对于任何其它情况均返回状态代码“2”,CREATE PROCEDURE p_CheckState au_id varchar(12)AS IF(SELECT state FROM authors WHERE au_id=au_id)=CA RETURN 1 ELSE RETURN 2,例3根据各种错误设置不同的返回代码值。对Pubs数据库的titles表,查询指定图书编号(title
17、_id)的图书的销售量,根据每种可能的错误赋予的返回代码的值如表所示。,例3代码,CREATE PROCEDURE p_GetSalestitle_id varchar(80)=NULL,ytd_sales int OUTPUT AS-验证title参数的有效性 IF title_id IS NULL BEGIN PRINT 错误:必须指定一个书名!RETURN(1)END ELSE BEGIN-确保书号是有效的 IF(SELECT COUNT(*)FROM titles WHERE title_id=title_id)=0 RETURN(2)END,例3代码(续),-得到指定图书的销售量并将
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 存储 过程 SQLServer
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-6564327.html