IF语句
语法
if condition then 第1判断
第1语句体
[else if condition then] 第2判断
第2语句体
[else if condition then] 第n判断
第n语句体
[else]
最后语句体
end if
IF语句为分支语句,首先进行第1判断,若成立,则执行第1语句体,执行完后跳到end if后面的语句继续执行;若不成立,则进行第2判断,若成立,则执行第2语句体,执行完后跳到end if后面的语句执行…
例:
use db_test --选取数据库
DROP procedure IF EXISTS test_if; --若过程test_if存在则删除
delimiter $ --定义分界符
CREATE procedure test_if(IN x INT) --创建过程
begin
if x=1 then --x为传入变量,若x=1则执行SELECT ‘OK’;
SELECT ‘OK’;
elseif x=0 then --x为0则执行SELECT ‘’NO;
SELECT ‘NO’;
else
SELECT 'good';
end if; --结束if
end; --结束
$
delimiter ;
执行:
mysql> call test_if(0);
mysql> call test_if(1);
mysql> call test_if(2);
例:下面这个示例用于生成当天唯一流水号:
use db_test; --选取数据库
DROP procedure IF EXISTS lsid3; --若过程存在则删除
DELIMITER $$ --定界符
-- 存储过程:取得当天最大的流水
CREATE DEFINER=root@localhost PROCEDURE isid3(out lid VARCHAR(20)) --创建过程
BEGIN
-- 创建表
CREATE TABLE IF NOT EXISTS ykxt_lsh(
rq VARCHAR(8) NOT NULL,
lsh DECIMAL(10,0) NOT NULL,
PRIMARY KEY (rq)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SELECT CONVERT(DATE_FORMAT(sysdate(),'%y%m%d'),char) INTO @l_fwqsj_str;
SELECT COUNT(*) INTO @l_sss FROM ykxt_lsh;
if @l_sss=0 then
INSERT INTO ykxt_lsh(rq,lsh) values (@l_fwqsj_str,1);
else
SELECT rq INTO @ll_xflsh_rq FROM ykxt_lsh;
if @ll_xflsh_rq=@l_fwqsj_str then
UPDATE ykxt_lsh SET lsh=lsh+1;
else
UPDATE ykxt_lsh SET rq=@l_fwqsj_str,lsh=1;
end if;
end if;
SELECT rq,CONVERT(lsh,char) INTO @ll_xflsh_rq,@ll_opid_char FROM ykxt_lsh;
SELECT CONCAT(@ll_xflsh_rq,@ll_opid_char) INTO lid;
END;
$$
DELIMITER ;
执行:
mysql> SELECT @lid;
CASE语句
语法结构(一)
case value "CASE 被比较的值"
when value_1 then
第1个when语句体
[when value_2 then
第2个when语句体]
...
[when value_n then
第n个when语句体]
[else
else语句体]
end case
语法结构(二)
case
when condition_1 then 第1个when判断
第1个语句体
[when condition_2 then 第2个when判断
第2个语句体]
...
[when condition_n then 第n个when判断
第n个语句体]
[else
else语句体]
例(结构一):
use db_test;
DROP procedure IF EXISTS test_case;
delimiter //
CREATE procedure test_case (IN x INT)
begin
case x
when 1 then SELECT 'OK';
when 0 then SELECT 'No';
else SELECT 'good';
end case;
end;
//
delimiter ;
执行:
mysql> call test_case(0);
mysql> call test_case(1);
mysql> call test_case(2);
例(结构二):
use db_test;
DROP procedure IF EXISTS test_case2;
delimiter //
CREATE procedure test_case 2(IN x INT)
begin
case
when x=1 then SELECT 'OK';
when x=0 then SELECT 'No';
else SELECT 'good';
end case;
end;
//
delimiter ;
执行:
mysql> call test_case2(0);
mysql> call test_case2(1);
mysql> call test_case2(2);
WHILE 语句
语法结构
while condition do
...
end while
例:
use db_test;
DROP procedure IF EXISTS test_while;
delimiter //
CREATE procedure test_while(out sum INT)
begin
declare i INT default 1;
declare s INT default 0;
while i<=10 do
SET s=s+i;
SET i=i+1;
end while;
SET sum=s;
end;
//
delimiter ;
执行:
mysql> call test_while(@s);
mysql> SELECT @s;
LOOP语句
语法结构
loop
...
end loop
例:
use db_test;
DROP procedure IF EXISTS test_loop;
delimiter //
CREATE procedure test_loop(out sum INT)
begin
declare i INT default 1;
declare s INT default 0;
loop_label:loop
SET s=s+i;
SET i=i+1;
if i>10 then leave loop_label;
end if;
end loop;
SET sum=s;
end;
//
delimiter ;
执行:
mysql> call test_loop(@s);
mysql> SELECT @s;
REPEAT语句
语法结构
repeat
...
until condition
end repeat
例:
use db_test;
DROP procedure IF EXSIST test_repeat;
delimiter //
CREATE procedure test_repeat(out sum INT)
begin
declare i INT default 1;
declare s INT default 0;
repeat
SET s=s+i;
SET i=i+1;
until i>10 --此处不能有分号
END repeat;
SET sum=s;
end;
//
delimiter ;
执行:
mysql> call test_repeat(@s);
mysql> SELECT @s;