2016-04-03 71 views
0

在Oracle環境(我使用的SQLPLUS)中。我的問題是如何改變新插入的元組的數據。 這裏是一個例子:我需要確保插入發生在表「訂單」,如果它的屬性「weight」大於100,它的另一個屬性「size_level」必須是1.否則(重量< = 100), size_level必須爲0. 爲了做到這一點,我想我需要調用一個存儲過程。從觸發器調用的SQL過程

CREATE OR REPLACE TRIGGER new_ship_trigger 
AFTER INSERT ON Orders 
FOR EACH ROW 
BEGIN ATOMIC 
    CALL UpdateShipSizeLevel(:new) 
END; 
/

我該如何編寫存儲過程部分的代碼?或者,也許我需要一個光標? 我需要不添加約束表「訂單」,我應該使用不超過一個觸發器。

+0

這是SQL正確,只是澄清... – Codexer

+0

@zaggler是的。 – tic30

+5

1)通常你可以做一個'BEFORE INSERT'觸發器,它可以用來修改或添加值,然後他們擊中表。 2)另外,'size_level'是_derived_信息,通常不應該存儲(如果可以避免的話)。您可能只能將其定義爲視圖的一部分。否則,如果您需要性能,請考慮計算列。 –

回答

1

在這裏您可以找到另一個Oracle觸發器示例。另外請務必閱讀例如PL/SQL Triggers

create table so54b (
id number 
,weight number 
,weight_level number 
); 

create or replace trigger so54b_trg 
-- note the trigger is also run in update 
before insert or update on so54b 
for each row 
begin 
    -- you don't need to implement the trigger logic in a separate 
    -- subroutine. however sometimes it might make sense. 
    :new.weight_level := 
    case 
     when :new.weight > 100 then 1 
     else 0 
    end; 
end; 
/
show errors 

insert into so54b(id, weight) values (1, 99); 
insert into so54b(id, weight) values (2, 100); 
-- weight_level is overwritten by the trigger 
insert into so54b(id, weight, weight_level) values (3, 101, 13); 

select * from so54b order by id; 

     ID  WEIGHT WEIGHT_LEVEL 
---------- ---------- ------------ 
     1  99    0 
     2  100    0 
     3  101    1 


update so54b set weight = 80 where weight > 100; 

select * from so54b order by id; 

     ID  WEIGHT WEIGHT_LEVEL 
---------- ---------- ------------ 
     1   99   0 
     2  100   0 
     3   80   0 
+0

謝謝。有用。我應該用之前而不是之後。 – tic30