Oracle 我刚刚在plsql中创建了这个触发器

Oracle 我刚刚在plsql中创建了这个触发器,oracle,plsql,Oracle,Plsql,代码如下: create or replace TRIGGER tupdate_hist_station AFTER INSERT ON STATION FOR EACH ROW DECLARE V_num_station STATION.NUM_STATION%type; V_nb_reserve CLIENTS.NB_RESERV%type; V_revenue number; BEGIN SELECT s.NUM_STATION INTO v_n

代码如下:

create or replace TRIGGER tupdate_hist_station
AFTER INSERT ON STATION
FOR EACH ROW
DECLARE
    V_num_station STATION.NUM_STATION%type;
    V_nb_reserve CLIENTS.NB_RESERV%type;
    V_revenue number;

    BEGIN

    SELECT s.NUM_STATION INTO v_num_station
    FROM STATION s
    WHERE s.NUM_STATION =: NEW.NUM_STATION;

    EXCEPTION
    WHEN no_data_found THEN
    DBMS_OUTPUT.PUT_LINE("There is no new data added");
    END;

    BEGIN

    SELECT sum(c.NB_RESERV) INTO V_nb_reserve 
    FROM CLIENTS c, RESERVATION r, CHAMBRE ch, HOTEL h, STATION s
    WHERE c.NUMC = r.NUMC AND r.IDCHAMBRE = ch.IDCHAMBRE AND ch.NUM_HOTEL = h.NUM_HOTEL
    AND h.NUM_STATION = s.NUM_STATION AND s.NUM_STATION = v_num_station;

    EXCEPTION
    WHEN no_data_found THEN V_nb_reserve:=0;    
    DBMS_OUTPUT.put_line("There is no reservation in a hotel in this station yet");
    END;

    BEGIN

    SELECT SUM(p.MONTANT) INTO V_revenue 
    FROM PAYEMENT p, CLIENTS c, RESERVATION r, CHAMBRE ch, HOTEL h, STATION s
    where p.NUMC = c.NUMC 
    AND c.NUMC = r.NUMC
    AND r.IDCHAMBRE = ch.IDCHAMBRE
    AND ch.NUM_HOTEL = h.NUM_HOTEL
    and h.NUM_STATION = s.NUM_STATION AND s.NUM_STATION = v_num_station;    

    EXCEPTION
    WHEN no_data_found THEN
    V_revenue := 0;
    DBMS_OUTPUT.put_line("There is no reservation in this station yet");    
    END;

    INSERT INTO HIST_STATION("NUM_STATION","ANNEE","NB_RESERV","REVENU") VALUES (V_num_station,(SELECT to_char(SYSDATE,'YYYY')FROM DUAL),V_nb_reserve,V_revenue);

END;

SHOW ERRORS;
在桩号表中插入值时,会出现以下错误:

插入DANIEL.STATION NUM_STATION、NOM_STATION、海拔、区域值“6”、“Baalbak”、“1250”、“Baalbak”

ORA-04098:触发器“DANIEL.TUPDATE\u HIST\u STATION”无效,重新验证失败

ORA-06512:在第1行

将更改保存到表DANIEL.STATION时出错:

第6行:ORA-04098:触发器“DANIEL.TUPDATE\u HIST\u STATION”无效,重新验证失败

ORA-06512:在第1行


与其他人指出的在历史站插入新行不同,这里存在各种错误。然而,最大的问题是,将数据插入HIST_站的代码不是触发器的一部分——它只是在太空中的某个地方徘徊

当我开始调整代码的缩进以了解发生了什么时,我得到了以下结果:

create or replace TRIGGER tupdate_hist_station
  AFTER INSERT ON STATION
  FOR EACH ROW
DECLARE
  V_num_station STATION.NUM_STATION%type;
  V_nb_reserve  CLIENTS.NB_RESERV%type;
  V_revenue     number;
BEGIN
    SELECT s.NUM_STATION
      INTO v_num_station
      FROM STATION s
      WHERE s.NUM_STATION =: NEW.NUM_STATION;
