当我尝试 运行 时收到 "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。
我要回答的整个问题是:
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。