ImageVerifierCode 换一换
格式:DOCX , 页数:35 ,大小:30.67KB ,
资源ID:10606004      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10606004.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(MySQL入门很简单 第14章存储结构.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

MySQL入门很简单 第14章存储结构.docx

1、MySQL入门很简单 第14章存储结构第14章 存储过程和函数存储过程和函数是在数据库中定义一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句。存储过程和函数可以避免开发人员重复的编写相同的SQL语句。而且,存储过程和函数是在MySQL服务器中存储和执行的,可以减少客户端和服务器端的数据传输。本章将讲解的内容包括:创建存储过程;创建存储函数;变量的使用;定义条件和处理程序;光标的使用;流程控制的使用;调用存储过程和函数;查看存储过程和函数;修改存储过程和函数;删除存储过程和函数。通过本章的学习,读者可以了解存储过程和函数的含义、作用。还可以了解创建、使用、查看、修

2、改及删除存储过程及函数的方法。存储过程和函数是MySQL数据库中比较难的知识点,但其作用非常大,希望读者能够认真学习。14.1 创建存储过程和函数创建存储过程和函数是指将经常使用的一组SQL语句的组合在一起,并将这些SQL语句当作一个整体存储在MySQL服务器中。例如,银行经常需要计算用户的利息。不同类别的用户的利率是不一样的。这就可以将计算利率的SQL代码写成一个存储过程或者存储函数。只要调用这个存储过程或者存储函数,就可以将不同类别用户的利息计算出来。本节将向读者介绍创建存储过程和函数的方法,并且将讲解如何定义变量、如何定义条件和处理、如何使用光标和如何使用流程控制。14.1.1 创建存储

3、过程MySQL中,创建存储过程的基本形式如下:1 CREATE PROCEDURE sp_name (proc_parameter,.) 2 characteristic . routine_body 其中,sp_name参数是存储过程的名称;proc_parameter表示存储过程的参数列表; characteristic参数指定存储过程的特性;routine_body参数是SQL代码的内容,可以用BEGINEND来标志SQL代码的开始和结束。proc_parameter中的每个参数由3部分组成。这3部分分别是输入输出类型、参数名称和参数类型。其形式如下:3 IN | OUT | INOUT

4、 param_name type 其中,IN表示输入参数;OUT表示输出参数; INOUT表示既可以是输入,也可以是输出; param_name参数是存储过程的参数名称;type参数指定存储过程的参数类型,该类型可以是MySQL数据库的任意数据类型。characteristic参数有多个取值。其取值说明如下:LANGUAGE SQL:说明routine_body部分是由SQL语言的语句组成,这也是数据库系统默认的语言。NOT DETERMINISTIC:指明存储过程的执行结果是否是确定的。DETERMINISTIC表示结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出。NOT DET

5、ERMINISTIC表示结果是非确定的,相同的输入可能得到不同的输出。默认情况下,结果是非确定的。 CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA :指明子程序使用SQL语句的限制。CONTAINS SQL表示子程序包含SQL语句,但不包含读或写数据的语句;NO SQL表示子程序中不包含SQL语句;READS SQL DATA表示子程序中包含读数据的语句;MODIFIES SQL DATA表示子程序中包含写数据的语句。默认情况下,系统会指定为CONTAINS SQL。SQL SECURITY DEFINER | INVOKE

6、R :指明谁有权限来执行。DEFINER表示只有定义者自己才能够执行;INVOKER表示调用者可以执行。默认情况下,系统指定的权限是DEFINER。COMMENT string:注释信息。技巧:创建存储过程时,系统默认指定CONTAINS SQL,表示存储过程中使用了SQL语句。但是,如果存储过程中没有使用SQL语句,最好设置为NO SQL。而且,存储过程中最好在COMMENT部分对存储过程进行简单的注释,以便以后在阅读存储过程的代码时更加方便。【示例14-1】 下面创建一个名为num_from_employee的存储过程。代码如下:4 CREATE PROCEDURE num_from_em

7、ployee (IN emp_id INT, OUT count_num INT ) 5 READS SQL DATA 6 BEGIN 7 SELECT COUNT(*) INTO count_num 8 FROM employee 9 WHERE d_id=emp_id ; 10 END 上述代码中,存储过程名称为num_from_employee;输入变量为emp_id;输出变量为count_num。SELECT语句从employee表查询d_id值等于emp_id的记录,并用COUNT(*)计算d_id值相同的记录的条数,最后将计算结果存入count_num中。代码的执行结果如下:11

8、mysql DELIMITER & 12 mysql CREATE PROCEDURE num_from_employee(IN emp_id INT, OUT count_num INT ) 13 - READS SQL DATA 14 - BEGIN 15 - SELECT COUNT(*) INTO count_num 16 - FROM employee 17 - WHERE d_id=emp_id ; 18 - END & 19 Query OK, 0 rows affected (0.09 sec) 20 mysql DELIMITER ; 代码执行完毕后,没有报出任何出错信息就表

9、示存储函数已经创建成功。以后就可以调用这个存储过程,数据库中会执行存储过程中的SQL语句。说明:MySQL中默认的语句结束符为分号(;)。存储过程中的SQL语句需要分号来 结束。为了避免冲突,首先用DELIMITER &将MySQL的结束符设置为&。最后再用DELIMITER ;来将结束符恢复成分号。这与创建触发器时是一样的。14.1.2 创建存储函数在MySQL中,创建存储函数的基本形式如下:1 CREATE FUNCTION sp_name (func_parameter,.) 2 RETURNS type 3 characteristic . routine_body 其中,sp_nam

10、e参数是存储函数的名称;func_parameter表示存储函数的参数列表;RETURNS type指定返回值的类型;characteristic参数指定存储函数的特性,该参数的取值与存储过程中的取值是一样的,请读者参照14.1.1小节的内容;routine_body参数是SQL代码的内容,可以用BEGINEND来标志SQL代码的开始和结束。func_parameter可以由多个参数组成,其中每个参数由参数名称和参数类型组成,其形式如下:4 param_name type 其中,param_name参数是存储函数的参数名称;type参数指定存储函数的参数类型,该类型可以是MySQL数据库的任意

11、数据类型。【示例14-2】 下面创建一个名为name_from_employee的存储函数。代码如下:5 CREATE FUNCTION name_from_employee (emp_id INT ) 6 RETURNS VARCHAR(20) 7 BEGIN 8 RETURN (SELECT name 9 FROM employee 10 WHERE num=emp_id ); 11 END 上述代码中,存储函数的名称为name_from_employee;该函数的参数为emp_id;返回值是VARCHAR类型。SELECT语句从employee表查询num值等于emp_id的记录,并将该

12、记录的name字段的值返回。代码的执行结果如下:12 mysql DELIMITER & 13 mysql CREATE FUNCTION name_from_employee (emp_id INT ) 14 - RETURNS VARCHAR(20) 15 - BEGIN 16 - RETURN (SELECT name 17 - FROM employee 18 - WHERE num=emp_id ); 19 - END& 20 Query OK, 0 rows affected (0.00 sec) 21 mysql DELIMITER ; 结果显示,存储函数已经创建成功。该函数的使

13、用和MySQL内部函数的使用方法一样。14.1.3 变量的使用在存储过程和函数中,可以定义和使用变量。用户可以使用DECLARE关键字来定义变量。然后可以为变量赋值。这些变量的作用范围是BEGINEND程序段中。本小节将讲解如何定义变量和为变量赋值。1定义变量MySQL中可以使用DECLARE关键字来定义变量。定义变量的基本语法如下:1 DECLARE var_name,. type DEFAULT value 其中, DECLARE关键字是用来声明变量的;var_name参数是变量的名称,这里可以同时定义多个变量;type参数用来指定变量的类型;DEFAULT value子句将变量默认值设置

14、为value,没有使用DEFAULT子句时,默认值为NULL。【示例14-3】 下面定义变量my_sql,数据类型为INT型,默认值为10。代码如下:2 DECLARE my_sql INT DEFAULT 10 ; 2为变量赋值MySQL中可以使用SET关键字来为变量赋值。SET语句的基本语法如下:3 SET var_name = expr , var_name = expr . 其中,SET关键字是用来为变量赋值的;var_name参数是变量的名称;expr参数是赋值表达式。一个SET语句可以同时为多个变量赋值,各个变量的赋值语句之间用逗号隔开。【示例14-4】 下面为变量my_sql赋值

15、为30。代码如下:4 SET my_sql = 30 ; MySQL中还可以使用SELECTINTO语句为变量赋值。其基本语法如下:5 SELECT col_name, INTO var_name, 6 FROM table_name WEHRE condition 其中,col_name参数表示查询的字段名称;var_name参数是变量的名称;table_name参数指表的名称;condition参数指查询条件。【示例14-5】 下面从employee表中查询id为2的记录,将该记录的d_id值赋给变量my_sql。代码如下:7 SELECT d_id INTO my_sql 8 FROM

16、employee WEHRE id=2 ; 14.1.4 定义条件和处理程序定义条件和处理程序是事先定义程序执行过程中可能遇到的问题。并且可以在处理程序中定义解决这些问题的办法。这种方式可以提前预测可能出现的问题,并提出解决办法。这样可以增强程序处理问题的能力,避免程序异常停止。MySQL中都是通过DECLARE关键字来定义条件和处理程序。本小节中将详细讲解如何定义条件和处理程序。1定义条件MySQL中可以使用DECLARE关键字来定义条件。其基本语法如下:1 DECLARE condition_name CONDITION FOR condition_value 2 condition_va

17、lue: 3 SQLSTATE VALUE sqlstate_value | mysql_error_code 其中,condition_name参数表示条件的名称;condition_value参数表示条件的类型;sqlstate_value参数和mysql_error_code参数都可以表示MySQL的错误。例如ERROR 1146 (42S02)中,sqlstate_value值是42S02,mysql_error_code值是1146。【示例14-6】 下面定义ERROR 1146 (42S02)这个错误,名称为can_not_find。可以用两种不同的方法来定义,代码如下:4 /方法

18、一:使用sqlstate_value 5 DECLARE can_not_find CONDITION FOR SQLSTATE 42S02 ; 6 /方法二:使用mysql_error_code 7 DECLARE can_not_find CONDITION FOR 1146 ; 2定义处理程序MySQL中可以使用DECLARE关键字来定义处理程序。其基本语法如下:8 DECLARE handler_type HANDLER FOR condition_value,. sp_statement 9 handler_type: 10 CONTINUE | EXIT | UNDO 11 con

19、dition_value: 12 SQLSTATE VALUE sqlstate_value |condition_name | SQLWARNING 13 | NOT FOUND | SQLEXCEPTION | mysql_error_code 其中,handler_type参数指明错误的处理方式,该参数有3个取值。这3个取值分别是CONTINUE、EXIT和UNDO。CONTINUE表示遇到错误不进行处理,继续向下执行;EXIT表示遇到错误后马上退出;UNDO表示遇到错误后撤回之前的操作,MySQL中暂时还不支持这种处理方式。注意:通常情况下,执行过程中遇到错误应该立刻停止执行下面的语句

20、,并且撤回前面的操作。但是,MySQL中现在还不能支持UNDO操作。因此,遇到错误时最好执行EXIT操作。如果事先能够预测错误类型,并且进行相应的处理,那么可以执行CONTINUE操作。condition_value参数指明错误类型,该参数有6个取值。sqlstate_value和mysql_error_code与条件定义中的是同一个意思。condition_name是DECLARE定义的条件名称。SQLWARNING表示所有以01开头的sqlstate_value值。NOT FOUND表示所有以02开头的sqlstate_value值。SQLEXCEPTION表示所有没有被SQLWARNIN

21、G或NOT FOUND捕获的sqlstate_value值。sp_statement表示一些存储过程或函数的执行语句。【示例14-7】 下面是定义处理程序的几种方式。代码如下:14 /方法一:捕获sqlstate_value 15 DECLARE CONTINUE HANDLER FOR SQLSTATE 42S02SET info=CAN NOT FIND; 16 /方法二:捕获mysql_error_code 17 DECLARE CONTINUE HANDLER FOR 1146 SET info=CAN NOT FIND; 18 /方法三:先定义条件,然后调用 19 DECLARE c

22、an_not_find CONDITION FOR 1146 ; 20 DECLARE CONTINUE HANDLER FOR can_not_find SET info=CAN NOT FIND; 21 /方法四:使用SQLWARNING 22 DECLARE EXIT HANDLER FOR SQLWARNING SET info=ERROR; 23 /方法五:使用NOT FOUND 24 DECLARE EXIT HANDLER FOR NOT FOUND SET info=CAN NOT FIND; 25 /方法六:使用SQLEXCEPTION 26 DECLARE EXIT HAN

23、DLER FOR SQLEXCEPTION SET info=ERROR; 上述代码是6种定义处理程序的方法。第一种方法是捕获sqlstate_value值。如果遇到sqlstate_value值为42S02,执行CONTINUE操作,并且输出CAN NOT FIND信息。第二种方法是捕获mysql_error_code值。如果遇到mysql_error_code值为1146,执行CONTINUE操作,并且输出CAN NOT FIND信息。第三种方法是先定义条件,然后再调用条件。这里先定义can_not_find条件,遇到1146错误就执行CONTINUE操作。第四种方法是使用SQLWARNI

24、NG。SQLWARNING捕获所有以01开头的sqlstate_value值,然后执行EXIT操作,并且输出ERROR信息。第五种方法是使用NOT FOUND。NOT FOUND捕获所有以02开头的sqlstate_value值,然后执行EXIT操作,并且输出CAN NOT FIND信息。第六种方法是使用SQLEXCEPTION。SQLEXCEPTION捕获所有没有被SQLWARNING或NOT FOUND捕获的sqlstate_value值,然后执行EXIT操作,并且输出ERROR信息。14.1.5 光标的使用查询语句可能查询出多条记录,在存储过程和函数中使用光标来逐条读取查询结果集中的记录

25、。有些书上将光标称为游标。光标的使用包括声明光标、打开光标、使用光标和关闭光标。光标必须声明在处理程序之前,并且声明在变量和条件之后。1声明光标MySQL中使用DECLARE关键字来声明光标。其语法的基本形式如下:1 DECLARE cursor_name CURSOR FOR select_statement ; 其中,cursor_name参数表示光标的名称;select_statement参数表示SELECT语句的内容。【示例14-8】 下面声明一个名为cur_employee的光标。代码如下:DECLARE cur_employee CURSOR FOR SELECT name, ag

26、e FROM employee ;上面的示例中,光标的名称为cur_employee;SELECT语句部分是从employee表中查询出name和age字段的值。2打开光标MySQL中使用OPEN关键字来打开光标。其语法的基本形式如下:2 OPEN cursor_name ; 其中,cursor_name参数表示光标的名称。【示例14-9】 下面打开一个名为cur_employee的光标,代码如下:3 OPEN cur_employee ; 3使用光标MySQL中使用FETCH关键字来使用光标。其语法的基本形式如下:4 FETCH cur_employee INTO var_name,var_

27、name ; 其中,cursor_name参数表示光标的名称;var_name参数表示将光标中的SELECT语句查询出来的信息存入该参数中。var_name必须在声明光标之前就定义好。【示例14-10】 下面使用一个名为cur_employee的光标。将查询出来的数据存入emp_name和emp_age这两个变量中,代码如下:5 FETCH cur_employee INTO emp_name, emp_age ; 上面的示例中,将光标cur_employee中SELECT语句查询出来的信息存入emp_name和emp_age中。emp_name和emp_age必须在前面已经定义。4关闭光标M

28、ySQL中使用CLOSE关键字来关闭光标。其语法的基本形式如下:6 CLOSE cursor_name ; 其中,cursor_name参数表示光标的名称。【示例14-11】 下面关闭一个名为cur_employee的光标。代码如下:7 CLOSE cur_employee ; 上面的示例中,关闭了这个名称为cur_employee的光标。关闭之后就不能使用FETCH来使用光标了。技巧:如果存储过程或函数中执行SELECT语句,并且SELECT语句会查询出多条记录。这种情况最好使用光标来逐条读取记录。光标必须在处理程序之前且在变量和条件之后声明。而且,光标使用完后一定要关闭。14.1.6 流程

29、控制的使用(1)存储过程和函数中可以使用流程控制来控制语句的执行。MySQL中可以使用IF语句、CASE语句、LOOP语句、LEAVE语句、ITERATE语句、REPEAT语句和WHILE语句来进行流程控制。本小节将详细讲解这些流程控制语句。1IF语句IF语句用来进行条件判断。根据是否满足条件,将执行不同的语句。其语法的基本形式如下:1 IF search_condition THEN statement_list 2 ELSEIF search_condition THEN statement_list . 3 ELSE statement_list 4 END IF 其中,search_c

30、ondition参数表示条件判断语句;statement_list参数表示不同条件的执行语句。【示例14-12】 下面是一个IF语句的示例。代码如下:5 IF age20 THEN SET count1=count1+1; 6 ELSEIF age=20 THEN count2=count2+1; 7 ELSE count3=count3+1; 8 END IF; 该示例根据age与20的大小关系来执行不同的SET语句。如果age值大于20,那么将count1的值加1;如果age值等于20,那么将count2的值加1;其他情况将count3的值加1。IF语句都需要使用END IF来结束。2CA

31、SE语句CASE语句也用来进行条件判断,其可以实现比IF语句更复杂的条件判断。CASE语句的基本形式如下:9 CASE case_value 10 WHEN when_value THEN statement_list 11 WHEN when_value THEN statement_list . 12 ELSE statement_list 13 END CASE 其中,case_value参数表示条件判断的变量;when_value参数表示变量的取值; statement_list参数表示不同when_value值的执行语句。CASE语句还有另一种形式。该形式的语法如下:14 CASE 15 WHEN search_condition THEN statement_list 16 WHEN search_condition THEN statement_li

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1