EXCEPTION
  WHEN no_data_found THEN
    DBMS_OUTPUT.PUT_LINE("There is no new data added");
END;
你的扳机结束了,就在那里,在第一次结束之后。所有其他代码都…消失了

我想你想要的是:

create or replace TRIGGER tupdate_hist_station
  AFTER INSERT ON STATION
  FOR EACH ROW
DECLARE
  V_num_station STATION.NUM_STATION%type;
  V_nb_reserve  CLIENTS.NB_RESERV%type;
  V_revenue     number;
BEGIN
  BEGIN
    SELECT s.NUM_STATION
      INTO v_num_station
      FROM STATION s
      WHERE s.NUM_STATION = :NEW.NUM_STATION;
  EXCEPTION
    WHEN no_data_found THEN
      DBMS_OUTPUT.PUT_LINE("There is no new data added");
  END;

  BEGIN
    SELECT sum(c.NB_RESERV)
      INTO V_nb_reserve 
      FROM CLIENTS c,
           RESERVATION r,
           CHAMBRE ch,
           HOTEL h,
           STATION s
      WHERE c.NUMC = r.NUMC AND
            r.IDCHAMBRE = ch.IDCHAMBRE AND
            ch.NUM_HOTEL = h.NUM_HOTEL AND
            h.NUM_STATION = s.NUM_STATION AND
            s.NUM_STATION = v_num_station;
  EXCEPTION
    WHEN no_data_found THEN
      V_nb_reserve:=0;    
      DBMS_OUTPUT.put_line("There is no reservation in a hotel in this station yet");
  END;

  BEGIN
    SELECT SUM(p.MONTANT) INTO V_revenue 
      FROM PAYEMENT p,
           CLIENTS c,
           RESERVATION r,
           CHAMBRE ch,
           HOTEL h,
           STATION s
      where p.NUMC = c.NUMC AND
            c.NUMC = r.NUMC AND
            r.IDCHAMBRE = ch.IDCHAMBRE AND
            ch.NUM_HOTEL = h.NUM_HOTEL and
            h.NUM_STATION = s.NUM_STATION AND
            s.NUM_STATION = v_num_station;    
  EXCEPTION
    WHEN no_data_found THEN
      V_revenue := 0;
      DBMS_OUTPUT.put_line("There is no reservation in this station yet");    
  END;

  INSERT INTO HIST_STATION
    ("NUM_STATION","ANNEE","NB_RESERV","REVENU")
  VALUES
    (V_num_station,(SELECT to_char(SYSDATE,'YYYY')FROM DUAL),V_nb_reserve,V_revenue);
END tupdate_hist_station;
/
SHOW ERRORS;
/

祝您好运。

您的触发器最初没有正确编译,因此无法执行。检查编译错误:从用户错误中选择*,其中类型='TRIGGER',名称='TUPDATE\u HIST\u STATION';节目错误怎么说?如果它运行,也就是说,在结尾处是否有斜杠;?虽然块结构看起来不太好,但您可能需要查看它。你可能只想在你现在拥有的第一个开始之前再开始一个,但它看起来还是有点奇怪。s.NUM_STATION=:NEW.NUM_STATION-冒号似乎有点偏离,想要回到新的位置。似乎您还错过了一个开始,第一个开始,因为其他开始似乎属于子块。如果您使用子块的缩进会更容易发现。如果您正在使用的开发工具不清楚突出编译错误,那么您应该考虑切换到不同的工具。好工作鲍伯。这是正确布局重要性的另一个例子。这不仅仅是盲目遵守标准,它还是一个有用的诊断工具。可读性是一个特性。引用一下,程序必须是为人们阅读而编写的,只是顺便说一句,为机器执行而编写。我最近不得不修改一些工作中的代码,可能除了原作者,所有人都在修改这些代码。原作者已经离开很久了,很少有人对这些代码感到惋惜,因为看过这些代码的人都在抱怨。diff的输出现在看起来像cat的输出,但是,Perlis说,没有人会抱怨再弄清楚有多么困难-