当我尝试 运行 时收到 "invalid NEW or OLD specification" 消息

Getting "invalid NEW or OLD specification" message when I try to run this

我要回答的整个问题是:

Utilize the travel anywhere database to create a database trigger "hotel_kids_rule" to enforce a business rule. when inserting a hotel_reservation, if the num_kids value is more than zero, then assign the bed_type DQ to the reservation. save the trigger source as a script file.

例如,触发器将为以下插入语句更改 bed_type。

insert into hotel_reservation (reserve_no,reserve_date,arrival_date,dep_date,num_adults,num_kids,customer_id,hotel_id,bed_type,rooms)
values(hotel_reserve_sequence.nextval,sysdate,sysdate+5,sysdate+7,1,2,101,19,'DT',1);

例如,触发器不会更改以下插入语句的 bed_type。

insert into hotel_reservation (reserve_no,reserve_date,arrival_date,dep_date,num_adults,num_kids,customer_id,hotel_id,bed_type,rooms)
values(hotel_reserve_sequence.nextval,sysdate,sysdate+5,sysdate+7,2,0,102,20,'DT',1);

这是我目前拥有的:

  create or replace trigger hotel_kids_rule
        after insert or update on hotel_reservation 
        for each row
        when (num_kids > 0)
    declare
       new_bed_type varchar2(20);
       new_bed_type='DQ'
    begin
        new.bed_type=new_bed_type;
    end;

如有任何帮助,我们将不胜感激!谢谢!

变量的赋值需要在实际的代码块中。 assignment operator 是 PL/SQL 中的 :=,而不是 =。如果您希望触发器更改任何内容,您还需要将其创建为 BEFORE 触发器:

create or replace trigger hotel_kids_rule
    before insert or update on hotel_reservation 
    for each row
    when (new.num_kids > 0)
declare
  new_bed_type varchar2(20);
begin
  new_bed_type := 'DQ';
  :new.bed_type := new_bed_type;
end;

注意when条件中的new记录没有使用冒号:,而在代码块中需要引用with 冒号。

或者 initialize the variable 声明时:

declare
  new_bed_type varchar2(20) := 'DQ';
begin
  :new.bed_type := new_bed_type;
end;

或者更简单,没有任何中间变量。

begin
  :new.bed_type := 'DQ';
end;

我想你想要一个 before 触发器,这样你就可以在写入新值之前设置它。此外,您访问 new 的方式不正确:在触发代码中,您需要 :new.bed_type;在 when 条件下,您需要 new.num_kids.

这应该有效:

create or replace trigger hotel_kids_rule
    before insert or update on hotel_reservation 
    for each row
    when (new.num_kids > 0)
begin
    :new.bed_type := 'DQ';
end;
/

Here是一个小demo。