为什么要用存储过程?存储过程有什么优势。在什么环境下使用?
几个去 IBM 面试的兄弟回来抱怨:去了好几个不同的 IBM 项目组,差点儿每一个面试官问到数据库的时候都要问用没用过存储过程,烦人不?大家去面的程序猿,又不是 DBA。曾经的项目都没实用到存储,不照样执行的好好的?
存储过程真的那么重要吗。它究竟有什么优点呢?
笔者觉得。存储过程说白了就是一堆 SQL 的合并。
中间加了点逻辑控制。
可是存储过程处理比較复杂的业务时比較有用。
比方说。一个复杂的数据操作。
假设你在前台处理的话。
可能会涉及到多次数据库连接。
但假设你用存储过程的话。就仅仅有一次。从响应时间上来说有优势。
也就是说存储过程能够给我们带来执行效率提高的优点。
另外,程序easy出现 BUG 不稳定。而存储过程。仅仅要数据库不出现故障,基本上是不会出现什么问题的。也就是说从安全上讲,使用了存储过程的系统更加稳定。
数据量小的,或者和钱没关系的项目不用存储过程也能够正常运作。MySQL 的存储过程还有待实际測试。
假设是正式项目,建议你用 sql server 或 oracle 的存储过程。数据与数据之间打交道的话,过程会比程序来的快的多。面试官问有没实用存储,实际上就是想知道前来面试的程序猿究竟做过数据量大的项目没。
假设是培训出来的。或者小项目小公司出来的,对存储肯定接触的少了。
所以。要想进大公司。没有丰富存储过程经验。是不行的。
那么什么时候才干够用存储?对于数据量不是非常大以及业务处理不是非常复杂的小项目就无须要了么?
错。
存储过程不只适用于大型项目,对于中小型项目,使用存储过程也是很有必要的。其威力和优势主要体如今:
1.存储过程仅仅在创造时进行编译,以后每次运行存储过程都不需再又一次编译,而一般 SQL 语句每运行一次就编译一次,所以使用存储过程可提高数据库运行速度。
2.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,假设用程序来完毕,就变成了一条条的 SQL 语句。可能要多次连接数据库。而换成存储,仅仅须要连接一次数据库就能够了。
3.存储过程能够反复使用,可降低数据库开发者的工作量。
4.安全性高,可设定仅仅有某此用户才具有对指定存储过程的使用权。
5.降低网络传输。
存储过程直接就在数据库server上跑(存储过程是直接定义在数据库中的),全部的数据訪问都在server内部进行。不须要数据传输到其他终端。但我们的应付server通常与数据库是在同一内网,大数据的訪问的瓶颈会是硬盘的速度。而不是网速。
create proc proc_test_insert --假设要改动这个存储过程的话仅仅要给create 改为alter即可了 ( @p_name nvarchar(50), @p_age int, @p_email varchar(100), @p_addres nvarchar(100), @p_remarks nvarchar(100) --@num nvarchar out -- 用来保存输出的错误信息。或者成功信息 ) as begin if @p_email is null or LEN(@p_email)<=0 print 'email不能为空'; else if @p_addres is null or LEN(@p_addres)<=0 print '地址不能为空' else begin insert into t_test values(@p_name,@p_age,@p_email,@p_addres,@p_remarks) print ' 插入成功' end end exec proc_test_insert '武松',46,'wusong@163.com','','' --插入不会成功,会报错:"地址不能为空"
或者这样也能够
create proc proc_test_insert --假设要改动这个存储过程的话仅仅要给create 改为alter即可了 ( @p_name nvarchar(50), @p_age int, @p_email varchar(100), @p_addres nvarchar(100), @p_remarks nvarchar(100), @num nvarchar(50) out -- 用来保存输出的错误信息,或者成功信息 ) as begin set @num=''; if @p_email is null or LEN(@p_email)<=0 set @num= 'email不能为空'; else if @p_addres is null or LEN(@p_addres)<=0 set @num= '地址不能为空' else begin insert into t_test values(@p_name,@p_age,@p_email,@p_addres,@p_remarks) set @num= ' 插入成功' end end declare @num nvarchar(50); exec proc_test_insert '鲁智深',45,'','山东省济宁市梁山县','', @num out --插入不会成功,会报错:"email不能为空" print @num