【问题标题】:How to use trigger to track number from another table如何使用触发器跟踪另一个表中的数字
【发布时间】:2021-02-02 14:09:44
【问题描述】:

到目前为止我做了什么

create or replace trigger trigger_position
before insert or update of education
on JobApplication
for each row

begin

update education_tracker 
set total_application = total_application + 1
where JobApplication.education =  education_tracker.education_level;
end;

表格:

create table education_tracker( 
education_level varchar2(20), 
total_application number
);


create table JobApplication(
job_id number,
applicant_name varchar2(100),
address varchar2(120),
postcode varchar2(8),
email varchar2(30),
mobile varchar2(11),
marital varchar2(20),
education varchar2(20),
position varchar2(100)
);

我认为问题出在 where 语句中,但我不确定到底是什么问题

【问题讨论】:

  • 除了直接问题的技术答案之外,我建议不要尝试这样做 - 尝试通过简单地选择基数来不断更新可以/应该在查询时计算的计数器数据。这不是“是否”存储的计算与基础数据不同步的问题,而是“何时”的问题。
  • 出于好奇,将total_application 定义为视图中的计算列有什么问题?

标签: sql oracle oracle-sqldeveloper


【解决方案1】:

在 Oracle 中,触发器通常指的是 :NEW:OLD。在你的情况下,你似乎想要:

update education_tracker et
    set total_application = total_application + 1
    where et.education_level = :NEW.education;

注意事项:

  • 这假定total_application 的值已初始化或默认为0(或至少不是NULL
  • 对于update,这不会从旧值的先前总数中减去 1。您的代码没有这样做,但它看起来像一个错误。
  • 同样,此触发器不处理 delete,其中(可能)您也想调整值。

【讨论】:

    【解决方案2】:

    你需要使用NEW:

    create or replace trigger trigger_position
    before insert or update of education
    on JobApplication
    for each row
    
    begin
    
    update education_tracker 
    set total_application = total_application + 1
    where :NEW.education =  education_tracker.education_level;
    end;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多