大佬教程收集整理的这篇文章主要介绍了在什么条件下你需要规定 select into 以便触发器工作?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有两个 Cars 和 Trip 表。我需要创建一个触发器来验证售出的票数(来自 Trip 的 number_tickets)不超过汽车中的座位数(来自 Cars 的 number_sIDing)。 在触发器中,我获取数据以比较它们的值,在条件 number_tickets 中我属性为“:新”。以便它检查正在输入的新参数。
问题在于它显示错误
ORA-01422:提取提取返回的行数超过请求的行数。
问题:在什么情况下你需要规定 select into 才能让触发器工作?
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;
/
以上是大佬教程为你收集整理的在什么条件下你需要规定 select into 以便触发器工作?全部内容,希望文章能够帮你解决在什么条件下你需要规定 select into 以便触发器工作?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。