为了使触发器工作,您需要在什么条件下指定select



我有两个Cars和Trip表。我需要创建一个触发器来验证售出的门票数量(来自Trip的number_tickets(是否超过汽车中的座位数量(来自Cars的number_siding(。在触发器中,我获取数据以比较它们的值,在条件number_tickets中,我将属性":new"从而检查正在输入的新参数。

问题是它显示错误

ORA-01422:提取提取返回的行数超过了请求的行数。

问题:为了使触发器工作,您需要在什么条件下指定select?

create table cars(
shifr_car     integer not null,
state_number  integer,
number_siding integer,
shifr_mark    integer,
shifr_driver  integer,
primary key(shifr_car)
);
create table trip(
shifr_trip     integer not null,
shifr_day      integer,
shifr_way      integer,
time_output    date,
shifr_car      integer,
number_tickets integer,
primary key(shifr_trip)
);

--外键shifr_car

alter table trip 
add(constraint shifr_car foreign key (shifr_car) references cars(shifr_car));

--触发器代码

create or replace trigger check_place
before insert or update on trip
for each row
declare
id_car trip.shifr_car%type;
numb_siding cars.number_siding%type;
number_tickets trip.number_tickets%type;
begin
select shifr_car into id_car from trip;
select number_siding into numb_siding from cars where shifr_car = id_car;
select number_tickets into number_tickets from trip;
if(:new.number_tickets > numb_siding) then
dbms_output.put_line( 'Проданных билетов больше, чем мест в автобусе');
end if;
end;

当前错误可能是由于三个Select语句中的任何一个引起的,并且当任何表具有多行时都会出现此错误。

通过删除for each row,应该使用语句级触发器而不是行级触发器。因为,只需要比较一下这些表中的总数。此外,您可以获得当前情况下的突变触发错误。因此,考虑使用以下代码来重新创建触发

CREATE OR REPLACE TRIGGER check_place
BEFORE INSERT OR UPDATE ON trip
DECLARE
numb_siding    INT;
number_tickets INT;
BEGIN
SELECT COUNT(number_siding) INTO numb_siding FROM cars;
SELECT COUNT(number_tickets) INTO number_tickets FROM trip;

IF number_tickets > numb_siding THEN
DBMS_OUTPUT.PUT_LINE('Проданных билетов больше, чем мест в автобусе');
END IF;
END;
/

最新更新