1. 程式人生 > >My sql之存儲過程+遊標

My sql之存儲過程+遊標

reat 實例 close 記錄 開始 false 修改用戶 loop 存儲

sql 實例如下:

/**************定義更改car_station_user_acct_his new_balance old_balance存儲過程**************/
create procedure abc (in number varchar(256)) -- 【in表示這個參數是傳入參數,out表示這個是傳出參數(類似Java中的return),in out表示這個既是傳入,又是傳出參數,可以利用它傳入該存儲過程,然後接到處理後的這個參數】

begin
-- 定義變量
declare v_date,v_name varchar(256);


-- 申明 遊標
declare cur cursor for select create_date,update_by from car_order where bill_number = number;

-- 遍歷數據結束標誌
declare done int default false;

-- 將結束標誌綁定到遊標

declare continue handler for not found set done = true;

/* select a.create_date,a.user_name
from (select h.create_date,h.user_name,
-- 對筆數進行判斷,算出相應工分
case when h.trade_no < 11 then round(convert(o.total,DECIMAL)*0.3,0)
when h.trade_no < 21 then round(convert(o.total,DECIMAL)*0.4,0)
else round(CONVERT(o.total,DECIMAL)*0.5,0) end as car
from car_order o, car_station_user_acct_his h
where o.bill_number = h.bill_number and h.trade_no is not NULL and o.total > 1 and o.update_by = ‘2A36006‘ ) a
where a.car != a.deduct; */

-- 打開遊標、開始循環
open cur;
read_loop:loop
fetch cur into v_date,v_name;
if done then
leave read_loop;
end if;

--過程調試
-- step1 修改用戶積分歷史記錄(car_station_user_acct_his)的變換後值,從當前單據往後修改,包括當前單據
update car_station_user_acct_his
set new_balance = new_balance+1
where create_date >= v_date
and user_name = v_name;

--過程調試
-- step2 修改用戶積分歷史記錄(car_station_user_acct_his)的變換前值,從當前單據往後修改
update car_station_user_acct_his
set old_balance = old_balance+1
where create_date > v_date
and user_name = v_name;

-- step3 修改訂單記錄的積分
update car_order set deduct = deduct+1
where bill_number = number
and create_date>=v_date
and create_date<DATE_ADD(date(now()),INTERVAL 1 DAY)
and update_by = v_name;

-- step4 修改用戶當前積分
update car_order set deduct = deduct + 1 where bill_number = number;

end loop;
close cur;
end;

My sql之存儲過程+遊標