存储进程是一组为了完结特定功用的SQL句子集合。运用存储进程的目的是将常用或杂乱的作业预先用SQL句子写好并用一个指定名称存储起来,这个进程经编译和优化后存储在数据库服务器中,因而称为存储进程。当今后需求数据库供给与已定义好的存储进程的功用相同的服务时,只需调用“CALL存储进程名字”即可主动完结。
常用操作数据库的SQL句子在履行的时候需求先编译,然后履行。存储进程则选用另一种方式来履行SQL句子。
一个存储进程是一个可编程的函数,它在数据库中创建并保存,一般由SQL句子和一些特别的控制结构组成。当期望在不同的应用程序或平台上履行相同的特定功用时,存储进程尤为适宜。
MySQL5.0版本曾经并不支撑存储进程,这使MySQL在应用上大打折扣。MySQL从5.0版本开始支撑存储进程,既提高了数据库的处理速度,同时也提高了数据库编程的灵活性
存储进程是数据库中的一个重要功用,存储进程能够用来转化数据、数据搬迁、制造报表,它类似于编程语言,一次履行成功,就能够随时被调用,完结指定的功用操作。
运用存储进程不只能够提高数据库的拜访效率,同时也能够提高数据库运用的安全性。
相对于直接运用SQL句子,在应用程序中直接调用存储进程有以下好处:
(1)减少网络通信量。
调用一个行数不多的存储进程与直接调用SQL句子的网络通信量可能不会有很大的差别,可是假如存储进程包括上百行SQL句子,那么其性能绝比照一条一条的调用SQL句子要高得多。
(2)履行速度更快。
有两个原因:首先,在存储进程创建的时候,数据库现已对其进行了一次解析和优化。其次,存储进程一旦履行,在内存中就会保留一份这个存储进程,这样下次再履行同样的存储进程时,能够从内存中直接调用。
(3)更强的适应性。
由于存储进程对数据库的拜访是经过存储进程来进行的,因而数据库开发人员能够在不改动存储进程接口的情况下对数据库进行任何改动,而这些改动不会对应用程序造成影响。
(4)分布式作业。
应用程序和数据库的编码作业能够分别独立进行,而不会彼此限制。

mysql

mysql存储过程写法详解

