2012-09-30 31 views
1

我有如下表在其他表執行刪除和更新各行

CREATE TABLE A2SKU 
(
    SKUID NUMBER NOT NULL, 
    SKUNAME VARCHAR2(20), 
    SKUQTY NUMBER, 
    CONSTRAINT A2SKU_PK PRIMARY KEY (SKUID) 
); 


CREATE TABLE A2LOC 
(
    LOCID NUMBER NOT NULL, 
    LOCNAME VARCHAR2(20), 
    LOCQTY NUMBER, 
    MAXQTY NUMBER, 
    CONSTRAINT A2LOC_PK PRIMARY KEY (LOCID) 
); 



Create Table A2BOX ( 
boxId NUMBER Primary Key, 
skuId NUMBER, 
locId NUMBER, 
constraint FK_A2BOX_SKUID foreign key (skuid) references A2SKU, 
constraint FK_A2BOX_LOCID foreign key (locid) references A2LOC 
); 


CREATE SEQUENCE A2BOXSEQ; 

我想與匹配的SKU從A2Box表中刪除所有箱子和調節匹配位置的LocQty在A2Loc表每個盒子的數量除以1

我如何使用存儲過程來做到這一點。

我想我和這個

create or replace procedure A2DeleteSKU 
(
pskuid IN number 
) 
AS 
CURSOR row_cursor IS 
     SELECT boxid,locid from A2BOX where skuid = pskuid; 
skuid_count Number; 
skuid_check exception; 

sku_rec row_cursor%rowtype; 

Begin 
select count(*) into skuid_count from A2SKU where skuid = pskuid; 
if skuid_count <1 then 
raise skuid_check; 
End If; 

FOR sku_rec in row_cursor 

LOOP 
    delete from a2box where boxid = sku_rec.boxid; 
    update A2LOC set locqty = locqty -1 where locid = sku_rec.locid; 
END LOOP; 

    delete from A2SKU where skuid =pskuid; 
    commit; 
Exception 
When skuid_check then 
    RAISE_APPLICATION_ERROR(-20014, 'Delete Box failed. Boxid does not exist: '||TO_CHAR(pskuid)); 
When others then 
raise; 
End A2DeleteSku; 
+0

您正在使用哪個dbms? – Tim

回答

0

從我的理解上A2LOC的LOCQTY列想出了代表的盒子與相應LOCID的總結,你想箱子被刪除時,進行調整。所以,請檢查下面的代碼:

create or replace procedure adjustLoc(p_skuid number) is 
begin 

-- Adjusts the locqty value 
update A2LOC loc 
    set LOCQTY = LOCQTY -1 
where exists(select 1 
       from A2BOX box 
       where box.locid = loc.locid 
       and box.skuid = p_skuid); 

-- Removes all sku matching boxes 
Delete A2BOX 
where skuid = p_skuid; 

end; 
1
CREATE PROCEDURE remove_boxes(pp_skuId NUMBER) IS 
BEGIN 
    UDPATE a2loc SET locqty = locqty - 1 
     WHERE locid IN (SELECT locid FROM a2box 
         WHERE skuId = pp_skuId); 
    DELETE FROM a2box 
     WHERE skuId = pp_skuId; 
END; 

我不知道你所說1.調整locqty的意思你以正確的方式

2

修改更新命令這是一個完美的機會使用RETURNING INTO子句,該子句與BULK COLLECT結合使用可能非常有用。

爲了使用它,您必須設置一個數組來保存您要刪除的locid。由於每個SKUID可能有多個locid,因此您可能必須將每個locid的數量減少一個以上。

create or replace procedure remove_boxes (PSKUID number) is 

    -- Set up an array to hold the deletes 
    type t__locid is table of a2loc.locid%type index by binary_integer; 
    t_locid t__locid; 

begin 

    -- Delete the rows and return the deleted locids 
     delete from a2box 
     where skuid = PSKUID 
    returning locid 
     bulk collect into t_locid 
      ; 

    for i in t_locid.first .. t_locid.last loop 
     update a2loc 
     set locqty = locqty - 1 
     where locid = t_locid(i) 
      ; 
    end loop; 

end remove_boxes; 
/

這是可能的,你可以改變for .. loopforall但我以前從來沒有做到這一點,並不能找到確認就可以了。如果這是可能的話,應該是這樣的:

forall i in t_locid.first .. t_locid.last 
    update a2loc 
     set locqty = locqty - 1 
    where locid = t_locid(i) 
      ; 

正如Tom Kyte suggests我會強烈建議索引外鍵;在這種情況下,它肯定會更好。

+0

不需要使用行處理,兩個語句 - 一個更新後跟一個刪除 - 就像在下面的其他答案中一樣,這樣做會很好,並且也會提高性能。 –

+0

我嘗試過自己,想出了這個。我還沒有測試過。 – wali

+0

當然@colin,我提供了一個替代方案...(當前)upvoted的答案確實做了一個不必要的索引範圍掃描...(假設列被索引)。 – Ben

0
create or replace procedure A2DeleteSKU 
(
pskuid IN number 
) 
AS 
CURSOR row_cursor IS 
     SELECT boxid,locid from A2BOX where skuid = pskuid; 
skuid_count Number; 
skuid_check exception; 

sku_rec row_cursor%rowtype; 

Begin 
select count(*) into skuid_count from A2SKU where skuid = pskuid; 
if skuid_count <1 then 
raise skuid_check; 
End If; 

FOR sku_rec in row_cursor 

LOOP 
    delete from a2box where boxid = sku_rec.boxid; 
    update A2LOC set locqty = locqty -1 where locid = sku_rec.locid; 
END LOOP; 

    delete from A2SKU where skuid =pskuid; 
    commit; 
Exception 
When skuid_check then 
    RAISE_APPLICATION_ERROR(-20014, 'Delete Box failed. Boxid does not exist: '||TO_CHAR(pskuid)); 
When others then 
raise; 
End A2DeleteSku; 
+0

呃,一個程序內的'commit'。如果你把它稱爲一個更大的交易呢? –

+0

@DReispt,在程序內部沒有任何內在錯誤。就像你說的那樣,你必須知道你在哪裏叫... – Ben

相關問題