在Oracle环境中(我使用的是SQLPLUS)。我的问题是如何更改新插入的元组的数据。 这是一个例子:我需要确保每当插入一个表&#34; Orders&#34;,如果它的属性&#34; weight&#34;大于100,它的另一个属性&#34; size_level&#34;必须为1.否则(权重<= 100),size_level必须为0。 为此,我想我需要调用存储过程。
CREATE OR REPLACE TRIGGER new_ship_trigger
AFTER INSERT ON Orders
FOR EACH ROW
BEGIN ATOMIC
CALL UpdateShipSizeLevel(:new)
END;
/
我应该如何编写存储过程部分的代码?或许我需要一个光标? 我不需要在表格中添加约束&#34;订单&#34;我应该使用不超过一个触发器。
答案 0 :(得分: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