当前位置: 首页 > news >正文

(转)菜鸟学数据库(三)——存储过程

 

今天继续我们的SQL菜鸟教程,上篇博客说了说触发器(SQL菜鸟入门级教程之触发器),今天我们来说说存储过程。其实,触发器也属于存储过程,只不过它比较特殊。下面切入正题,让我带领众菜鸟们一起学习一下存储过程。


存储过程的详细使用,请参考另一篇博文——SQL Server基础之存储过程(清晰使用)


存储过程简介


  存储过程(Stored Procedure)是数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
在数据库系统中,存储过程和触发器具有很重要的作用。无论是存储过程还是触发器,都是SQL 语句和流程控制语句的集合。



存储过程的分类


1系统存储过程


  以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作。


2本地存储过程


  用户创建的存储过程是由用户创建并完成某一特定功能的存储过程,这跟各种编程语言里用户自己写的函数非常类似。我们一般所说的存储过程就是指本地存储过程。今天我们重点介绍本地存储过程,其他存储过程了解即可。


3临时存储过程


  分为两种存储过程:
  一是本地临时存储过程,以“#”开头,这样的存储过程就是存放在tempdb数据库中的本地临时存储过程,且只有创建它的用户才能执行它;
  二是全局临时存储过程,以“##”开头,这样的存储过程就是存储在tempdb数据库中的全局临时存储过程,全局临时存储过程一旦创建,以后连接到服务器的任意用户都可以执行它,而且不需要特定的权限。


4远程存储过程


  在SQL Server2005中,远程存储过程(Remote Stored Procedures)是位于远程服务器上的存储过程,通常可以使用分布式查询和EXECUTE命令执行一个远程存储过程。


5扩展存储过程


  
扩展存储过程(Extended Stored Procedures)是用户可以使用外部程序语言编写的存储过程,而且扩展存储过程的名称通常以xp_开头。



创建存储过程的基本代码结构:

 

[sql]  view plain copy 在CODE上查看代码片 派生到我的代码片
 
  1. CREATE PROCEDURE Procedure_Name    
  2.   
  3.     --Procedure_Name为存储过程名(不能以阿拉伯数字开头),在一个数据库中触发器名是唯一的。名字的长度不能超过个字。PROCEDURE可以简写为PROC。  
  4.        
  5.     @Param1 Datatype,@Param2 Datatype   
  6.       
  7.     --@Param1和@Param2为存储过程的参数,Datatype为参数类型,多个参数用逗号隔开,最多允许个参数。  
  8.       
  9. AS --存储过程要执行的操作   
  10.   
  11. BEGIN  
  12.       
  13.     --BEGIN跟END组成一个代码块,可以写也可以不写,如果存储过程中执行的SQL语句比较复杂,用BEGIN和END会让代码更加整齐,更容易理解。  
  14.   
  15.       
  16.       
  17. END  
  18. GO --GO就代表结操作完毕    
  19.   
  20.   
  21.   
  22. exec Procedure_Name [参数名] --调用存储过程Procedure_Name。  
  23.   
  24. drop procedure Procedure_Name --删除存储过程Procedure_Name,不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程  
  25.   
  26. show procedure status --显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等  
  27.   
  28. show create procedure Procedure_Name --显示存储过程Procedure_Name的详细信息  
  29.   
  30. exec sp_helptext Procedure_Name --显示你这个Procedure_Name这个对象创建文本  

 


优点


  1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

  2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。

  3.存储过程可以重复使用,可减少数据库开发人员的工作量(复用性高,面向对象的编程思想)

  4.安全性高,可设定只有某些用户才具有对指定存储过程的使用权


缺点


  1.调试麻烦,但是用 PL/SQL Developer 调试很方便!弥补这个缺点。

  2.移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。

  3.重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。

  4.如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的,维护起来更麻烦。


世间所有事物都有两面性,没有绝对好的东西,也没有绝对不好的东西。存储过程既有它的优点也有缺点,我们不能盲目的完全使用存储过程,也不能将其打入冷宫不去用。根据具体的项目,根据实际情况去决定如何使用存储过程,最重要的就是不要过度,平衡就好。

具体该怎么权衡,不是我在这里说一句两句就能解决的,必须亲自去实践中体会,慢慢的就能够掌握其中的火候。最后祝各位和我一样的菜鸟早日成为大牛。笨鸟亦可先飞!

 

 

转载于:https://www.cnblogs.com/lixuwu/p/5676135.html

相关文章:

  • Swift - 禁用UIWebView和WKWebView的下拉拖动效果
  • ubuntu上hadoop 单节点伪分布式安装测试
  • 开发npm模块经验总结
  • Fiddler
  • 菜鸟的it之路-起航
  • 10分钟掌握XML、JSON及其解析
  • WIN32编程经验总结
  • awk 内容
  • (算法)Game
  • Java Web项目的发布
  • 学习git遇到的问题的提出与总结
  • 鸡蛋的硬度
  • 百度基础技术测试部一面2015/10/15 实习生
  • 在C#中使用官方驱动操作MongoDB
  • Android 百度推送服务
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 【知识碎片】第三方登录弹窗效果
  • ES6语法详解(一)
  • git 常用命令
  • httpie使用详解
  • java8-模拟hadoop
  • Javascript编码规范
  • JavaScript类型识别
  • javascript面向对象之创建对象
  • JavaScript中的对象个人分享
  • js继承的实现方法
  • MD5加密原理解析及OC版原理实现
  • SpiderData 2019年2月23日 DApp数据排行榜
  • 前端面试题总结
  • 区块链将重新定义世界
  • 数据结构java版之冒泡排序及优化
  • 运行时添加log4j2的appender
  • 如何正确理解,内页权重高于首页?
  • ​力扣解法汇总946-验证栈序列
  • #include
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (¥1011)-(一千零一拾一元整)输出
  • (BFS)hdoj2377-Bus Pass
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (十) 初识 Docker file
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .a文件和.so文件
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .net打印*三角形
  • .net反混淆脱壳工具de4dot的使用
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .NET实现之(自动更新)
  • .NET项目中存在多个web.config文件时的加载顺序
  • .project文件
  • :“Failed to access IIS metabase”解决方法
  • @Bean注解详解
  • [BUUCTF 2018]Online Tool(特详解)