迅闻网
让更多人看到你

mysql存储过程为什么不推荐使用(mysql存储过程怎么写)

  mysql存储过程为什么不推荐使用

存储过程和触发器二者是有很大的联系的,我的一般理解就是触发器是一个隐藏的存储过程,因为它不需要参数,不需要显示调用,往往在你不知情的情况下已经做了很多操作。从这个角度来说,由于是隐藏的,无形中增加了系统的复杂性,非DBA人员理解起来数据库就会有困难,因为它不执行根本感觉不到它的存在。
再有,涉及到复杂的逻辑的时候,触发器的嵌套是避免不了的,如果再涉及几个存储过程,再加上事务等等,很容易出现死锁现象,再调试的时候也会经常性的从一个触发器转到另外一个,级联关系的不断追溯,很容易使人头大。其实,从性能上,触发器并没有提升多少性能,只是从代码上来说,可能在coding的时候很容易实现业务,所以我的观点是:摒弃触发器!触发器的功能基本都可以用存储过程来实现。
在编码中存储过程显示调用很容易阅读代码,触发器隐式调用容易被忽略。
存储过程也有他的致命伤;
存储过程的致命伤在于移植性,存储过程不能跨库移植,比如事先是在mysql数据库的存储过程,考虑性能要移植到oracle上面那么所有的存储过程都需要被重写一遍。
总结:只有在并发不高的项目,管理系统中用。如果是面向用户的高并发应用,都不要使用。触发器和存储过程本身难以开发和维护.

 

mysql

mysql存储过程怎么写

设为“置顶或星标”,第一时间送达干货
SQL专栏
SQL基础常识第二版SQL高级常识第二版
常常有小伙伴问我这个存储进程该怎么写?作为过来人我刚开端也有这样的苦恼,今天就给大家说说这个存储进程该怎么创立和运用。
什么是存储进程
存储进程是一组可编程的函数,是为了完结特定功用的SQL句子集,经编译创立并保存在数据库中,用户可经过指定存储进程的名字并给定参数(需求时)来调用履行。
关键词:可编程,特定功用,调用
创立存储进程
咱们以表customers为例,经过传递客户ID的值来查询客户的具体信息:
表customers
示例:
CREATEPROCEDUREsp_customers(INcusidINT)BEGINSELECT*FROMcustomersWHERE`客户ID`=cusid;END;
上面这是一个比较简略的存储进程,首要的功用便是用来查询客户信息。这儿咱们先简略解释一下:
CREATEPROCEDURE:这是创立存储进程的关键字,属固定语法。
sp_customers:这是存储进程称号,当咱们履行了该存储进程后,体系就会呈现一个该称号的存储进程,能够自界说。
IN:这是输入参数的意思,当然也有输出参数关键字OUT,同时也能够不界说参数,直接让参数为空。
cusidINT:这是界说参数名和类型,这儿咱们界说了一个名为cusid,类型为INT的参数名。
BEGIN…END:这是存储进程进程体的固定语法,你需求履行的SQL功用就写在这中心。
调用存储进程
上面咱们创立好了存储进程今后,就能够调用了。调用存储进程的语法很简略:
CALLsp_name([参数])
下面咱们来调用上面的存储进程sp_customers
CALLsp_customers(1);
解释:
上面的代码的意思便是将客户ID为1的数据,传递给存储进程sp_customers,经过CALL来调用该存储进程来履行。
成果为:
仔细的小伙伴可能现已发现了,这不便是一个简略的WHERE查询句子吗?是的,刚开端运用存储进程时,其实不用把它奥秘化,你越觉得它奥秘越会觉得难以娴熟运用。杂乱的东西先简略化,方可更进一步把握。
进程体
进程体即咱们在调用时有必要履行的SQL句子,上面的SELECT查询即为一个简略的进程体。进程体包含DML、DDL句子,if-then-else和while-do句子、声明变量的declare句子等进程体的格局上面也现已演示过,以BEGIN开端,以END完毕(能够嵌套)。
例如:
BEGINBEGINBEGIN–SQL代码;ENDENDEND
注意:每个嵌套块及其中的每条SQL句子,有必要以分号(;)完毕。表明进程体完毕的BEGIN-END块(又叫做复合句子compoundstatement),即END后面,则不需求分号。
标签
标签通常是与BEGIN-END一同运用,用来增强代码的可读性。语法为:
[label_name:]BEGIN[statement_list]END[label_name]
例如:
label1:BEGINlabel2:BEGINlabel3:BEGIN–SQL代码;ENDlabel3;ENDlabel2;ENDlabel1
该功用不常用,了解即可。
存储进程的参数
上面咱们大致的说了一下存储进程参数界说,下面咱们再具体给大家叙述参数该怎么运用。
参数类型
IN输入参数:表明调用者向进程传入值(传入值能够是字面量或变量)OUT输出参数:表明进程向调用者传出值(能够返回多个值)(传出值只能是变量)INOUT输入输出参数:既表明调用者向进程传入值,又表明进程向调用者传出值(值只能是变量)
IN输入参数
上面的示例便是一个输入参数的示例,这儿不赘述。
OUT输出参数
CREATEPROCEDUREsp_customers_out(OUTcusnameVARCHAR(20))BEGINSELECTcusname;SELECT`名字`INTOcusnameFROMcustomersWHERE`客户ID`=1;SELECTcusname;END
调用上面的存储进程:
CALLsp_customers_out(@cusname);
成果为:
成果1
成果2
上面咱们界说了一个输出参数为cusname的参数(这儿参数类型如果有长度有必要给定长度)。
然后在进程体里边,咱们输出了两次参数的成果,成果1为NULL,是因为咱们的输出参数cusname还没有接收任何值,所认为NULL;
成果2里边有了客户名字,是因为咱们将客户ID为1的客户名字传递给了输出参数cusname。
INOUT输入输出参数
这个不常见,可是也有运用,即同一个参数既为输入参数,也为输出参数,咱们把上面的存储进程稍微修正一下就能够看出区别了。
CREATEPROCEDUREsp_customers_inout(INOUTcusnameVARCHAR(20))BEGINSELECTcusname;SELECT`名字`INTOcusnameFROMcustomersWHERE`客户ID`=2;SELECTcusname;END
调用上述存储进程之前咱们先给定一个输入参数:张三
SET@cusname=’张三’;CALLsp_customers_inout(@cusname);
成果为:
成果1
成果2
上面咱们界说了一个输入输出参数为cusname的参数。然后在进程体里边,咱们输出了两次参数的成果:
第一次咱们将先界说好的“张三”(SET@cusname=’张三’)传递给参数cusname,此刻它为输入参数。进入进程体后首先输出成果1为“张三”,此刻参数cusname为输出参数;
然后经过查询将客户ID为2的客户名字再次传递给cusname,来改动它的值,此刻它同样为输出参数,仅仅输出成果发生了改动。
以上便是三个参数的用法,主张:
需求输入值时运用IN参数;需求返回值时运用OUT参数;INOUT参数尽量少用。

未经允许不得转载:迅闻网 » mysql存储过程为什么不推荐使用(mysql存储过程怎么写)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

迅闻网-让更多人看到你

登录/注册返回首页