当前位置: 首页 > 科技观察

MySQL存储过程详解一目了然

时间:2023-03-18 18:54:17 科技观察

图片来自宝途网1.存储过程简介我们常用的操作数据库语言SQL语句在执行时需要先编译后执行,而存储过程(StoredProcedure)是一组完成特定功能的SQL语句集被编译存储在数据库中,用户通过指定存储过程的名称并给出参数(如果存储过程有参数)来调用并执行存储过程。存储过程是在数据库中创建和保存的可编程函数。它可以由SQL语句和一些特殊的控制结构组成。当您要在不同的应用程序或平台上执行相同的功能,或者要封装特定的功能时,存储过程很有用。数据库中的存储过程可以看作是编程中面向对象方法的模拟。它允许控制数据的访问方式。存储过程通常具有以下优点:(1).存储过程增强了SQL语言的功能和灵活性。存储过程可以用流程控制语句编写,灵活性强,可以完成复杂的判断和复杂的操作。(2).存储过程允许对标准组件进行编程。存储过程创建后,可以在程序中多次调用,无需重写存储过程的SQL语句。而且,数据库专业人员可以随时修改存储过程,而不会影响应用程序的源代码。(3).存储过程可以获得更快的执行速度。如果一个操作包含大量Transaction-SQL代码或者执行多次,存储过程的执行速度要比批处理快很多。因为存储过程是预编译的。当一个存储过程第一次被查询时,优化器会对其进行分析和优化,给出一个执行计划,最终存储在系统表中。批处理的Transaction-SQL语句每次运行都需要编译优化,速度相对较慢。(4).存储过程可以减少网络流量。对于同一个数据库对象的操作(如查询、修改),如果把这个操作涉及的Transaction-SQL语句组织成一个存储过程,那么在客户端计算机上调用这个存储过程时,只传递调用在网络中。语句,从而大大增加网络流量,降低网络负载。(5).存储过程可以作为一种安全机制得到充分利用。系统管理员可以通过限制某个存储过程的执行权限来限制对相应数据的访问权限,避免未经授权的用户访问数据,保证数据的安全。2、关于MySQL的存储过程存储过程是数据库存储的一个重要功能,但是MySQL在5.0之前不支持存储过程,这大大降低了MySQL的应用。好在MySQL5.0终于开始支持存储过程,可以大大提高数据库的处理速度,同时提高数据库编程的灵活性。3.创建一个MySQL存储过程(1)。格式创建MySQL存储过程的格式:CREATEPROCEDURE过程名([过程参数[,...]])[特征...]过程体下面是一个例子mysql>DELIMITER//mysql>CREATEPROCEDUREproc1(OUTsint)->BEGIN->SELECTCOUNT(*)INTOsFROMuser;->END->//mysql>DELIMITER;在这里,需要注意的是DELIMITER//和DELIMITER;两句话,DELIMITER是分隔符的意思,因为MySQL使用了“;”默认作为分隔符,如果我们不声明分隔符,那么编译器会将存储过程当做SQL语句来处理,存储过程的编译过程会报错,所以必须在声明中用DELIMITER关键字声明advance当前段分隔符,这样MySQL就会把“;”作为存储过程中的代码,不会执行这些代码,用完后恢复分隔符。存储过程可以根据需要具有输入、输出和输入/输出参数。这里有一个类型为int的输出参数s。如果有多个参数,用“,”隔开。流程体的开始和结束用BEGIN和END标记。这样,我们的一个MySQL存储过程就完成了。这不是很容易吗?看不懂也没关系。接下来,我们将对其进行详细说明。(2).声明分隔符其实上面的注释已经把声明分隔符写的很清楚了,就不用多说了,但是要注意一点:如果使用MySQLAdministrator管理工具,直接创建就可以了.不再需要声明。(3).参数MySQL存储过程的参数用于存储过程的定义。参数类型有IN,OUT,INOUT三种,如:CREATEPROCEDURE([[IN|OUT|INOUT]参数名数据类型....])IN输入参数:表示在创建时必须指定该参数的值调用存储过程,不能返回存储过程中修改的参数的值,为默认值调用,可更改和返回Ⅰ.IN参数示例创建:mysql>DELIMITER//mysql>CREATEPROCEDUREdemo_in_parameter(INp_inint)->BEGIN->SELECTp_in;->SETp_in=2;->SELECTp_in;->END;->//mysql>DELIMITER;执行结果:mysql>SET@p_in=1;mysql>CALLdemo_in_parameter(@p_in);+------+|p_in|+------+|1|+------++------+|p_in|+------+|2|+------+mysql>SELECT@p_in;+------+|@p_in|+------+|1|+------+从上面可以看出,虽然p_in在存储过程中被修改了,不影响@p_idⅡ的值。OUT参数创建示例:mysql>DELIMITER//mysql>CREATEPROCEDUREdemo_out_parameter(OUTp_outint)->BEGIN->SELECTp_out;->SETp_out=2;->SELECTp_out;->END;->//mysql>DELIMITER;执行结果:mysql>SET@p_out=1;mysql>CALLsp_demo_out_parameter(@p_out);+------+|p_out|+------+|NULL|+--------++-------+|p_out|+------+|2|+------+mysql>SELECT@p_out;+-------+|p_out|+------+|2|+------+Ⅲ。INOUT参数示例创建:mysql>DELIMITER//mysql>CREATEPROCEDUREdemo_inout_parameter(INOUTp_inoutint)->BEGIN->SELECTp_inout;->SETp_inout=2;->SELECTp_inout;->END;->//mysql>DELIMITER;执行结果:mysql>SET@p_inout=1;mysql>CALLdemo_inout_parameter(@p_inout);+--------+|p_inout|+--------+|1|+--------++--------+|p_inout|+--------+|2|+--------+mysql>SELECT@p_inout;+--------+|@p_inout|+--------+|2|+--------+(4)。变量Ⅰ。变量定义DECLAREvariable_name[,variable_name...]datatype[DEFAULTvalue];其中datatype为MySQL的数据类型,如:int,float,date,varchar(length)例如:DECLAREl_intintunsigneddefault4000000;声明l_numericnumber(8,2)默认值9.95;DECLAREl_datedateDEFAULT'1999-12-31';声明l_datetimedatetimeDEFAULT'1999-12-3123:59:59';DECLAREl_varcharvarchar(255)DEFAULT'这不会被填充';Ⅱ。变量赋值SETvariablename=expressionvalue[,variable_name=expression...]Ⅲ。用户变量Ⅰ。在MySQL客户端中使用用户变量mysql>SELECT'HelloWorld'into@x;mysql>SELECT@x;+------------+|@x|+------------+|HelloWorld|+------------+mysql>SET@y='GoodbyeCruelWorld';mysql>SELECT@y;+----------------------+|@y|+--------------------+|再见残酷世界|+---------------------+mysql>SET@z=1+2+3;mysql>SELECT@z;+------+|@z|+------+|6|+-----+Ⅱ。在存储过程中使用用户变量--------------+|CONCAT(@greeting,'World')|+------------------------+|HelloWorld|+--------------------------+ⅲ。在存储过程之间传递全局范围的用户变量-------------------------------------------------+|CONCAT('最后一个程序是',@last_proc|+--------------------------------------------+|Lastprocedurewasp1|+----------------------------------------------+