从触发器

时间:2016-04-03 03:51:15

标签: sql oracle plsql

在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;我应该使用不超过一个触发器。

1 个答案:

答案 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