今天继续我们的SQL菜鸟教程,上篇博客说了说触发器(SQL菜鸟入门级教程之触发器),今天我们来说说存储过程。其实,触发器也属于存储过程,只不过它比较特殊。下面切入正题,让我带领众菜鸟们一起学习一下存储过程。
存储过程简介
存储过程(Stored Procedure)是数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
在数据库系统中,存储过程和触发器具有很重要的作用。无论是存储过程还是触发器,都是SQL 语句和流程控制语句的集合。
存储过程的分类
1系统存储过程
以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作。
2本地存储过程
用户创建的存储过程是由用户创建并完成某一特定功能的存储过程,这跟各种编程语言里用户自己写的函数非常类似。我们一般所说的存储过程就是指本地存储过程。今天我们重点介绍本地存储过程,其他存储过程了解即可。
3临时存储过程
分为两种存储过程:
一是本地临时存储过程,以“#”开头,这样的存储过程就是存放在tempdb数据库中的本地临时存储过程,且只有创建它的用户才能执行它;
二是全局临时存储过程,以“##”开头,这样的存储过程就是存储在tempdb数据库中的全局临时存储过程,全局临时存储过程一旦创建,以后连接到服务器的任意用户都可以执行它,而且不需要特定的权限。
4远程存储过程
在SQL Server2005中,远程存储过程(Remote Stored Procedures)是位于远程服务器上的存储过程,通常可以使用分布式查询和EXECUTE命令执行一个远程存储过程。
5扩展存储过程
扩展存储过程(Extended Stored Procedures)是用户可以使用外部程序语言编写的存储过程,而且扩展存储过程的名称通常以xp_开头。
创建存储过程的基本代码结构:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量(复用性高,面向对象的编程思想)
4.安全性高,可设定只有某些用户才具有对指定存储过程的使用权
缺点
1.调试麻烦,但是用 PL/SQL Developer 调试很方便!弥补这个缺点。
2.移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。
3.重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。
4.如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的,维护起来更麻烦。
世间所有事物都有两面性,没有绝对好的东西,也没有绝对不好的东西。存储过程既有它的优点也有缺点,我们不能盲目的完全使用存储过程,也不能将其打入冷宫不去用。根据具体的项目,根据实际情况去决定如何使用存储过程,最重要的就是不要过度,平衡就好。
具体该怎么权衡,不是我在这里说一句两句就能解决的,必须亲自去实践中体会,慢慢的就能够掌握其中的火候。最后祝各位和我一样的菜鸟早日成为大牛。笨鸟亦可先飞!
- 16楼yi_zz2小时前
- 笨鸟亦可先飞~~~~~~~~~
- Re: liushuijinger1小时前
- 回复yi_zzn飞啊飞
- 15楼Wentasy2小时前
- 学习了。笨鸟不仅可以先飞,而且可以飞得更高。
- Re: liushuijinger2小时前
- 回复Wentasyn说的没错
- 14楼lfmilaoshi3小时前
- 很棒的文章,典型的编织知识网的过程。。。。米老师
- Re: liushuijinger2小时前
- 回复lfmilaoshin谢谢米老师夸奖 [e04]
- 13楼wang136675393258小时前
- 帅哥顶。
- Re: liushuijinger3小时前
- 回复wang13667539325n[e04]
- 12楼liu7650230518小时前
- [e03]
- Re: liushuijinger8小时前
- 回复liu765023051n[e10]
- 11楼hejingyuan68小时前
- 这个内容正是我们学的,呵呵
- Re: liushuijinger8小时前
- 回复hejingyuan6n哈哈
- 10楼lantingxv_jing13小时前
- [e01]
- Re: liushuijinger13小时前
- 回复lantingxv_jingn[e10]
- 9楼xqf30913小时前
- [e10]
- Re: liushuijinger13小时前
- 回复xqf309n[e04]
- 8楼han_yankun200914小时前
- 支持
- Re: liushuijinger13小时前
- 回复han_yankun2009n[e10]
- 7楼lidaasky14小时前
- 不错不错
- 6楼lantingxv_jing14小时前
- [E01]
- Re: liushuijinger14小时前
- 回复lantingxv_jingn.........
- 5楼wwwwenhuan15小时前
- [e01]
- Re: liushuijinger14小时前
- 回复wwwwenhuann[e10]
- 4楼liutengteng13015小时前
- 支持,加油哈
- Re: liushuijinger15小时前
- 回复liutengteng130n[e10]
- 3楼l116327昨天 23:01
- 好文 顶
- Re: liushuijinger22小时前
- 回复l116327n谢谢
- 2楼lantingxv_jing昨天 23:01
- 给 可亲可爱的师傅:[E01]一个O(∩_∩)O~
- 1楼han_yankun2009昨天 22:07
- 我们也要学习的
- Re: liushuijinger昨天 22:52
- 回复han_yankun2009n好好学