PL SQL例項講解(一)

2021-07-25 07:03:04 字數 3446 閱讀 8203

題目要求:某加工廠發貨規則是:每車發貨480件,週六週日不發貨,供貨期間除了最後一批貨外其餘只能整車發貨。

舉個例子:某廠商需求三天貨,周四需要供貨300,周五需要供貨200,週六需要供貨400,下周一需要供貨200。

原發貨表如下:

ship_date

ship_qty

plan_type

2016-12-01

300old

2016-12-02

200old

2016-12-03

400old

2016-12-05

200old

按照要求不滿480件也要發貨480,那麼周四發貨480件,相當於多發了180,多發的量計入周五該發的數量,相當於周五只需要20件就夠了。但是週六不發貨,所以週六的貨需要提前發,併入周五。考慮到下周一還需要貨,那麼還得按照整車發貨要求來,周五也發480件,相當於發了下周一的60件,而整個供貨期到周一截止,那麼周一發貨120即可。

所以實際發貨清單如下:

ship_date

ship_qty

plan_type

2016-12-01

300old

2016-12-01

480new

2016-12-02

200old

2016-12-02

480new

2016-12-03

400old

2016-12-05

200old

2016-12-05

120new

相信題意應該明確了。

可以簡單思考一下,如何在程式中考慮這些因素。有兩個思路:

第乙個:把週六週日的資料移到周五(不是說週六日不讓發貨嗎,那就當成是周五要發的貨),再進行發貨整車計算。

第二個:先不管週六日不讓發貨這個規則,先按照整車必須480來計算每天需要的發貨量。再將週六日要發的貨移到周五即可。

create

or replace procedure

ship_plan

isl_qty

number := 0;

l_last_day date;

begin

--process_data游標中放置了按照日期排序的hand_ship_plan表

for process_data in (select hsp.ship_date,

hsp.ship_qty,

to_char(hsp.ship_date, 'd') week

from hand_ship_plan hsp

order

by hsp.ship_date) loop

if process_data.week not

in ('1', '7') then

--如果游標取到日期不是週六和週日,進行插入操作,相當於對周一到周五的資料進行了複寫,將type值變為new

insert into hand_ship_plan

(ship_date, ship_qty, plan_type)

values

(process_data.ship_date, process_data.ship_qty, 'new');

else

--否則(如果游標取到的日期是週六和週日)進行更新操作,更新的是哪一天?由decode判斷 如果是週日,讓週日那天減2,如果是週六,讓週六那天減1,確保日期為周五,將運貨量加在周五裡

update hand_ship_plan hsp

set hsp.ship_qty = nvl(hsp.ship_qty, 0) + process_data.ship_qty

where hsp.ship_date =

process_data.ship_date - decode(process_data.week, 1, 2, 1);

--如果沒有語句受到影響(意味著周五沒有發貨任務) 所以上邊的更新操作沒有成功,那麼直接將週六日插入新建的周五中

if sql%notfound then

insert into hand_ship_plan

(ship_date, ship_qty, plan_type)

values

(process_data.ship_date - decode(process_data.week, 1, 2, 1),

process_data.ship_qty,

'new');

endif; end

if; --至此,將週六週日的資料移到周五 完成

endloop;

--進行第二步操作,process_new游標先取到所有 型別 為 『new』的 並且按照日期排序的 條目 及 rowid 型別為『new』的只有周一到周五

for process_new in (select rowid row_id, hsp.*

from hand_ship_plan hsp

where hsp.plan_type = 'new'

order

by hsp.ship_date) loop

--l_qty變數是為了記錄當多發的量 當l_qty大於當日該發的量,此時刪除那天的『new』記錄

if l_qty >= process_new.ship_qty then

delete from hand_ship_plan hsp where rowid = process_new.row_id;

l_qty := l_qty - process_new.ship_qty;

else

--計算每天要發貨的數量 ceil向上取整 先算個數 再算數量

update hand_ship_plan hsp

set hsp.ship_qty =

ceil((process_new.ship_qty - l_qty) / 480) * 480

where rowid = process_new.row_id;

--更新多發的貨

l_qty := ceil((process_new.ship_qty - l_qty) / 480) * 480 -

(process_new.ship_qty - l_qty);

l_last_day := process_new.ship_date;

endif; end

loop;

--當到最後一天時 發貨剩餘的數量

if l_qty > 0

then

update hand_ship_plan hsp

set hsp.ship_qty = hsp.ship_qty - l_qty

where hsp.plan_type = 'new'

and hsp.ship_date = l_last_day;

endif;end;

具體過程程式的注釋都有解釋。大家可以自己見表嘗試。

例項講解PostSharp(一)

public class employee 密碼 employeename,employeepwd logmanager.logwrite add class logmanager 主程式 static void main string args localdatastoreslot localsl...

例項講解PostSharp(一)

public class employee 密碼 employeename,employeepwd logmanager.logwrite add class logmanager 主程式 static void main string args localdatastoreslot localsl...

PL SQL 例項總結

pl sql 保證輸出 set serveroutput on pl sql 塊 declare v sal emp.sal type begin select sal into v sal from emp where empno 7369 dbms output.put line v sal e...