Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
触发器pl/sql在表上插入数据_Sql_Oracle_Plsql_Triggers - Fatal编程技术网

触发器pl/sql在表上插入数据

触发器pl/sql在表上插入数据,sql,oracle,plsql,triggers,Sql,Oracle,Plsql,Triggers,我是pl/sql方面的新手。我试图创建一个触发器,在特定的表中插入数据。 我的表上有实时的数据EV_48h。要知道我必须在哪个表中插入数据,我必须知道Ref_equip Ref_equip在另一个名为C_equip的表中。 我很快就把这一点说得更容易理解: 正如我所说,我有数据实时到达EV_48H表,我必须将它们自动放到名为“EVV_”+Ref_的表中 这是我的代码。我没有任何错误,但它不工作。我知道我错过了什么,忘记了什么,但我不知道是什么 TRIGGER "SIVO"."NEWtrigge

我是pl/sql方面的新手。我试图创建一个触发器,在特定的表中插入数据。 我的表上有实时的数据EV_48h。要知道我必须在哪个表中插入数据,我必须知道Ref_equip Ref_equip在另一个名为C_equip的表中。 我很快就把这一点说得更容易理解:

正如我所说,我有数据实时到达EV_48H表,我必须将它们自动放到名为“EVV_”+Ref_的表中

这是我的代码。我没有任何错误,但它不工作。我知道我错过了什么,忘记了什么,但我不知道是什么

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;
如果有人能帮助我或让我走上正确的道路。我不知道我是否提供了所有信息,所以如果我遗漏了什么,请告诉我。
谢谢

在您的“立即执行”中,您缺少语句结尾指示符冒号 这应该是

begin select clef_var into :New.Clef_Var From sivo.C_variable; end;
但是,您还应注意其他设计选择:

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