call存储过程执⾏语句_MySQL知识整理10.1—存储过程和函
数
数据科学探路者:MySQL知识整理9—索引z huanlan.zhihu
⼀、什么是存储过程?
简单的说,存储过程是⼀条或者多条SQL语句的集合,可视为批⽂件,但是其作⽤不限于批处理。
我们常⽤的操作数据库语⾔SQL语句在执⾏的时候需要要先编译,然后执⾏,⽽存储过程(Stored Procedure)是⼀组为了完成特定功能的SQL语句集,经编译后存储在数据库中,⽤户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调⽤执⾏它。
⼀个存储过程是⼀个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和⼀些特殊的控制结构组成。当希望在不同的应⽤程序或平台上执⾏相同的函数,或者封装特定功能时,存储过程是⾮常有⽤的。数据库中的存储过程可以看做是对编程中⾯向对象⽅法的模拟。它允许控制数据的访问⽅式。
⼆、创建存储过程和函数
存储程序可分为存储过程和函数,语句分别为:create procedure 和 create function,使⽤call语句来调⽤存储过程,只能⽤输出变量返回值。函数可以从语句外调⽤(即通过引⽤函数名),也能返回标量值。存储过程也能调⽤其他存储过程。
1.创建存储过程
基本语法格式:create procedure sp_name ( [proc_parameter]) []routine_body
create procedure:创建存储函数关键字;sp_name:存储过程名称;
proc_parameter:指定存储过程的参数列表,列表形式如下:[IN| OUT| INOUT]param_name type
输⼊参数:表⽰该参数的值必须在调⽤存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值IN 输⼊参数:
IN
OUT 输出参数:
输出参数:该值可在存储过程内部被改变,并可返回
OUT
输⼊输出参数:调⽤时指定,并且可被改变和返回
INOUT 输⼊输出参数:
INOUT
param_name:表⽰参数名称;type:表⽰参数类型
[]指定存储过程的特性;
routine_body是SQL代码的内容,可以⽤END来表⽰SQL代码的开始与结束
简单的存储过程⽰例:
delimiter//
create procedure proc()
begin
select * from fruits;
end//
delimiter;
(1)这⾥需要注意的是DELIMITER //和DELIMITER ;两句,DELIMITER是分割符的意思,因为MySQL默认以";"为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进⾏处理,则存储过程的编译过程会报错,所以要事先⽤DELIMITER关键字申明当前段分隔符,这样MySQL才会将";"当做存储过程中的代码,不会执⾏这些代码,⽤完了之后要把分隔符还原。
(2)存储过程根据需要可能会有输⼊、输出、输⼊输出参数,这⾥有⼀个输出参数s,类型是int型,如果有多个参数⽤","分割开。
(3)过程体的开始与结束使⽤BEGIN与END进⾏标识。
2.创建存储函数
基本语法格式:create function func_name([func_parameter]) returns type
[] routine_body
create function:创建存储函数的关键字;func_name:存储函数的名称;
func_parameter:存储过程的参数列表;形式如下:[IN| OUT| INOUT]param_name type
returns type表⽰函数返回数据的类型;characteristic指定存储函数的特性,取值与创建存储过程时相同
create function namebyzip()
returns char(50)
return (select s_name from suppliers where s_call='48075');
3.变量的使⽤
变量可以在⼦程序中声明并使⽤,这些变量的作⽤范围是在and之间。
定义变量的语法格式:
declare var_name [,varname]...date _type [default value];
var_name:局部变量名称;default value:给变量提供⼀个默认值,可以是常数也可以是表达式,没有default,初始值为NULL declare myparemeter int default 100;
为变量赋值的语法格式:
set var_name = expr [, var_name = expr]... ;
declare var1,var2,var3 int;
set var1=10 , var2=20;
set var3=var1+var2;
还可以通过into为⼀个或多个变量赋值,语法如下:
select col_name[,...] into var_name [,...] table_expr;
这个select语法把选定的列直接存储到对于位置的变量。
col_name:字段名称;var_name:定义变量名称;
table_expr:查询条件表达式,包括表名称和where⼦句。
DECLARE fruitname char(50);
DECLARE fruitprice decimal(8,2);
select f_name,f_price into fruitname,fruitprice
from fruits where fid='a1';
4.光标的使⽤
查询语句可能返回多条记录,如果数据累⾮常⼤,需要再存储过程和函数中使⽤光标来逐条读取查询结果集中的记录。光标必须在声明处理程序之前被声明,并且变量和条件在光标之前。
简单的mysql语句(1)声明光标
语法格式如下:declare cursor_name cursor for select_statement
cursor_name:光标名;select_statement:select语句的内容,返回⼀个⽤于创建光标的结果集。
declare cursor_fruit cursor for select fname,fprice from fruits;
(2)打开光标
语法格式如下:open cursor_name(光标名称)
open cursor_fruit;
(3)使⽤光标
语法格式如下:fetch cursor_name into var_name [,var_name]...{参数名称}
var_name:参数表⽰光标中的select语句查询出来的信息存⼊该参数中,必须在声明光标之前定义好。
fetch cursor_fruit into fruit_name,fruit_price;
(4)关闭光标
/*close cursor_name */
close cursor_fruit;
5.流程控制的使⽤
存储过程和函数中可以使⽤流程控制来控制语句的执⾏。
MySQL中可以使⽤IF语句、CASE语句、LOOP语句、LEAVE语句、ITERATE语句、REPEAT语句和WHILE语句来进⾏流程控制。每个流程中可能包含⼀个单独语句,或者是使⽤END构造的复合语句,构造可以被嵌套。
(1)if语句
IF语句⽤来进⾏条件判断。根据是否满⾜条件,将执⾏不同的语句。其语法的基本形式如下:
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] ...
[ELSE statement_list] END IF
其中,search_condition参数表⽰条件判断语句;statement_list表⽰不同条件的执⾏语句。
下⾯是⼀个IF语句的⽰例。代码如下:
if var is null
then select 'var is null';
else select 'var is not null';
end if;
(2)CASE语句
CASE语句也⽤来进⾏条件判断,其可以实现⽐IF语句更复杂的条件判断。CASE语句的基本形式如下:
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 statement_list] ...
[ELSE statement_list]
END CASE
其中,search_condition参数表⽰条件判断语句;statement_list参数表⽰不同条件的执⾏语句。下⾯是⼀个CASE语句的⽰例。代码如下:
/*第⼀种格式*/
case va1
when 1 then select 'va1 is 1';
when 2 then select 'va1 is 2';
eles select 'va1 is not 1 or 2';
end case;
/*第⼆种格式*/
case
when va1 is null then select 'va1 is null';
when va1 < 0 then select 'va1 is less than 0';
when va1 > 0 then select 'va1 is greater than 0';
eles select 'va1 is 0';
end case;
(3)LOOP语句
LOOP语句可以使某些特定的语句重复执⾏,实现⼀个简单循环。但是LOOP语句本⾝没有停⽌循环的语句,必须是遇到LEAVE语句等才能停⽌循环。 LOOP语句的语法的基本形式如下:
[begin_label:] LOOP statement_list END LOOP [end_label]
begin_label参数和end_label参数分别表⽰循环开始和结束的标志,这两个标志必须相同,⽽且都可以省略;statement_list参数表⽰需要循环执⾏的语句。
下⾯是⼀个LOOP语句的⽰例。代码如下:
declare id int default 0;
add_loop:loop
set id=id+1;
if id>=10 then leave add_loop;
end if;
end loop add_loop;
(4)leave语句
LEAVE语句主要⽤于跳出循环控制。其语法形式如下:LEAVE label ;其中,label参数表⽰循环的标志.下⾯是⼀个LEAVE语句的⽰例。代码如下:
add_num: LOOP
SET @count=@count+1;
IF @count=100 THEN
LEAVE add_num ;
END LOOP add_num ;
(5)ITERATE语句
ITERATE语句也是⽤来跳出循环的语句。但是,ITERATE语句是跳出本次循环,然后直接进⼊下⼀次循环。ITERATE语句只可以出现在LOOP、REPEAT、WHILE语句内。
ITERATE语句的基本语法形式如下:ITERATE label ;下⾯是⼀个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语句是跳出整个循环,然后执⾏循环后⾯的程序。⽽ITERATE语句是跳出本次循环,然后进⼊下⼀次循环。
(6)REPEAT语句
REPEAT语句是有条件控制的循环语句。当满⾜特定条件时,就会跳出循环语句。REPEAT语句的基本语法形式如下:
[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]
其中,statement_list参数表⽰循环的执⾏语句;search_condition参数表⽰结束循环的条件,满⾜该条件时循环结束。下⾯是⼀个REPEAT语句的⽰例。代码如下:
declare id int default 0;
repeat
set id=id+1;
until id>=10
end repeat ;
(7)WHILE语句
WHILE语句也是有条件控制的循环语句。但WHILE语句和REPEAT语句是不⼀样的。WHILE语句是当满⾜条件时,执⾏循环内的语句。WHILE语句的基本语法形式如下:
[begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_label]
其中,search_condition参数表⽰循环执⾏的条件,满⾜该条件时循环执⾏;statement_list参数表⽰循环的执⾏语句。下⾯是⼀个WHILE语句的⽰例,代码如下:
declare id int default 0;
while id < 10 do
set id=id+1;
end while;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论