在表

时间:2015-10-14 13:00:28

标签: sql oracle plsql triggers

我是pl / sql的新手。我正在尝试创建一个在特定表中插入数据的触发器。 我有数据在我的桌子EV_48h上实时到达。要知道我必须在哪个表上插入数据,我必须知道它Ref_equip(Ref_equip在另一个名为C_Equip的表上)。 我已经迅速做出了这一点,以便更容易理解: merise

正如我所说,我有数据在EV_48H表上实时到达,我必须自动将它们放在名为'EVV _'+ Ref_equip的表中。

所以,这是我的代码。我没有任何错误,但它不起作用。我知道我错过了遗忘,但我不知道是什么。

TRIGGER "SIVO"."NEWtrigger3EV_48H"
BEFORE INSERT
ON SIVO.EV_48H
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW

declare
clef_var number(4,0);
ref_equip varchar2(40);
V_Nom_table varchar2(1000) ;
V_nom_seq Varchar2(2000) ;
stmt varchar2(200);

begin
SELECT clef_var
INTO :New.Clef_Var
FROM sivo.c_variable
WHERE Ref_Var= :new.Ref_Var; 
  -- Conversion des formats Date-Heure en DateHeure oracle
  :New.EV_DATEAUTO := to_date(:New.EV_DATE || ' ' || :New.EV_HEURE, 'DD/MM/YY HH24:MI:SS');   
  stmt:='begin select clef_var into :New.Clef_Var From sivo.C_variable; end';
  EXECUTE IMMEDIATE stmt using out clef_var; 

  IF clef_var is not null then

    stmt :='begin select Ref_equip into :New.Ref_Equip FROM sivo.C_Equip WHERE Ref_var= :New.Ref_Var; end';
    EXECUTE IMMEDIATE Stmt USING OUT Ref_Equip;
    V_nom_table := 'EVV_'||Ref_Equip;
    stmt :='insert into' ||V_nom_table || '(:New.Clef_Var, :New.Ev_DateAuto, :New.Ev_Valeur )';
    EXECUTE IMMEDIATE stmt USING Ref_Equip; 

  ELSE
  INSERT INTO SIVO.EV_48H_VAR_INCONNUES (REF_VAR, EV_DATE, EV_HEURE, EV_VALEUR)
  VALUES ( :New.REF_VAR, :New.EV_DATE, :New.EV_HEURE, :New.EV_VALEUR);

  end if;
END;

如果有人可以帮助我或让我走上正确的道路。我不知道我是否提供了所有信息,所以告诉我,如果我错过了什么。 谢谢

1 个答案:

答案 0 :(得分:0)

在执行立即执行中,您在END之后缺少语句指示符冒号结束 这应该是

begin select clef_var into :New.Clef_Var From sivo.C_variable; end;

但是您应该注意其他设计选择:

  • 使用execute immediate是很方便的,但如果你不必使用它,你就不应该这样做。如果只返回一个值,则可以通过游标甚至简单的select语句完成工作。事实上,你似乎做了两次工作。首先插入:new.clef_var,然后使用execute immediate再次执行相同的操作。尝试注释掉即时执行。
  • 使用execute immediate,任何错误都难以跟踪
  • 使用触发器意味着实时数据源无法在触发器完成之前结束事务。为什么不每分钟运行一个预定的工作来检查新数据并进行处理呢?这将事务分为两部分:数据输入和数据处理
  • 是否有您的流程需要捕获的记录更新?