mysql 存储过程学习(总)

#一。存储过程和存储函数的创建案例

CREATE PROCEDURE myprocedure(in a int,in b int ,OUT c INT)
BEGIN
set c=a+b;
end;

call myprocedure(1,2,@num);#存储过程需要call 来执行 @num 这个是执行的结果,我们通过select 来调用

SELECT @num;


CREATE FUNCTION myfunction(a INT) RETURNS INT(2)#RETURNS 要返回的类型
BEGIN
set a=a+1;
RETURN a;
end;

SELECT myfunction(2)+@num;

#二。变量的使用
#通用公式 :DECLARE 变量名称 变量类型 DEFAULT 默认值 (如果不写DEFAULT,则默认值为NULL)
#给变量赋值用set 或者select ... into 变量名

CREATE FUNCTION myfunction2(a INT) RETURNS INT(2)#RETURNS 要返回的类型
BEGIN
DECLARE b INT DEFAULT 100;
set a=b+1;
RETURN a;
end;
SELECT myfunction2(3);

SELECT myfunction(2),+@num;

 

CREATE FUNCTION myfunction3(a INT) RETURNS INT(2)
BEGIN
#相同的变量可以写在一起
# b,c,d为局部变量
DECLARE b,c,d INT DEFAULT 100;
set a=b+c+d;
RETURN a;
end;
SELECT myfunction3(2);
#三。定义条件和处理程序

#mysql 存储函数和过程可以将错误 变成我们想要的处理结果分2步骤

#1.定义错误条件 语法:DECLARE 条件名字 CONDITION for 错误编码
#2. 定义错误执行程序: DECLARE 类型(EXIT,CONTINUE)HANDLER for 条件名字 set @info='定义的含义';

CREATE TABLE contest(s1 int,PRIMARY KEY(s1));

CREATE PROCEDURE myprocedure2()
BEGIN
DECLARE myfirstcon CONDITION for 1062;
DECLARE CONTINUE HANDLER for myfirstcon set @info='主键冲突';
INSERT INTO contest VALUES(1);
INSERT INTO contest VALUES(1);
set @info='主键冲突1';
end;

call myprocedure2();
SELECT @info
# @info为用户变量

#备注:

-- 1. 局部变量:局部变量一般用在sql语句块中,比如存储过程的begin/end。
--
--   2. 用户变量:用户变量的作用域要比局部变量要广。用户变量可以作用于当前整个连接,但是当当前连接断开后,其所定义的用户变量都会消失。
--
--   3. 会话变量:服务器为每个连接的客户端维护一系列会话变量。(SET @num=1; #设置一个变量等于1 SELECT @num; #查询该变量)
--
--   4. 全局变量:全局变量影响服务器整体操作。当服务器启动时,它将所有全局变量初始化为默认值(可以通过@@或global来操作系统变量)


#四。光标的使用

#声明光标 语法:DECLARE 光标名字 CURSOR FOR sql语句

#打开光标 OPEN 光标名称

#使用光标 FETCH 光标名称 into 。。。

#关闭光标 CLOSE 光标名称

CREATE PROCEDURE guangbiao()
BEGIN
DECLARE a VARCHAR(20);
DECLARE c VARCHAR(20);
DECLARE b int DEFAULT 0;
DECLARE myguangbiao CURSOR for SELECT title,body from 测试.articless;
DECLARE CONTINUE HANDLER for not FOUND set b=1;
OPEN myguangbiao;

read_loop:
LOOP
FETCH myguangbiao into a,c;
IF b=1 THEN
LEAVE read_loop;
end IF;
INSERT into 测试.aaa(text1,text) VALUES(a,c);
set b=0;
END LOOP read_loop;
CLOSE myguangbiao;
END;

call guangbiao();


#五。流程控制的使用

#1.IF 使用

create PROCEDURE iftest1()
BEGIN
DECLARE a int DEFAULT 10;
-- IF (a>1 &&a<20) THEN
IF (a>1 and a<20) THEN
SELECT 'ok';
ELSE SELECT 'No';
END IF;
END;
CALL iftest();

#2.case 使用

create PROCEDURE casetest()
BEGIN
DECLARE a int DEFAULT 10;
CASE a
WHEN a>10 then SELECT 'no';
WHEN 10 then SELECT 'ok';
ELSE SELECT 'nono';
end CASE;
END;
CALL casetest();
#3.loop 使用

CREATE PROCEDURE looptest()
BEGIN
DECLARE a int DEFAULT 0;
DECLARE b int DEFAULT 0;
my_loop:LOOP
set a=a+1;
if a>10 THEN LEAVE my_loop;
END if;
set b=a;

END LOOP my_loop;
SELECT b;

end;

CALL looptest();

#4.LEAVE 使用 跳出当前循环见上个测试用例 looptest相当于java循环中的break

#5.ITERATE 使用,跳转到循环头部执行,相当于java循环中的continue,ITERATE只能 使用在循环中


CREATE PROCEDURE ITERATEtest()
BEGIN
DECLARE a int DEFAULT 0;
DECLARE b int DEFAULT 0;
my_loop:LOOP
set a=a+1;
if a>10 THEN LEAVE my_loop;
ELSEIF a>5 THEN ITERATE my_loop;
END if;
set b=a;

END LOOP my_loop;
SELECT b;

end;

CALL ITERATEtest();

#6.REPEAT 带条件的循环

CREATE PROCEDURE REPEATtest()
BEGIN
DECLARE a int DEFAULT 0;
REPEAT
set a=a+1;
UNTIL a>10
END REPEAT;
SELECT a;
END;

CALL REPEATtest();
#7.WHILE 带条件的循环

CREATE PROCEDURE WHILEtest()
BEGIN
DECLARE a int DEFAULT 0;

WHILE a<10 DO
set a=a+1;
END WHILE;
SELECT a;

END;

CALL WHILEtest()

 

#查看存储过程和函数 状态和信息

 

show PROCEDURE STATUS like 'casetest%';
show CREATE FUNCTION 测试.myfunction;
show CREATE PROCEDURE 测试.casetest;

 

 

 


posted @ 2018-06-29 18:37  anxbb  阅读(169)  评论(0编辑  收藏  举报