看一个例子
这个例子使用元素比较多,解释一下:
COMMENT为表添加了一句注释;
-- 单行注释,注释跟在后面的内容,需要注意-- 后需要加一个空格才能生效;
(#注释内容 /*注释内容*/ 这两种方法也能进行注释)
Declare用来声明变量,一句declare只能声明一个变量,变量必须先声明后使用
If...Then是进行条件判断的,基本语句如下:
If ... Then ... Else ... End If
这个存储过程完成了订单合计,并判断该订单是否需要增加营业税。taxable是一个布尔值(如果要增税为真,否则为假)。在存储体中定义了两个局部变量。并将结果存储到局部变量total中。if语句检查taxable是否为真,如果为真,则用另一条select语句增加营业税。最后将total结果保存到ototal中。
调用结果如下:
检查存储过程
SHOW CREATE PROCEDURE 过程名
为了获得包括何时、由谁创建等详细信息的存储过程列表,使用
Show procedure status -- 会列出所有存储过程
可以添加过滤,比如
存储过程循环语句
1. while
WHILE (表达式) DO
...
END WHILE
看一个例子
创建了一个循环存储过程,重复向human插入5条记录。下面调用看一下结果
2.repeat
基本语句:
Repeat ...until 条件...END Repeat;
同样 *** 作,使用repeat执行如下
DROP PROCEDURE IF EXISTS excute_job_v340
create procedure excute_job_v340()
begin
declare rdevid int//声明参数
declare rech_id int
declare slot int
declare new_rech_id int
declare new_price DOUBLE//声明参数
declare done INT DEFAULT FALSE////声明结束标识参数
-- 声明游标
DECLARE rdevrech_id CURSOR FOR
select r.id as rdevid,r.rechargeconfig_id as rech_id,r.slot_no as slot from b_device_tbl dev
LEFT JOIN r_device_rechargeconfig_tbl r on dev.id= r.device_id
where dev.dev_typedef_id =7 and dev.masterid is not NULL and r.rechargeconfig_type=4 and r.is_deleted=0 and r.slot_no is not NULL
-- 将结束标志绑定到游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE
-- 打开游标
OPEN rdevrech_id
-- 遍历
read_loop: LOOP
-- 取值
FETCH NEXT from rdevrech_id INTO rdevid,rech_id,slot
IF done THEN
LEAVE read_loop
END IF// 结束判断
select price into new_price from c_device_rechargeconfig_item_tbl where rechargeconfig_id =rech_id limit 1
INSERT INTO `c_device_rechargeconfig_tbl` ( `type`, `style_id`, `is_default`, `dev_type_code`, `is_deleted`, `create_time`, `slot_no`)
VALUES ( '4', NULL, '0', '0', '0', '2019-08-19 15:59:24',slot )
select max(id) into new_rech_id from c_device_rechargeconfig_tbl
INSERT INTO `c_device_rechargeconfig_item_tbl` ( `price`, `goods`, `description`, `is_deleted`, `create_time`, `rechargeconfig_id` )
VALUES ( new_price,new_price, '0.00', '0', '2019-08-19 15:59:24', new_rech_id)
update r_device_rechargeconfig_tbl set rechargeconfig_id=new_rech_id where id=rdevid
END LOOP
CLOSE rdevrech_id
end;
call excute_job_v340() //调用执行
declare storeId varchar(10)在存储过程中创建游标,这个游标里面存了你所有要循环的数据,集合:
declare diy_cursor cursor for
select store_id from t_b_store
open diy_cursor--打开游标
diy_loop:loop ---这里开始循环
FETCH diy_cursor into storeId--提取本次循环的数据,保存在storeId中
if done = 1 then --done是在存储过程开始的时候定义的一个整形变量
leave diy_loop---如果游标中的数据提取完毕,就自动跳出这个循环end if
----在这里用你循环取到的storeId做你想做的事情,就是写你的sql啦---
end loop--循环结束
close diy_loop--关闭游标
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)