使用 oracle 触发器更新第二个 table 条件
Using oracle triggers to update a second table where a condition has been
我是 pl/sql 的新手,正在努力应对触发器。我需要为此代码使用触发器。我有 2 个 tables,job (job_id, job_name, job_price) 和 job_history (job_id, oldprice, datechanged)。我正在尝试创建一个触发器,当作业 table 中的 job_price 字段更新时,如果不存在行,则将旧作业详细信息添加到 job_history table或者如果该职位 ID 的新职位价格高于 job_history table 中该职位 ID 的任何先前存储价格。作业 table 中的作业 ID 字段不能重复,但 job_history table 中的作业 ID 字段可以重复。此外,如果不满足条件,即新的作业价格低于该作业 id 之前存储的所有价格,则应捕获错误。
我试过这个代码:
CREATE OR REPLACE TRIGGER conditional_update_job_hist
AFTER UPDATE OF jbsprice ON job
FOR EACH ROW
WHEN (new.jbsprice)<min(old.jbsprice);
BEGIN
INSERT INTO job_history (jbsid, oldprice) VALUES (:old.jbsid,:old.jbsprice);
IF :new.price is<>min(oldprice) THEN
RAISE_APPLICATION_ERROR('Condition not met.');
ENDIF;
END;
/
这导致第 4 行出现错误
ORA-00920: 无效的关系运算符。
我查看了 oracle 联机文档。这很混乱。我是否需要在触发器内使用游标和循环?小于运算符看起来不错,而 min(function) 看起来不错。我看不出哪里出错了。请帮忙
乍一看,我建议如下:
CREATE OR REPLACE TRIGGER conditional_update_job_hist
AFTER UPDATE OF jbsprice ON job
FOR EACH ROW
DECLARE
hist_exists number;
BEGIN
hist_exists := 0;
begin
-- select 1 if there is an entry in job_history of that jbsid
-- and an oldprice exists which is more than new jbsprice
select distinct 1
into hist_exists
from job_history
where jbsid = :old.jbsid
and oldprice > :new.jbsprice;
exception when no_data_found then hist_exists := 0;
end;
IF hist_exists = 0 then
INSERT INTO job_history (jbsid, oldprice) VALUES (:old.jbsid,:old.jbsprice);
END IF;
END;
/
忽略:
CREATE OR REPLACE TRIGGER conditional_update_job_hist
AFTER UPDATE OF jbsprice ON job
FOR EACH ROW
WHEN (:new.jbsprice)<min(:old.jbsprice);
BEGIN
INSERT INTO job_history (jbsid, oldprice) VALUES (:old.jbsid,:old.jbsprice);
IF :new.price is<>min(oldprice) THEN
RAISE_APPLICATION_ERROR('Condition not met.');
ENDIF;
END;
我是 pl/sql 的新手,正在努力应对触发器。我需要为此代码使用触发器。我有 2 个 tables,job (job_id, job_name, job_price) 和 job_history (job_id, oldprice, datechanged)。我正在尝试创建一个触发器,当作业 table 中的 job_price 字段更新时,如果不存在行,则将旧作业详细信息添加到 job_history table或者如果该职位 ID 的新职位价格高于 job_history table 中该职位 ID 的任何先前存储价格。作业 table 中的作业 ID 字段不能重复,但 job_history table 中的作业 ID 字段可以重复。此外,如果不满足条件,即新的作业价格低于该作业 id 之前存储的所有价格,则应捕获错误。
我试过这个代码:
CREATE OR REPLACE TRIGGER conditional_update_job_hist
AFTER UPDATE OF jbsprice ON job
FOR EACH ROW
WHEN (new.jbsprice)<min(old.jbsprice);
BEGIN
INSERT INTO job_history (jbsid, oldprice) VALUES (:old.jbsid,:old.jbsprice);
IF :new.price is<>min(oldprice) THEN
RAISE_APPLICATION_ERROR('Condition not met.');
ENDIF;
END;
/
这导致第 4 行出现错误 ORA-00920: 无效的关系运算符。
我查看了 oracle 联机文档。这很混乱。我是否需要在触发器内使用游标和循环?小于运算符看起来不错,而 min(function) 看起来不错。我看不出哪里出错了。请帮忙
乍一看,我建议如下:
CREATE OR REPLACE TRIGGER conditional_update_job_hist
AFTER UPDATE OF jbsprice ON job
FOR EACH ROW
DECLARE
hist_exists number;
BEGIN
hist_exists := 0;
begin
-- select 1 if there is an entry in job_history of that jbsid
-- and an oldprice exists which is more than new jbsprice
select distinct 1
into hist_exists
from job_history
where jbsid = :old.jbsid
and oldprice > :new.jbsprice;
exception when no_data_found then hist_exists := 0;
end;
IF hist_exists = 0 then
INSERT INTO job_history (jbsid, oldprice) VALUES (:old.jbsid,:old.jbsprice);
END IF;
END;
/
忽略:
CREATE OR REPLACE TRIGGER conditional_update_job_hist
AFTER UPDATE OF jbsprice ON job
FOR EACH ROW
WHEN (:new.jbsprice)<min(:old.jbsprice);
BEGIN
INSERT INTO job_history (jbsid, oldprice) VALUES (:old.jbsid,:old.jbsprice);
IF :new.price is<>min(oldprice) THEN
RAISE_APPLICATION_ERROR('Condition not met.');
ENDIF;
END;