程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在什么条件下你需要规定 select into 以便触发器工作?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决在什么条件下你需要规定 select into 以便触发器工作??

开发过程中遇到在什么条件下你需要规定 select into 以便触发器工作?的问题如何解决?下面主要结合日常开发的经验,给出你关于在什么条件下你需要规定 select into 以便触发器工作?的解决方法建议,希望对你解决在什么条件下你需要规定 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,请注明来意。
标签: