1.存储过程相当于我们学的各种高级语言的函数,既然是函数就可能有参数,先介绍参数类型:
存储过程主要包含三种参数类型,注意我说的不是数据类型(INT、VARCHAR)
第一种:IN输入参数:表示这种参数类型的值就必须由外界调用存储过程时赋值,就意味着你在调用的时候必须传入参数,但是像是高级语言的里的局部变量,当存储过程使用完毕的时候,IN类型的值随着消失了
DELIMITER$$
CREATE PROCEDURE demo(IN p_in int)
BEGIN
SELECT p_in;
SET p_in=2;
SELECT p_in;
END$$
DELIMITER;
SET @P_IN=1;
CALL demo(@P_IN)
select @P_OUT; P_OUT是1!!! 值并没有发生改变
ps:DELIMITER 是指定什么是结束符,正常情况下,我们的SQL语句的结束符是 ;,但是存储过程的声明时,这个“函数”中的语句也需要 ;来表示结束,所以为了以防产生二义性,像我写的那样,此时 $$ 就相当于结束符 ;
第二种:OUT输出参数:依我看就是省去传参的时候的赋值操作,但却改变了传进来的的值(像是C语言的指针赋值),说起来似乎有些矛盾,但是却事实存在,直接上代码。
DELIMITER
CREATE PROCEDURE demo_out(OUT p_out int)
BEGIN
SELECT p_out; p_out 为 null!!!!
SET p_out=2;
SELECT p_out; p_out 为2!!!!
END;
DELIMITER;
SET @P_OUT=9;
CALL demo_out(@P_OUT)
select @P_OUT; P_OUT是2!!!
第三种:INOUT函数,简单明了不用多说,就是传值并且改变值
DELIMITER
CREATE PROCEDURE demo_inout(INOUT p_inout int)
BEGIN
SELECT p_inout;
SET p_inout=2;
SELECT p_inout;
END;
DELIMITER;
SET @p_inout=1;
CALL demo_inout(@p_inout)
ps:
存储过程中的变量声明 declare 变量名字 变量的数据类型;
声明的方式也有两种,第一种是用select,第二种是使用SET语句;for example:
select 'Hello world' into @x;
SET @y='Goodbye Cruel world'
如果你的存储过程只有一行的时候,那么你完全可以省略那些BEGIN 或者END
FOR EXAMPLE:
CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World');
SET @greeting='Hello';
CALL GreetWorld( );
CREATE PROCEDURE p1() SET @last_procedure='p1';
CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@last_procedure);
CALL p1( );
CALL p2( );
2,存储过程中常用的各种语法与结构:
if_then_else语句
1. mysql > DELIMITER
2. mysql > CREATE PROCEDURE proc2(IN parameter int)
3. -> begin
4. -> declare var int;
5. -> set var=parameter+1;
6. -> if var=0 then
7. -> select var;
8. -> end if;
9. -> if parameter=0 then
10. -> set parameter=100;
11. -> else
12. -> set parameter=0;
13. -> end if;
14. -> end;
15. -> //
16.mysql > DELIMITER ;
大致两种结构
if (condition) then (注意then之后没有;)
sql_stetament;
end if;
if(condition) then
sql_statement
else
sql_statement
end if;
CASE 语句
、1. mysql > DELIMITER
2. mysql > CREATE PROCEDURE proc3 (in parameter int)
3. -> begin
4. -> declare var int;
5. -> set var=parameter+1;
6. -> case var
7. -> when 0 then
8. -> insert into t values(17);
9. -> when 1 then
10. -> insert into t values(18);
11. -> else
12. -> insert into t values(19);
13. -> end case;
14. -> end;
15. -> //
16.mysql > DELIMITER ;
总结了下结构:
case NUMBER
when number then
SQL_Statement;
when anotherNUMber then
SQL_Statement;
else
SQL_Statement;
end ease;
while语句
1. mysql > DELIMITER //
2. mysql > CREATE PROCEDURE proc4()
3. -> begin
4. -> declare var int;
5. -> set var=0;
6. -> while var<6 do
7. -> insert into t values(var);
8. -> set var=var+1;
9. -> end while;
10. -> end;
11. -> //
12.mysql > DELIMITER ;
大致结构
while (condition) do
SQL_statement/SET_Statement
end while;
repeat语句:
与do-while循环很相似,先执行一次,然后由Until验证条件
mysql > DELIMITER //
2. mysql > CREATE PROCEDURE proc5 ()
3. -> begin
4. -> declare v int;
5. -> set v=0;
6. -> repeat
7. -> insert into t values(v);
8. -> set v=v+1;
9. -> until v>=5
10. -> end repeat;
11. -> end;
12. -> //
13.mysql > DELIMITER ;
(哈哈哈,复制一段,懒得敲了)
repeat
SQL_statement/SET_Statement
until (Condition)
end repeat;
loop语句:开始学的时候就这个最变扭
1. mysql > DELIMITER //
2. mysql > CREATE PROCEDURE proc6 ()
3. -> begin
4. -> declare v int;
5. -> set v=0;
6. -> LOOP_LABLE:loop LOOP_LABLE:标号,可以用在合法的语句前,便于结束(leave)循环
7. -> insert into t values(v);
8. -> set v=v+1;
9. -> if v >=5 then
10. -> leave LOOP_LABLE; leave跳出由LOOP_LABEL指定的loop循环
11. -> end if;
12. -> end loop;
13. -> end;
14. -> //
leave--break、ITERATE--continue
再复制一段,哈哈哈
DELIMITER $$
DROP PROCEDURE IF EXISTS LOOPLoopProc$$
CREATE PROCEDURE LOOPLoopProc()
BEGIN
DECLARE x INT;
DECLARE str VARCHAR(255);
SET x = 1;
SET str = '';
loop_label: LOOP
IF x > 10 THEN
LEAVE loop_label; mysql 大多数是不区分大小写的,除了你在查询的时候使用DISTINCT
END IF;
SET x = x + 1;
IF (x mod 2) THEN
ITERATE loop_label; ITERATE 类似于高级语言中的continue语言,返回外层循环并且开始下一个
ELSE
SET str = CONCAT(str,x,',');
END IF;
END LOOP;
SELECT str;
END$$
DELIMITER ;