MySQL中,创立存储进程的根本办法如下:
CREATEPROCEDUREsp_name([proc_parameter[,…]])[characteristic…]routine_body
其间,sp_name参数是存储进程的称号;proc_parameter表明存储进程的参数列表;characteristic参数指定存储进程的特性;routine_body参数是SQL代码的内容,可以用BEGIN…END来标志SQL代码的开端和完毕。
proc_parameter中的每个参数由3部分组成。这3部分分别是输入输出类型、参数称号和参数类型。其办法如下:
[IN|OUT|INOUT]param_nametype
其间,IN表明输入参数;OUT表明输出参数;INOUT表明既可所以输入,也可所以输出;param_name参数是存储进程的参数称号;type参数指定存储进程的参数类型,该类型可所以MySQL数据库的任意数据类型。
characteristic参数有多个取值。其取值阐明如下:
LANGUAGESQL:阐明routine_body部分是由SQL言语的句子组成,这也是数据库体系默许的言语。
[NOT]DETERMINISTIC:指明存储进程的履行成果是否是确认的。DETERMINISTIC表明成果是确认的。每次履行存储进程时,相同的输入会得到相同的输出。NOTDETERMINISTIC表明成果对错确认的,相同的输入可能得到不同的输出。默许情况下,成果对错确认的。
{CONTAINSSQL|NOSQL|READSSQLDATA|MODIFIESSQLDATA}:指明子程序运用SQL句子的约束。CONTAINSSQL表明子程序包括SQL句子,但不包括读或写数据的句子;NOSQL表明子程序中不包括SQL句子;READSSQLDATA表明子程序中包括读数据的句子;MODIFIESSQLDATA表明子程序中包括写数据的句子。默许情况下,体系会指定为CONTAINSSQL。
SQLSECURITY{DEFINER|INVOKER}:指明谁有权限来履行。DEFINER表明只要界说者自己才可以履行;INVOKER表明调用者可以履行。默许情况下,体系指定的权限是DEFINER。
COMMENT’string’:注释信息。
技巧:创立存储进程时,体系默许指定CONTAINSSQL,表明存储进程中运用了SQL句子。可是,假如存储进程中没有运用SQL句子,最好设置为NOSQL。而且,存储进程中最好在COMMENT部分对存储进程进行简略的注释,以便今后在阅读存储进程的代码时更加方便。
【示例1】下面创立一个名为num_from_employee的存储进程。代码如下:
CREATEPROCEDUREnum_from_employee(INemp_idINT,OUTcount_numINT)
READSSQLDATA
BEGIN
SELECTCOUNT(*)INTOcount_num
FROMemployee
WHEREd_id=emp_id;
END
上述代码中,存储进程称号为num_from_employee;输入变量为emp_id;输出变量为count_num。SELECT句子从employee表查询d_id值等于emp_id的记载,并用COUNT(*)计算d_id值相同的记载的条数,最终将计算成果存入count_num中。代码的履行成果如下:
mysql>DELIMITER&&
mysql>CREATEPROCEDUREnum_from_employee
(INemp_idINT,OUTcount_numINT)
->READSSQLDATA
->BEGIN
->SELECTCOUNT(*)INTOcount_num
->FROMemployee
->WHEREd_id=emp_id;
->END&&
QueryOK,0rowsaffected(0.09sec)
mysql>DELIMITER;
代码履行完毕后,没有报出任何犯错信息就表明存储函数现已创立成功。今后就可以调用这个存储进程,数据库中会履行存储进程中的SQL句子。
阐明:MySQL中默许的句子完毕符为分号(;)。存储进程中的SQL句子需求分号来完毕。为了防止抵触,首先用”DELIMITER&&”将MySQL的完毕符设置为&&。最终再用”DELIMITER;”来将完毕符恢复成分号。这与创立触发器时是相同的。
函数
在MySQL中,创立存储函数的根本办法如下:
CREATEFUNCTIONsp_name([func_parameter[,…]])RETURNStype[characteristic…]routine_body
其间,sp_name参数是存储函数的称号;func_parameter表明存储函数的参数列表;RETURNStype指定回来值的类型;characteristic参数指定存储函数的特性,该参数的取值与存储进程中的取值是相同的,请读者参照14.1.1末节的内容;routine_body参数是SQL代码的内容,可以用BEGIN…END来标志SQL代码的开端和完毕。
func_parameter可以由多个参数组成,其间每个参数由参数称号和参数类型组成,其办法如下:param_nametype
其间,param_name参数是存储函数的参数称号;type参数指定存储函数的参数类型,该类型可所以MySQL数据库的任意数据类型。
【示例2】下面创立一个名为name_from_employee的存储函数。代码如下:
CREATEFUNCTIONname_from_employee(emp_idINT)
RETURNSVARCHAR(20)
BEGIN
RETURN(SELECTname
FROMemployee
WHEREnum=emp_id);
END
上述代码中,存储函数的称号为name_from_employee;该函数的参数为emp_id;回来值是VARCHAR类型。SELECT句子从employee表查询num值等于emp_id的记载,并将该记载的name字段的值回来。代码的履行成果如下:
mysql>DELIMITER&&
mysql>CREATEFUNCTIONname_from_employee(emp_idINT)
->RETURNSVARCHAR(20)
->BEGIN
->RETURN(SELECTname
->FROMemployee
->WHEREnum=emp_id);
->END&&
QueryOK,0rowsaffected(0.00sec)
mysql>DELIMITER;
成果显现,存储函数现已创立成功。该函数的运用和MySQL内部函数的运用办法相同。
变量的运用
在存储进程和函数中,可以界说和运用变量。用户可以运用DECLARE关键字来界说变量。然后可以为变量赋值。这些变量的作用规模是BEGIN…END程序段中。本末节将解说怎么界说变量和为变量赋值。
1.界说变量
MySQL中可以运用DECLARE关键字来界说变量。界说变量的根本语法如下:
DECLAREvar_name[,…]type[DEFAULTvalue]
其间,DECLARE关键字是用来声明变量的;var_name参数是变量的称号,这儿可以一起界说多个变量;type参数用来指定变量的类型;DEFAULTvalue子句将变量默许值设置为value,没有运用DEFAULT子句时,默许值为NULL。
【示例3】下面界说变量my_sql,数据类型为INT型,默许值为10。代码如下:
DECLAREmy_sqlINTDEFAULT10;
2.为变量赋值
MySQL中可以运用SET关键字来为变量赋值。SET句子的根本语法如下:
SETvar_name=expr[,var_name=expr]…
其间,SET关键字是用来为变量赋值的;var_name参数是变量的称号;expr参数是赋值表达式。一个SET句子可以一起为多个变量赋值,各个变量的赋值句子之间用逗号离隔。
【示例4】下面为变量my_sql赋值为30。代码如下:
SETmy_sql=30;
MySQL中还可以运用SELECT…INTO句子为变量赋值。其根本语法如下:
SELECTcol_name[,…]INTOvar_name[,…]FROMtable_nameWEHREcondition
其间,col_name参数表明查询的字段称号;var_name参数是变量的称号;table_name参数指表的称号;condition参数指查询条件。
【示例5】下面从employee表中查询id为2的记载,将该记载的d_id值赋给变量my_sql。代码如下:
SELECTd_idINTOmy_sqlFROMemployeeWEHREid=2;
界说条件和处理程序
界说条件和处理程序是事前界说程序履行进程中可能遇到的问题。而且可以在处理程序中界说解决这些问题的办法。这种办法可以提前预测可能呈现的问题,并提出解决办法。这样可以增强程序处理问题的才能,防止程序反常中止。MySQL中都是经过DECLARE关键字来界说条件和处理程序。本末节中将详细解说怎么界说条件和处理程序。
1.界说条件
MySQL中可以运用DECLARE关键字来界说条件。其根本语法如下:
DECLAREcondition_nameCONDITIONFORcondition_value
condition_value:
SQLSTATE[VALUE]sqlstate_value|mysql_error_code
其间,condition_name参数表明条件的称号;condition_value参数表明条件的类型;sqlstate_value参数和mysql_error_code参数都可以表明MySQL的过错。例如ERROR1146(42S02)中,sqlstate_value值是42S02,mysql_error_code值是1146。
【示例6】下面界说”ERROR1146(42S02)”这个过错,称号为can_not_find。可以用两种不同的办法来界说,代码如下:
//办法一:运用sqlstate_value
DECLAREcan_not_findCONDITIONFORSQLSTATE’42S02′;
//办法二:运用mysql_error_code
DECLAREcan_not_findCONDITIONFOR1146;
2.界说处理程序
MySQL中可以运用DECLARE关键字来界说处理程序。其根本语法如下:
DECLAREhandler_typeHANDLERFOR
condition_value[,…]sp_statement
handler_type:
CONTINUE|EXIT|UNDO
condition_value:
SQLSTATE[VALUE]sqlstate_value|
condition_name|SQLWARNING
|NOTFOUND|SQLEXCEPTION|mysql_error_code
其间,handler_type参数指明过错的处理办法,该参数有3个取值。这3个取值分别是CONTINUE、EXIT和UNDO。CONTINUE表明遇到过错不进行处理,继续向下履行;EXIT表明遇到过错后马上退出;UNDO表明遇到过错后撤回之前的操作,MySQL中暂时还不支撑这种处理办法。
注意:通常情况下,履行进程中遇到过错应该马上中止履行下面的句子,而且撤回前面的操作。可是,MySQL中现在还不能支撑UNDO操作。因此,遇到过错时最好履行EXIT操作。假如事前可以预测过错类型,而且进行相应的处理,那么可以履行CONTINUE操作。
condition_value参数指明过错类型,该参数有6个取值。sqlstate_value和mysql_error_code与条件界说中的是同一个意思。condition_name是DECLARE界说的条件称号。SQLWARNING表明一切以01最初的sqlstate_value值。NOTFOUND表明一切以02最初的sqlstate_value值。SQLEXCEPTION表明一切没有被SQLWARNING或NOTFOUND捕获的sqlstate_value值。sp_statement表明一些存储进程或函数的履行句子。
【示例7】下面是界说处理程序的几种办法。代码如下:
//办法一:捕获sqlstate_value
DECLARECONTINUEHANDLERFORSQLSTATE’42S02′
SET@info=’CANNOTFIND’;
//办法二:捕获mysql_error_code
DECLARECONTINUEHANDLERFOR1146SET@info=’CANNOTFIND’;
//办法三:先界说条件,然后调用
DECLAREcan_not_findCONDITIONFOR1146;
DECLARECONTINUEHANDLERFORcan_not_findSET
@info=’CANNOTFIND’;
//办法四:运用SQLWARNING
DECLAREEXITHANDLERFORSQLWARNINGSET@info=’ERROR’;
//办法五:运用NOTFOUND
DECLAREEXITHANDLERFORNOTFOUNDSET@info=’CANNOTFIND’;
//办法六:运用SQLEXCEPTION
上述代码是6种界说处理程序的办法。
榜首种办法是捕获sqlstate_value值。假如遇到sqlstate_value值为42S02,履行CONTINUE操作,而且输出”CANNOTFIND”信息。
第二种办法是捕获mysql_error_code值。假如遇到mysql_error_code值为1146,履行CONTINUE操作,而且输出”CANNOTFIND”信息。
第三种办法是先界说条件,然后再调用条件。这儿先界说can_not_find条件,遇到1146过错就履行CONTINUE操作。
第四种办法是运用SQLWARNING。SQLWARNING捕获一切以01最初的sqlstate_value值,然后履行EXIT操作,而且输出”ERROR”信息。
第五种办法是运用NOTFOUND。NOTFOUND捕获一切以02最初的sqlstate_value值,然后履行EXIT操作,而且输出”CANNOTFIND”信息。
第六种办法是运用SQLEXCEPTION。SQLEXCEPTION捕获一切没有被SQLWARNING或NOTFOUND捕获的sqlstate_value值,然后履行EXIT操作,而且输出”ERROR”信息。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。