存储过程写法
格式:
create procedure 存储过程名字([in|out|inout] 参数 数据类型)beginMySQL 语句;end;
说明:
MySQL 存储过程参数分为:
in :输入参数
out :输出参数
inout :输入和输出参数
如果不显式指定“in”、“out”、“inout”,则默认为“in”
注意:
MySQL 存储过程名字后面的“()”是必须的,即使没有一个参数,也需要“()”
MySQL 存储过程参数,不能在参数名称前加“@”,如:“@a int”(在 SQL Server 中是正确的)
MySQL 存储过程中的变量,不需要在变量名字前加“@”,但是 MySQL 客户端用户变量要加个“@”
MySQL 存储过程中的每条语句的末尾,都要加上分号 “;”
return 不能在 MySQL 存储过程中使用,return 只能出现在函数中。SQL Server可以在存储过程写return
MySQL 存储过程的参数不能指定默认值。而SQL Server 可以
MySQL 存储过程不需要在 正文前面加 “as”。而 SQL Server 存储过程必须加 “as” 关键字
如果 MySQL 存储过程中包含单条或者多条 MySQL 语句,都需要 begin end 关键字
存储过程的注释使用 **/ 或 -- (注意打空格)
例:查询订单的总金额
delimiter // -- 修改当前的结束符号为//而不是; 这样可以在存储过程中用;create procedure aa -- 创建新的存储过程aa(out total float; -- 输出参数是金额(小数类型))beginselect sum(amount) into total from orders; -- 查询订单表并统计金额end// -- 结束delimiter ; -- 将结束符号还原为;call aa(@t); -- 调用存储过程select @t; -- 输出执行结果show create procdure aa; -- 查看存储过程的定义drop procdure aa; -- 删除存储过程
例:计算两个数字之和
drop procedure if exists pr_add;delimiter //create procedure pr_add(a int,b int)begindeclare c int;if a is null thenset a = 0;end if;if b is null thenset b = 0;end if;set c = a + b;select c as sum;end//delimiter ;call pr_add(10,20);
注意:如果执行 MySQL 存储过程要使用变量,需要为 MySQL 用户变量:
set @a = 10;set @b = 20;call pr_add(@a, @b);
MySQL语句
if-then -else
delimitercreate procedure p12(parameter int)beginif parameter=0 thenupdate t set s1=s1+1; -- parameter为0,则s1的值加1elseupdate t set s1=s1+2; -- 否则s1的值加2end if;end//delimiter ;
case
如果需要进行更多条件真假的判断我们可以使用case语句
delimitercreate procedure p13(parameter int)begindeclare var int;set var=parameter+1;case varwhen 0 then insert into t values(17);when 1 then insert into t values(18);else insert into t values(19);end case;end//delimiter ;
while ···· end while
循环语句
delimiter //create procedure p14()begindeclare var int;set var=0;while var<6 doinsert into t values(var);set var=var+1;end while;end//delimiter ;
repeat···· end repeat
它在执行操作后检查结果,而while则是执行前进行检查
delimiter //create procedure p15()begindeclare v int;set v=0;repeatinsert into t values(v);set v=v+1;until v>=5end repeat;end//delimiter ;
loop ·····end loop
loop 循环不需要初始条件,这点和while 循环相似,同时和repeat循环一样不需要结束条件, leave语句的意义是离开循环
delimiter //create procedure p16()begindeclare v int;set v=0;loop_lable:loopinsert into t values(v);set v=v+1;if v >=5 thenleave loop_lable;end if;end loop;end//delimiter ;
说明:lables 标号可以用在begin repeat while 或者loop 语句前,语句标号只能在合法的语句前面使用。可以跳出循环,使运行指令达到复合语句的最后一步。
视图
-- 定义视图create or replace view 视图名asselect …..-- 调用:select * from 视图名-- 查看视图的定义:describe 视图名-- 查看所有视图的定义:select * from information_schema.views;-- 删除视图:drop view if exists 视图名;
注意:关于视图的编辑-- 编辑视图数据:update 视图名 set 字段=值;-- 删除视图数据:delete from 视图名 where 主键=值;
说明:更新视图的时候是通过基本表执行更新文章转载自全栈精英,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




