




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第9讲存储过程与存储函数存储过程和函数是在数据库中定义一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句。存储过程和函数可以避免开发人员重复的编写相同的SQL语句。而且,存储过程和函数是在MySQL服务器中存储和执行的,可以减少客户端和服务器端的数据传输。9.1创建存储过程和函数创建存储过程和函数是指将经常使用的一组SQL语句的组合在一起,并将这些SQL语句当作一个整体存储在MySQL服务器中。例如,银行经常需要计算用户的利息。不同类别的用户的利率是不一样的。这就可以将计算利率的SQL代码写成一个存储过程或者存储函数。只要调用这个存储过程或者存储函数,就可以将不同类别用户的利息计算出来。9.1.1
创建存储过程MySQL中,创建存储过程的基本形式如下:CREATEPROCEDUREsp_name([proc_parameter[,...]])[characteristic...]routine_bodySp_name:存储过程的名称,默认在当前数据库中创建。这个名称应当尽量避免与MySQL的内置函数相同的名称Proc_parameter:存储过程的参数列表格式[IN|OUT|INOUT]param_nametypeParam_name为参数名,type为参数的数据类型。多个参数彼此间用逗号分隔。输入参数、输出参数和输入/输出参数,分别用in/out/inout标识。参数的取名不要与数据表的列名相同。Characteristic:存储过程的某些特征设定,分别介绍1COMMENT’string’:用于对存储过程的描述,其中string为描述内容,comment为关键字。2LANGUAGESQL:指明编写这个存储过程的语言为SQL语言。这个选项可以不指定。3DETERMINISTIC:表示存储过程对同样的输入参数产生相同的结果;NOTDETERMINISTIC,则表示会产生不确定的结果(默认)。4containssql|nosql|readssqldata|modifiessqldataContainssql表示存储过程包含读或写数据的语句(默认)Nosql表示不包含sql语句Readssqldata表示存储过程只包含读数据的语句Modifiessqldata表示存储过程只包含写数据的语句5sqlsecurity:这个特征用来指定存储过程使用创建该存储过程的用户(definer)的许可来执行,还是使用调用者(invoker)的许可来执行。默认是definerRoutine_body:存储过程的主体部分,包含了在过程调用的时候必须执行的sql语句。以begin开始,以end结束。如果存储过程体中只有一条sql语句,可以省略begin-end标志。例题在数据库example中创建一个存储过程,用于实现给定表customers中一个id号即可修改表customers中该客户的性别为一个指定的性别。调用存储过程sp_update_sex,将id为2的客户性别修改为男性”M”Callsp_update_sex(2,’M’);课堂练习在数据库example中创建一个存储过程,用于实现给定employee表中给定一个部门号d_id,即可统计出该部门的总人数。9.1.2存储过程体存储过程体中可以使用各种sql语句和过程式语句的组合,来封装数据库应用中复杂的业务逻辑和处理规则,以实现数据库应用的灵活编程。下面主要介绍几个用于构造存储过程体的常用语法元素。1局部变量在存储过程体中可以声明局部变量,用来存储存储过程体中临时结果。DECLAREvar_name[,…]type[DEFAULTvalue]Var_name:指定局部变量的名称Type:用于声明局部变量的数据类型default子句:用于为局部变量指定一个默认值。若没有指定,默认为null.Declarecidint(10);使用说明:局部变量只能在存储过程体的begin…end语句块中声明。局部变量必须在存储过程体的开头处声明。局部变量的作用范围仅限于声明它的begin..end语句块,其他语句块中的语句不可以使用它。局部变量不同于用户变量,两者区别:局部变量声明时,在其前面没有使用@符号,并且它只能在begin..end语句块中使用;而用户变量在声明时,会在其名称前面使用@符号,同时已声明的用户变量存在于整个会话之中。2set语句使用set语句为局部变量赋值Setvar_name=exprSetcid=910;3select…into语句把选定列的值直接存储到局部变量中,语法格式Selectcol_name[,…]intovar_name[,…]table_exprCol_name:用于指定列名Var_name:用于指定要赋值的变量名Table_expr:表示select语句中的from字句及后面的语法部分说明:存储过程体中的select…into语句返回的结果集只能有一行数据。4定义处理程序是事先定义程序执行过程中可能遇到的问题。并且可以在处理程序中定义解决这些问题的办法。这种方式可以提前预测可能出现的问题,并提出解决方法。DECLAREhandler_typeHANDLERFORcondition_value[,…]sp_statementhandler_type:CONTINUE|EXIT|UNDOCondition_value:Sqlwarning|notfound|sqlexception5流程控制语句(1)条件判断语句If语句Ifsearch_conditionthenstatement_list[elseif
search_conditionthenstatement_list]…[elsestatement_list]EndifSearch_condition参数:条件判断语句Statement_list参数:不同条件的执行语句Case语句表达形式1Casecase_valueWhenwhen_valuethenstatement_list[Whenwhen_valuethenstatement_list]…[elsestatement_list]Endcase表达形式2CaseWhensearch_conditionthenstatement_listEndcase(2)循环语句While语句、repeat语句和loop语句。While语句语法格式:[begin_label:]while
search_conditiondoStatement_listEndwhile[end_label]判断条件search_condition是否为真,若为真,则执行statement_list中的语句,然后再进行判断,如若仍然为真则继续循环,直至条件判断不为真时循环结束。Repeat语句语法格式[begin_label:]repeatStatement_listUntilsearch_conditionEndrepeat[end_label]Repeat语句首先执行statement_list中的语句,然后判断条件search_condition是否为真,倘若为真,则结束循环,若不为真,继续循环。Repeat先执行后判断,while先判断后执行。Loop语句语法格式:[begin_label:]loopStatement_listEndloop[end_label]Loop语句允许重复执行某个特定语句或语句块,实现一个简单的循环构造,其中statement_list用于指定需要重复执行的语句。在循环体statement_list中语句会一直重复被执行,直至循环使用leave语句或者iterate退出。Leave语句主要用于跳出循环控制,语法结构Leavelabeladd_num:loopset@count=@count+1;If@count=100thenleaveadd_num;Endloopadd_num;ITERATE语句跳出循环语句,跳出本次循环,然后直接进入下一个循环。语法形式IteratelabelAdd_num:loopSet@count=@count+1;If@count=100thenleaveadd_num;Elseifmod(@count,3)=0theniterateadd_num;Select*fromemployee;Endloopadd_num;5光标(游标)查询语句可能查询出多条记录,在存储过程和函数中使用光标标来逐条读取查询结果集中的记录。光标的使用包括声明光标、打开光标、使用光标和关闭光标。光标必须声明光标、打开光标、使用光标和关闭光标。光标必须声明在处理程序之前,并且声明在变量和条件之后。1声明光标Declarecursor_namecursorforselect_statement;Cursor_name:光标名称Select_statement:select语句的内容Declarecur_employeecursorforselectname,agefromemployee;2打开光标Opencursor_nameOpencur_employee;3使用光标Mysql中使用fetch关键字来使用光标,语法形式Fetchcur_nameintovar_name[,var_name…];Cur_name表示光标的名称Var_name表示将光标中的select语句查询出来的信息存入该参数。Var_name必须在声明光标前就定义好。Fetchcur_employeeintoemp_name,emp_age;4关闭光标Closecursor_name;Closecur_employee;每个光标不再需要时都应该被关闭,使用close语句将会释放光标所使用的全部资源。在一个光标被关闭后,如果没有重新被打开,则不能被使用。对于声明过的光标,则不需要再次声明,可直接使用open语句打开。课堂习题在teacher表上创建名为teacher_info1的存储过程,要求:teacher_info1有3个参数。输入参数为teacher_id和type,输出参数为info。存储过程的作用是根据编号teacher_id来查询teacher表中的记录。如果type的值为1时,将姓名name传给输出参数info;如果type的值为2时,将年龄传给输出参数info;如果type的值为其他值,则返回字符串”Error”。9.2调用存储过程Callsp_name([parameter[,…]]);Sp_name被调用存储过程的名称Parameter:指定调用存储过程所要使用的参数。9.3修改存储过程Alterprocedureproc_name[characteristic…]只能修改存储过程的特征,如果要修改存储过程的内容,可以先删除该存储过程,然后再重新创建9.4删除存储过程Dropprocedure[ifexists]sp_name;存储过程与存储函数联系与区别存储过程与存储函数一样,都是由sql语句和过程式语句所组成的代码片段,并且可以被应用程序和其他sql语句调用。区别:存储函数不能拥有输出参数,因为存储函数自身就是输出参数;而存储过程可以拥有输出参数。可以直接对存储函数进行调用,而不需要使用call语句;而对存储过程的调用,需要使用call语句。存储函数中必须包含一条return语句,而这条特殊的sql语句不允许包含于存储过程中。创建存储函数MySQL中,创建存储函数的基本形式如下:CREATEFUNCTIONsp_name([func_parameter[,...]])RETURNStype
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030年中国十色自动印花机数据监测研究报告
- 金沙酒业面试题及答案
- 2020-2021学年广东省广州市越秀区华侨外国语学校七年级(下)月考数学试卷(含答案)
- 合同税收知识点培训课件
- 会议策划组织与活动实施协议
- 美容行业客户信息管理表
- 企业环境污染事故处理案例分析
- 电力工程安全与法规考试卷
- 农业灌溉用水资源合理利用协议
- 环境保护活动设计与实践案例
- 2024绿化养护作业指导书
- 2024年甘肃省公务员考试《行测》真题及答案解析
- 联通IT专业能力认证初级云计算、中级云计算题库附答案
- 广东离婚协议书范文2024标准版
- 24年追觅在线测评28题及答案
- 六年级语文上册14文言文二则《两小儿辩日》公开课一等奖创新教学设计
- 专题01相交线与平行线(原卷版+解析)
- 工程造价预算书
- 便民驿站运营方案
- 终止授权代理协议书模板
- 2024年保密教育培训知识考试题库(含答案)
评论
0/150
提交评论