如何创建具有派生属性的触发器?

How I can create a trigger with a derived attribute?

我有一个音像店的数据库,为了问我暴露的问题,我想更新一个演员对应的年龄属性,但这没有意义(如下图所示)示例)

CREATE TABLE dobs ( dob date, age number(3));
insert into dobs values ((to_date('1999-10-04','yyyy-mm-dd')),NULL);

CREATE OR REPLACE FUNCTION get_age
(
    fnacimiento date
) 
return int 
is edad int;
begin
    select floor(months_between(sysdate,dob)/12) into edad
    from dobs
    where dob=fnacimiento;
    return edad;
end get_age;

CREATE OR REPLACE TRIGGER agec before INSERT OR UPDATE ON dobs
FOR EACH ROW
BEGIN
   :new.age := get_age(:new.dob);
END;

Trigger 将在 table 中插入或更新记录时触发一次,因此您将在执行 insert/update 时获得演员的年龄,而不是截至今天.

所以更好的解决方案是创建 view 而不是 trigger,如下所示:

Create or replace view dobs_vw
As
Select t.* floor(months_between(sysdate,t.dob)/12) as age_asof_today
  From your_table t

您不需要函数来更新该列。甚至不需要使用 SELECT 语句。只需将触发器重新排列为:

CREATE OR REPLACE TRIGGER agec BEFORE INSERT OR UPDATE ON dobs
FOR EACH ROW
BEGIN
   :new.age := floor(months_between(sysdate,:new.dob)/12);
END;