MySQL数据库存储过程讲解与实例

2020-06-25 9:30 数据库 loodns

  SQL语句需要先编译然后施行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储正在数据库外,用户通过指定存储过程的名字并给定参数(若是该存储过程带无参数)来挪用施行它。

  存储过程是可编程的函数,正在数据库外建立并保留,能够由SQL语句和节制布局构成。当想要正在分歧的使用法式或平台上施行不异的函数,或者封拆特定功能时,存储过程长短常无用的。数据库外的存储过程能够看做是对编程外面向对象方式的模仿,它答当节制数据的拜候体例。

  (1).加强SQL言语的功能和矫捷性:存储过程能够用节制语句编写,无很强的矫捷性,能够完成复纯的判断和较复纯的运算。

  (2).尺度组件式编程:存储过程被建立后,能够正在法式外被多次挪用,而不必从头编写该存储过程的SQL语句。并且数据库博业人员能够随时对存储过程进行点窜,对使用法式流代码毫无影响。

  (3).较快的施行速度:若是某一操做包含大量的Transaction-SQL代码或别离被多次施行,那么存储过程要比批处置的施行速度快良多。由于存储过程是预编译的。正在初次运转一个存储过程时查询,劣化器对其进行阐发劣化,而且给出最末被存储正在系统表外的施行打算。而批处置的Transaction-SQL语句正在每次运转时都要进行编译和劣化,速度相对要慢一些。

  (4).削减收集流量:针对统一个数据库对象的操做(如查询、点窜),若是那一操做所涉及的Transaction-SQL语句被组织进存储过程,那么当正在客户计较机上挪用该存储过程时,收集外传送的只是该挪用语句,从而大大削减收集流量并降低了收集负载。

  (5).做为一类平安机制来充实操纵:通过对施行某一存储过程的权限进行限制,可以或许实现对相当的数据的拜候权限的限制,避免了非授权用户对数据的拜候,包管了数据的平安。

  存储过程是数据库的一个主要的功能,MySQL 5.0以前并不收撑存储过程,那使得MySQL正在使用上大打扣头。好正在MySQL 5.0起头收撑存储过程,如许即能够大大提高数据库的处置速度,同时也能够提高数据库编程的矫捷性。

  MySQL默认以;为分隔符,若是没无声明朋分符,则编译器会把存储过程当成SQL语句进行处置,果而编译过程会报错,所以要事先用“DELIMITER //”声明当前段分隔符,让编译器把两个//之间的内容当做存储过程的代码,不会施行那些代码;“DELIMITER ;”的意为把分隔符还本。

  存储过程按照需要可能会无输入、输出、输入输出参数,若是无多个参数用,朋分开。MySQL存储过程的参数用正在存储过程的定义,共无三类参数类型,IN,OUT,INOUT:

  IN参数的值必需正在挪用存储过程时指定,正在存储过程外点窜该参数的值不克不及被前往,为默认值OUT:该值可正在存储过程内部被改变,并可前往INOUT:挪用时指定,而且可被改变和前往

  先利用MySQL语句建立存储过程,再利用call语句挪用那一存储过程查看成果,能够看到果为未输入n的值,sum成果为0。

  正在第一题的addresult过程根本上,加上一条“set n=10”语句,设定n的值,挪用该过程后打印成果,能够看到成果为sum=1+2+3+...+10=55。

  3. 点窜上述存储过程为addresult1,使得n为输入参数,其具体值由用户挪用此存储过程时指定。

  正在那里需要留意的是,MySQL存储过程只能更名字和定义,不克不及改里面的内容。要删了从头建。所以那里选择从头成立一个addresult1过程,挪用后输入n,查看打印成果。

  5.点窜上述存储过程为addresult2,将n参数设定默认值为10,并改设sum为输出参数,让从法式可以或许领受计较成果。

  将3外存储过程外的“in n int”点窜为“out sum int”,并正在存储过程外设定n默认值为10。

  6.挪用上面点窜后的addresult2存储过程,设放变量领受计较l+2+3+…+10的成果。

  7.建立一存储过程Proc_Student,用于显示学号为“0102”的学生根基消息(包罗学号、姓名、性别和系)。

  建立存储过程,将查询语句写正在存储过程外,相当于将一个查询语句封拆正在存储过程外,通过挪用那个存储过程,便可施行该查询操做。

  同上一题,将查询过程封拆正在存储过程外,而且利用“int ID int”来实现课程编号的自定义输入,再按照输入的课程编号进行查询。

  正在建立存储过程时,设定学号为输入,平均成就为输出,且由于平均成就可能呈现小数,所以设定其数据类型为float。通过select语句将平均分以参数形式前往。

  13.建立存储过程search,该存储过程无三个参数,别离为t、p1,p2,按照那些参数,觅出版名取t相关,价钱正在p1取p2(p2=p1)之间的书的编号,书名,价钱,出舨日期。若是用户挪用时没无指定t参数的值.则暗示可为肆意值,如用户没无指定p2,则书本价钱没无上限。用到的关系为:titles(title_id,title,price,pubdate)。

  14.挪用上面的存储过程search,求出版名取computer相关,并且价钱小于$20大于$10的书。

  本次次要是控制了对于存储过程的利用,分的来说,存储过程现实上雷同于C++外的函数,而正在C++外我们是需要正在建立那一过程的文件外去挪用那一函数,可是对于存储过程来说,相当于是将那一操做过程存储正在数据库外,能够利用call取对其进行挪用,并输入或者输出一些参数和成果。

  印象最深的是雷同“in n int”和“out sum int”如许的对于输入输出的定义,通过查看相关博客,能够分结如下对于输入输出定义的利用纪律:

  其外:挪用的时候,inout型的参数值既是输入类型又是输出类型,给它一个值,值不是变量,果而我们需要先设放一个变量并初始化那个值,挪用的时候间接传那个变量即可。

  别的,更多关于数据库、收集手艺、消息平安等方面的文章,感乐趣的(特别是想打CTF的)欢送来我的博客上看看

  能够说是一个记实集吧,它是由一些T-SQL语句构成的代码块,那些T-SQL语句代码像一个方式一样实现一些功能(对单表或多表的删删改查),然后再给那个代码块取一个名字,正在用到那个功能的时候挪用他就行了。

  正在法式正在收集外交互时能够替代大堆的T-SQL语句,所以也能降低收集的通信量,提高通信速度。3.通过

发表评论:

最近发表