如何创建具有派生属性的触发器?
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;
我有一个音像店的数据库,为了问我暴露的问题,我想更新一个演员对应的年龄属性,但这没有意义(如下图所示)示例)
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;