版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、MySQL存储过程、函数存储过程存储过程简介SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。存储过程是可编程的函数,在数据库中创建并保存,可以由SQL语句和控制结构组成。当想要在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟,它允许控制数据的访问方式。存储过程的优点:(1).增强SQL语言的功能和灵活性:存储过程可以用控制语句编写,有很强的灵活
2、性,可以完成复杂的判断和较复杂的运算。(2).标准组件式编程:存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。(3).较快的执行速度:如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。(4).减少网络流量:针对同一个数据
3、库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织进存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大减少网络流量并降低了网络负载。(5).作为一种安全机制来充分利用:通过对执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。MySQL的存储过程存储过程是数据库的一个重要的功能,MySQL 5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣。好在MySQL 5.0开始支持存储过程,这样即可以大大提高数据库的处理速度,同时也可以提高数据库编程的灵活
4、性。MySQL存储过程的创建语法CREATE PROCEDURE 过程名(IN|OUT|INOUT 参数名 数据类型,IN|OUT|INOUT 参数名 数据类型) 特性 . 过程体DELIMITER / CREATE PROCEDURE myproc(OUT s int) BEGIN SELECT COUNT(*) INTO s FROM students; END /DELIMITER ;分隔符MySQL默认以""为分隔符,如果没有声明分割符,则编译器会把存储过程当成SQL语句进行处理,因此编译过程会报错,所以要事先用“DELIMITER /”声明当
5、前段分隔符,让编译器把两个"/"之间的内容当做存储过程的代码,不会执行这些代码;“DELIMITER ;”的意为把分隔符还原。参数存储过程根据需要可能会有输入、输出、输入输出参数,如果有多个参数用","分割开。MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT:· IN参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值· OUT:该值可在存储过程内部被改变,并可返回· INOUT:调用时指定,并且可被改变和返回过程体过程体的开始与结束使用BEGIN与END进行
6、标识。IN参数例子DELIMITER / CREATE PROCEDURE in_param(IN p_in int) BEGIN SELECT p_in; SET p_in=2; SELECT p_in; END; /DELIMITER ;#调用SET p_in=1;CALL in_param(p_in);SELECT p_in;执行结果:以上可以看出,p_in虽然在存储过程中被修改,但并不影响p_id的值 OUT参数例子#存储过程OUT参数DELIMITER / CREATE PROCEDURE out_param(OUT p_out int) BEGIN SELECT p_ou
7、t; SET p_out=2; SELECT p_out; END; /DELIMITER ;#调用SET p_out=1;CALL out_param(p_out);SELECT p_out;执行结果: INOUT参数例子#存储过程INOUT参数DELIMITER / CREATE PROCEDURE inout_param(INOUT p_inout int) BEGIN SELECT p_inout; SET p_inout=2; SELECT p_inout; END; /DELIMITER ;#调用SET p_inout=1;CALL inout_param(p_inout
8、) ;SELECT p_inout;执行结果: 变量语法:DECLARE 变量名1,变量名2. 数据类型 默认值;数据类型为MySQL的数据类型:数值类型日期和时间类型字符串类型变量赋值语法:SET 变量名 = 变量值 ,变量名= 变量值 .用户变量用户变量一般以开头注意:滥用用户变量会导致程序难以理解及管理在MySQL客户端使用用户变量SELECT 'Hello World' into x;SELECT x;SET y='Goodbye Cruel World'SELECT y;SET z=1+2+3;SELECT z;执行结果: 在存储过
9、程中使用用户变量CREATE PROCEDURE GreetWorld() SELECT CONCAT(greeting,' World');SET greeting='Hello'CALL GreetWorld();执行结果: 在存储过程间传递全局范围的用户变量CREATE PROCEDURE p1() SET last_proc='p1'CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',last_proc);CALL p1();CALL p2();执行
10、结果: 注释MySQL存储过程可使用两种风格的注释:· 双杠:-,该风格一般用于单行注释· C风格: 一般用于多行注释MySQL存储过程的调用用call和你过程名以及一个括号,括号里面根据需要,加入参数,参数包括输入参数、输出参数、输入输出参数。MySQL存储过程的查询#查询存储过程SELECT name FROM c WHERE db='数据库名'SELECT routine_name FROM information_schema.routines WHERE routine_schema='数据库名'SHOW
11、 PROCEDURE STATUS WHERE db='数据库名'#查看存储过程详细信息SHOW CREATE PROCEDURE 数据库.存储过程名; MySQL存储过程的修改ALTER PROCEDURE 更改用CREATE PROCEDURE 建立的预先指定的存储过程,其不会影响相关存储过程或存储功能。ALTER PROCEDURE | FUNCTION sp_name characteristic .characteristic: CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA | SQL
12、SECURITY DEFINER | INVOKER | COMMENT 'string'· sp_name参数表示存储过程或函数的名称;· characteristic参数指定存储函数的特性。· CONTAINS SQL表示子程序包含SQL语句,但不包含读或写数据的语句;· NO SQL表示子程序中不包含SQL语句;· READS SQL DATA表示子程序中包含读数据的语句;· MODIFIES SQL DATA表示子程序中包含写数据的语句。· SQL SECURITY DEFINER | INVOKER
13、 指明谁有权限来执行,DEFINER表示只有定义者自己才能够执行;INVOKER表示调用者可以执行。· COMMENT 'string'是注释信息。实例:#将读写权限改为MODIFIES SQL DATA,并指明调用者可以执行。ALTER PROCEDURE num_from_employee MODIFIES SQL DATA SQL SECURITY INVOKER ;#将读写权限改为READS SQL DATA,并加上注释信息'FIND NAME'。ALTER PROCEDURE name_from_employee READS SQL DATA
14、 COMMENT 'FIND NAME' ; MySQL存储过程的删除DROP PROCEDURE 过程1,过程2从MySQL的表格中删除一个或多个存储过程。 MySQL存储过程的控制语句变量作用域内部变量在其作用域范围内享有更高的优先权,当执行到end时,内部变量消失,不再可见了,在存储过程外再也找不到这个内部变量,但是可以通过out参数或者将其值指派给会话变量来保存其值。#变量作用域DELIMITER / CREATE PROCEDURE proc() BEGIN DECLARE x1 VARCHAR(5) DEFAULT 'outer'
15、 BEGIN DECLARE x1 VARCHAR(5) DEFAULT 'inner' SELECT x1; END; SELECT x1; END; /DELIMITER ;#调用CALL proc();执行结果: 条件语句IF-THEN-ELSE语句#条件语句IF-THEN-ELSEDROP PROCEDURE IF EXISTS proc3;DELIMITER /CREATE PROCEDURE proc3(IN parameter int) BEGIN DECLARE var int; SET var=parameter+1; IF var=0 THEN I
16、NSERT INTO t VALUES (17); END IF ; IF parameter=0 THEN UPDATE t SET s1=s1+1; ELSE UPDATE t SET s1=s1+2; END IF ; END ; /DELIMITER ;CASE-WHEN-THEN-ELSE语句#CASE-WHEN-THEN-ELSE语句DELIMITER / CREATE PROCEDURE proc4 (IN parameter INT) BEGIN DECLARE var INT; SET var=parameter+1; CASE var WHEN 0 THEN INSERT
17、INTO t VALUES (17); WHEN 1 THEN INSERT INTO t VALUES (18); ELSE INSERT INTO t VALUES (19); END CASE ; END ; /DELIMITER ; 循环语句WHILE-DOEND-WHILEDELIMITER / CREATE PROCEDURE proc5() BEGIN DECLARE var INT; SET var=0; WHILE var<6 DO INSERT INTO t VALUES (var); SET var=var+1; END WHILE ; END; /DEL
18、IMITER ; REPEAT.END REPEAT此语句的特点是执行操作后检查结果DELIMITER / CREATE PROCEDURE proc6 () BEGIN DECLARE v INT; SET v=0; REPEAT INSERT INTO t VALUES(v); SET v=v+1; UNTIL v>=5 END REPEAT; END; /DELIMITER ; LOOP.END LOOPDELIMITER / CREATE PROCEDURE proc7 () BEGIN DECLARE v INT; SET v=0; LOOP_LABLE:L
19、OOP INSERT INTO t VALUES(v); SET v=v+1; IF v >=5 THEN LEAVE LOOP_LABLE; END IF; END LOOP; END; /DELIMITER ; LABLES标号标号可以用在begin repeat while 或者loop 语句前,语句标号只能在合法的语句前面使用。可以跳出循环,使运行指令达到复合语句的最后一步。ITERATE迭代通过引用复合语句的标号,来从新开始复合语句#ITERATEDELIMITER / CREATE PROCEDURE proc8() BEGIN DECLARE v INT; SET
20、 v=0; LOOP_LABLE:LOOP IF v=3 THEN SET v=v+1; ITERATE LOOP_LABLE; END IF; INSERT INTO t VALUES(v); SET v=v+1; IF v>=5 THEN LEAVE LOOP_LABLE; END IF; END LOOP; END; /DELIMITER ;函数自定义函数创建存储函数,需要使用CREATE FUNCTION语句,基本语法如下:CREATE FUNCTION func_name(func_parameter)RETURNS TYPEcharacteristics. routine_b
21、odyCREATE FUNCTION为用来创建存储函数的关键字;func_name表示存储函数的名称func_parameter为存储函数的参数列表,参数列表如下IN|OUT|INOUTPARAM_NAMETYPE其中,IN表示输入参数,OUT表示输出参数,INOUT表示既可以输入也可以输出;param_name表示参数名称;type表示参数类型,该类型可以是MYSQL数据库中的任意类型RETURNS TYPE语句表示函数返回数据的类型;characteristics:指定存储函数的特性,取值与创建存储过程时相同创建存储函数,名称为NameByT,该函数返回SELECT语句的查询结果,数值类型
22、为字符串型DELIMITER /CREATE FUNCTION NameByT()RETURNS CHAR(50)RETURN (SELECT NAME FROM t3 WHERE id=2);/DELIMITER ;注意:RETURNS CHAR(50)数据类型的时候,RETURNS 是有S的,而RETURN (SELECT NAME FROM t3 WHERE id=2)的时候RETURN是没有S的所以有时候大家可能觉得MYSQL很烦,谁不知是自己写错了这里有一个方法,就是利用SQLYOG的代码格式化功能,选中要格式化的代码,然后按F12,如果能格式化,证明你的代码没有问题,如果不能格式化
23、证明你写的代码有问题!不加s的话就会出现语法错误了Query: create function NameByT() return char(50) return (select name from t3 where id=2)Error Code: 1064You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'return char(50)return (select na
24、me from t3 where id=2)' at line 2Execution Time : 0 secTransfer Time : 0 secTotal Time : 0.003 sec-调用函数SELECT nameByT()如果在存储函数中的RETURN语句返回一个类型不同于函数的RETURNS子句中指定类型的值,返回值将被强制转换为恰当的类型。例如,如果一个函数返回一个SET或ENUM值,但是RETURN语句返回一个整数,对于SET成员集的相应ENUM成员,从函数返回的值是字符串。指定参数为IN、OUT、INOUT只对PROCEDURE是合法的。(FUNCTION中总是
25、默认是IN参数)RETURNS子句对FUNCTION做指定,对函数而言这是强制的。他用来指定函数的返回类型,而且函数体必须包含一个RETURN value语句变量的使用变量可以在子程序中声明并使用,这些变量的作用范围是在BEGIN.END程序中1、定义变量在存储过程中定义变量DECLARE var_name,varname.date_typeDEFAULT VALUE;var_name为局部变量的名称。DEFAULT VALUE子句给变量提供一个默认值。值除了可以被声明为一个常数外,还可以被指定为一个表达式。如果没有DEFAULT子句,初始值为NULLDECLARE MYPARAM INT D
26、EFAULT 100; 2、为变量赋值定义变量之后,为变量赋值可以改变变量的默认值,MYSQL中使用SET语句为变量赋值SET var_name=expr,var_name=expr.在存储过程中的SET语句是一般SET语句的扩展版本。被SET的变量可能是子程序内的变量,或者是全局服务器变量,如系统变量或者用户变量他运行SET a=x,b=y,.声明3个变量,分别为var1,var2和var3DECLARE var1,var2,var3 INT;SET var1=10,var2=20;SET var3=var1+var2; MYSQL中还可以通过SELECT.INTO为一个
27、或多个变量赋值DECLARE NAME CHAR(50);DECLARE id DECIMAL(8,2);SELECT id,NAME INTO id ,NAME FROM t3 WHERE id=2;定义条件和处理程序特定条件需要特定处理。这些条件可以联系到错误,以及子程序中的一般流程控制。定义条件是事先定义程序执行过程中遇到的问题,处理程序定义了在遇到这些问题时候应当采取的处理方式,并且保证存储过程或函数在遇到警告或错误时能继续执行。这样可以增强存储程序处理问题的能力,避免程序异常停止运行1、定义条件DECLARE condition_name CONDITION FORcondition
28、_typecondition_type:SQLSTATEVALUE sqlstate_value |mysql_error_codecondition_name:表示条件名称condition_type:表示条件的类型sqlstate_value和mysql_error_code都可以表示mysql错误sqlstate_value为长度5的字符串错误代码mysql_error_code为数值类型错误代码,例如:ERROR1142(42000)中,sqlstate_value的值是42000,mysql_error_code的值是1142 这个语句指定需要特殊处理条件。他将一个名字和指
29、定的错误条件关联起来。这个名字随后被用在定义处理程序的DECLARE HANDLER语句中 定义ERROR1148(42000)错误,名称为command_not_allowed。可以用两种方法定义/方法一:使用sqlstate_valueDECLARE command_not_allowed CONDITION FOR SQLSTATE '42000'/方法二:使用mysql_error_codeDECLARE command_not_allowed CONDITION FOR SQLSTATE 1148 2定义处理程序MySQL中可以使用DECLARE关
30、键字来定义处理程序。其基本语法如下:DECLARE handler_type HANDLER FOR condition_value,. sp_statement handler_type: CONTINUE | EXIT | UNDO condition_value: SQLSTATE VALUE sqlstate_value |condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION | mysql_error_code 其中,handler_type参数指明错误的处理方式,该参数有3个取值。这3个取值分别是CONTINUE、EXIT和U
31、NDO。CONTINUE表示遇到错误不进行处理,继续向下执行;EXIT表示遇到错误后马上退出;UNDO表示遇到错误后撤回之前的操作,MySQL中暂时还不支持这种处理方式。注意:通常情况下,执行过程中遇到错误应该立刻停止执行下面的语句,并且撤回前面的操作。但是,MySQL中现在还不能支持UNDO操作。因此,遇到错误时最好执行EXIT操作。如果事先能够预测错误类型,并且进行相应的处理,那么可以执行CONTINUE操作。condition_value参数指明错误类型,该参数有6个取值。sqlstate_value和mysql_error_code与条件定义中的是同一个意思。condition_nam
32、e是DECLARE定义的条件名称。SQLWARNING表示所有以01开头的sqlstate_value值。NOT FOUND表示所有以02开头的sqlstate_value值。SQLEXCEPTION表示所有没有被SQLWARNING或NOT FOUND捕获的sqlstate_value值。sp_statement表示一些存储过程或函数的执行语句。下面是定义处理程序的几种方式。代码如下:/方法一:捕获sqlstate_value DECLARE CONTINUE HANDLER FOR SQLSTATE '42000'SET info='CAN NOT FIND'
33、; /方法二:捕获mysql_error_code DECLARE CONTINUE HANDLER FOR 1148SET info='CAN NOT FIND' /方法三:先定义条件,然后调用 DECLARE can_not_find CONDITION FOR 1146 ; DECLARE CONTINUE HANDLER FOR can_not_find SET info='CAN NOT FIND' /方法四:使用SQLWARNING DECLARE EXIT HANDLER FOR SQLWARNING SET info='ERROR'
34、; /方法五:使用NOT FOUND DECLARE EXIT HANDLER FOR NOT FOUND SET info='CAN NOT FIND' /方法六:使用SQLEXCEPTION DECLARE EXIT HANDLER FOR SQLEXCEPTION SET info='ERROR'上述代码是6种定义处理程序的方法。第一种方法是捕获sqlstate_value值。如果遇到sqlstate_value值为42000,执行CONTINUE操作,并且输出"CAN NOT FIND"信息。第二种方法是捕获mysql_error_c
35、ode值。如果遇到mysql_error_code值为1148,执行CONTINUE操作,并且输出"CAN NOT FIND"信息。第三种方法是先定义条件,然后再调用条件。这里先定义can_not_find条件,遇到1148错误就执行CONTINUE操作。第四种方法是使用SQLWARNING。SQLWARNING捕获所有以01开头的sqlstate_value值,然后执行EXIT操作,并且输出"ERROR"信息。第五种方法是使用NOT FOUND。NOT FOUND捕获所有以02开头的sqlstate_value值,然后执行EXIT操作,并且输出&quo
36、t;CAN NOT FIND"信息。第六种方法是使用SQLEXCEPTION。SQLEXCEPTION捕获所有没有被SQLWARNING或NOT FOUND捕获的sqlstate_value值,然后执行EXIT操作,并且输出"ERROR"信息 定义条件和处理程序 CREATE TABLE t8(s1 INT,PRIMARY KEY(s1)DELIMITER /CREATE PROCEDURE handlerdemo()BEGINDECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET X
37、2=1;SET X=1;INSERT INTO t8 VALUES(1);SET X=2;INSERT INTO t8 VALUES(1);SET X=3;END;/DELIMITER ;/* 调用存储过程*/CALL handlerdemo();/* 查看调用存储过程结果*/SELECT X X是一个用户变量,执行结果X等于3,这表明MYSQL执行到程序的末尾。如果DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET X2=1;,这一行不存在第二个INSERT因PRIMARY KEY约束而失败之后,MYSQL可能已经采取
38、EXIT策略,并且SELECT X可能已经返回2注意:X表示用户变量,使用SET语句为其赋值,用户变量与连接有关,一个客户端定义的变量不能被其他客户端所使用即有作用域的,该客户端退出时,客户端连接的所有变量将自动释放这里的变量跟SQLSERVER没有什么区别,都是用来存储临时值的MYSQL这里的条件和预定义程序其实跟SQLSERVER的自定义错误是一样的。光标MYSQL里叫光标,SQLSERVER里叫游标,实际上一样的。查询语句可能查询出多条记录,在存储过程和函数中使用光标来逐条读取查询结果集中的记录。光标的使用包括声明光标、打开光标、使用光标和关闭光标。光标必须声明在处理程序之前,
39、并且声明在变量和条件之后。1声明光标MySQL中使用DECLARE关键字来声明光标。其语法的基本形式如下:DECLARE cursor_name CURSOR FOR select_statement ; 其中,cursor_name参数表示光标的名称;select_statement参数表示SELECT语句的内容,返回一个用于创建光标的结果集下面声明一个名为cur_employee的光标。代码如下:DECLARE cur_employee CURSOR FOR SELECT name, age FROM employee ;上面的示例中,光标的名称为cur_employee;SELECT语句
40、部分是从employee表中查询出name和age字段的值。2打开光标MySQL中使用OPEN关键字来打开光标。其语法的基本形式如下:OPEN cursor_name ; 其中,cursor_name参数表示光标的名称。下面打开一个名为cur_employee的光标,代码如下:OPEN cur_employee ; 3使用光标MySQL中使用FETCH关键字来使用光标。其语法的基本形式如下:FETCH cur_employee INTO var_name,var_name ; 其中,cursor_name参数表示光标的名称;var_name参数表示将光标中的SELECT语句查询出来的信息存入该
41、参数中。var_name必须在声明光标之前就定义好。下面使用一个名为cur_employee的光标。将查询出来的数据存入emp_name和emp_age这两个变量中,代码如下:FETCH cur_employee INTO emp_name, emp_age ; 上面的示例中,将光标cur_employee中SELECT语句查询出来的信息存入emp_name和emp_age中。emp_name和emp_age必须在前面已经定义。4关闭光标MySQL中使用CLOSE关键字来关闭光标。其语法的基本形式如下:CLOSE cursor_name ; 其中,cursor_name参数表示光标的名称。【示
42、例14-11】 下面关闭一个名为cur_employee的光标。代码如下:CLOSE cur_employee ; 上面的示例中,关闭了这个名称为cur_employee的光标。关闭之后就不能使用FETCH来使用光标了。注意:MYSQL中,光标只能在存储过程和函数中使用!到目前为止存储函数,存储过程、变量、条件、预定义程序、光标跟SQLSERVER差不多,只不过语法不同,结构不同刚开始的时候会有不适应流程控制的使用存储过程和函数中可以使用流程控制来控制语句的执行。MySQL中可以使用IF语句、CASE语句、LOOP语句、LEAVE语句、ITERATE语句、REPEAT语句和WHILE语句来进行
43、流程控制。每个流程中可能包含一个单独语句,或者是使用BEGIN.END构造的复合语句,构造可以被嵌套1IF语句IF语句用来进行条件判断。根据是否满足条件,将执行不同的语句。其语法的基本形式如下:IF search_condition THEN statement_list ELSEIF search_condition THEN statement_list . ELSE statement_list END IF 其中,search_condition参数表示条件判断语句;statement_list参数表示不同条件的执行语句。注意:MYSQL还有一个IF()函数,他不同于这里描述的IF语句
44、下面是一个IF语句的示例。代码如下:IF age>20 THEN SET count1=count1+1; ELSEIF age=20 THEN SET count2=count2+1; ELSE SET count3=count3+1; END IF; 该示例根据age与20的大小关系来执行不同的SET语句。如果age值大于20,那么将count1的值加1;如果age值等于20,那么将count2的值加1;其他情况将count3的值加1。IF语句都需要使用END IF来结束。2CASE语句CASE语句也用来进行条件判断,其可以实现比IF语句更复杂的条件判断。CASE语句的基本形式如下:
45、CASE case_value WHEN when_value THEN statement_list WHEN when_value THEN statement_list . ELSE statement_list END CASE 其中,case_value参数表示条件判断的变量;when_value参数表示变量的取值;statement_list参数表示不同when_value值的执行语句。CASE语句还有另一种形式。该形式的语法如下:CASE WHEN search_condition THEN statement_list WHEN search_condition THEN st
46、atement_list . ELSE statement_list END CASE 其中,search_condition参数表示条件判断语句;statement_list参数表示不同条件的执行语句。下面是一个CASE语句的示例。代码如下:CASE age WHEN 20 THEN SET count1=count1+1; ELSE SET count2=count2+1; END CASE ; 代码也可以是下面的形式:CASE WHEN age=20 THEN SET count1=count1+1; ELSE SET count2=count2+1; END CASE ; 本示例中,如
47、果age值为20,count1的值加1;否则count2的值加1。CASE语句都要使用END CASE结束。注意:这里的CASE语句和“控制流程函数”里描述的SQL CASE表达式的CASE语句有轻微不同。这里的CASE语句不能有ELSE NULL子句并且用END CASE替代END来终止! 3LOOP语句LOOP语句可以使某些特定的语句重复执行,实现一个简单的循环。但是LOOP语句本身没有停止循环的语句,必须是遇到LEAVE语句等才能停止循环。LOOP语句的语法的基本形式如下:begin_label: LOOP statement_list END LOOP end_label 其
48、中,begin_label参数和end_label参数分别表示循环开始和结束的标志,这两个标志必须相同,而且都可以省略;statement_list参数表示需要循环执行的语句。下面是一个LOOP语句的示例。代码如下:add_num: LOOP SET count=count+1; END LOOP add_num ; 该示例循环执行count加1的操作。因为没有跳出循环的语句,这个循环成了一个死循环。LOOP循环都以END LOOP结束。 4LEAVE语句LEAVE语句主要用于跳出循环控制。其语法形式如下:LEAVE label 其中,label参数表示循环的标志。下面是一个LEAV
49、E语句的示例。代码如下:add_num: LOOP SET count=count+1; IF count=100 THEN LEAVE add_num ; END LOOP add_num ; 该示例循环执行count加1的操作。当count的值等于100时,则LEAVE语句跳出循环。 5ITERATE语句ITERATE语句也是用来跳出循环的语句。但是,ITERATE语句是跳出本次循环,然后直接进入下一次循环。ITERATE语句只可以出现在LOOP、REPEAT、WHILE语句内。ITERATE语句的基本语法形式如下:ITERATE label 其中,label参数表示循环的标志。
50、下面是一个ITERATE语句的示例。代码如下:add_num: LOOP SET count=count+1; IF count=100 THEN LEAVE add_num ; ELSE IF MOD(count,3)=0 THEN ITERATE add_num; SELECT * FROM employee ; END LOOP add_num ; 该示例循环执行count加1的操作,count值为100时结束循环。如果count的值能够整除3,则跳出本次循环,不再执行下面的SELECT语句。说明:LEAVE语句和ITERATE语句都用来跳出循环语句,但两者的功能是不一样的。LEAVE语
51、句是跳出整个循环,然后执行循环后面的程序。而ITERATE语句是跳出本次循环,然后进入下一次循环。使用这两个语句时一定要区分清楚。 6REPEAT语句REPEAT语句是有条件控制的循环语句。当满足特定条件时,就会跳出循环语句。REPEAT语句的基本语法形式如下:begin_label: REPEAT statement_list UNTIL search_condition END REPEAT end_label 其中,statement_list参数表示循环的执行语句;search_condition参数表示结束循环的条件,满足该条件时循环结束。下面是一个REPEAT语句的示例。
52、代码如下:REPEAT SET count=count+1; UNTIL count=100 END REPEAT ; 该示例循环执行count加1的操作,count值为100时结束循环。REPEAT循环都用END REPEAT结束。 7WHILE语句WHILE语句也是有条件控制的循环语句。但WHILE语句和REPEAT语句是不一样的。WHILE语句是当满足条件时,执行循环内的语句。WHILE语句的基本语法形式如下:begin_label: WHILE search_condition DO statement_list END WHILE end_label 其中,search_c
53、ondition参数表示循环执行的条件,满足该条件时循环执行;statement_list参数表示循环的执行语句。下面是一个ITERATE语句的示例。代码如下:WHILE count<100 DO SET count=count+1; END WHILE ; 该示例循环执行count加1的操作,count值小于100时执行循环。如果count值等于100了,则跳出循环。WHILE循环需要使用END WHILE来结束。MySQL存储过程的基本函数一、数学函数数学函数主要用于处理数字,包括整型、浮点数等。函数作用ABS(x)返回x的绝对值SELECT ABS(-1) - 返回1CE
54、IL(x),CEILING(x)返回大于或等于x的最小整数SELECT CEIL(1.5) - 返回2FLOOR(x)返回小于或等于x的最大整数SELECT FLOOR(1.5) - 返回1RAND()返回0->1的随机数SELECT RAND() -0.93099315644334RAND(x)返回0->1的随机数,x值相同时返回的随机数相同SELECT RAND(2) -1.5865798029924SIGN(x)返回x的符号,x是负数、0、正数分别返回-1、0和1SELECT SIGN(-10) - (-1)PI()返回圆周率(3.14
55、1593)SELECT PI() -3.141593TRUNCATE(x,y)返回数值x保留到小数点后y位的值(与ROUND最大的区别是不会进行四舍五入)SELECT TRUNCATE(1.23456,3) - 1.234ROUND(x)返回离x最近的整数SELECT ROUND(1.23456) -1ROUND(x,y)保留x小数点后y位的值,但截断时要进行四舍五入SELECT ROUND(1.23456,3) - 1.235POW(x,y).POWER(x,y)返回x的y次方SELECT POW(2,3) - 8SQRT(x)返回x的平方根SELECT SQRT(25) - 5EXP(x)返回e的x次方SELECT EXP(3)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 抗肿瘤药物处方权与调剂权授权考核试题及答案
- 吉安市中医院吞咽功能评定技能考核
- 节水教育活动方案
- 苔藓种植活动方案
- 绿色协会活动方案
- 无锡市人民医院肝胆外科年度综合能力考核
- 老人无障碍活动方案
- 艺术团手拉手活动方案
- 联通骑行活动方案
- 老年活动室打扫活动方案
- 2025中国华腾工业有限公司招聘笔试历年参考题库附带答案详解(3卷合一)
- GB/T 16432-2025康复辅助器具分类和术语
- SB/T 11095-2014中药材仓库技术规范
- GH/T 1070-2011茶叶包装通则
- GB/T 6284-2006化工产品中水分测定的通用方法干燥减量法
- GB/T 38750.2-2020往复式内燃机能效评定规范第2部分:汽油机
- GB/T 13395-2008电力设备带电水冲洗导则
- 浪潮存储系统VTL1000用户手册V1.0
- 天麻栽培技术课件
- 高速铁路隧道衬砌拆换支架施工方案
- 班组‘五大员’管理办法
评论
0/150
提交评论