PL / SQL:错误ORA-06512在触发器中

时间:2015-10-26 08:58:09

标签: sql oracle plsql dynamic-sql execute-immediate

我正在尝试在PL / SQL中执行触发器。此触发器必须在表上插入数据。表格名称来自" ref_equip "数据。

想象一下,我有100个传感器。来自传感器的数据全部发送到表格" ev_48H",对于每个传感器,我都有一个名为" EVV _" +传感器参考的表。

我正在尝试使用动态sql执行此触发器。我知道执行立即执行并不是最好的想法,但我想用这个概念变得更好。

create or replace
TRIGGER "SIVO"."NEWtrigger3EV_48H"
BEFORE INSERT
ON SIVO.EV_48H
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
declare
  v_Ref_Var VARCHAR2(15 BYTE);
  v_Clef_Var number(4,0);
  v_Ref_Equip varchar2(15 BYTE);
  v_Clef_Equip NUMBER(4,0);
  v_Ev_DATEAUTO DATE;
  v_Ev_ValeurAuto NUMBER(16,8);
  v_Table_Name VARCHAR2(50 BYTE);
begin
  V_Ref_Var := :New.Ref_Var;  
SELECT Clef_Var, Clef_Equip
INTO v_Clef_Var, v_Clef_Equip  
FROM SIVO.C_Variable
WHERE Ref_Var = v_Ref_Var;         
if v_clef_var is not null and v_Clef_Equip is not null then 
  SELECT Ref_Equip  
  INTO v_Ref_Equip 
  FROM SIVO.C_Equip
  WHERE Clef_Equip = v_Clef_Equip;  
  :new.EV_DateAuto := to_date(:New.EV_DATE || ' ' || :New.EV_HEURE, 'DD/MM/YY HH24:MI:SS');   
  v_EV_ValeurAuto := :New.EV_Valeur;      
  v_Table_Name := 'sivo.EVV_'||v_Ref_Equip;      
  execute immediate 'insert into ' ||v_Table_Name||'
    values ( '||v_Clef_Var||', '||:new.EV_DateAuto||', '||v_EV_ValeurAuto||');';       
else    
  INSERT INTO SIVO.EV_48H_VAR_INCONNUES (REF_VAR, EV_DATE, EV_HEURE, EV_VALEUR)
  VALUES (v_Clef_Var, :New.Ev_Date, :New.Ev_HEURE, :New.Ev_VALEUR);  
end if;
end;

这是我的问题:当我在 EV_48H 上添加数据时,我有一个错误ORA-00936:缺少术语,第2行(?)和错误ORA-06512第24行(在执行立即执行之前的选择中)。我看到错误06512通常是由于另一个错误。但我不知道它可能在哪里。

谢谢你能否帮助我发现这个错误,或者告诉我我的触发器有什么问题。

1 个答案:

答案 0 :(得分:1)

日期字段的插入可能会导致您的问题,因为它在将它放入insert语句时会隐式地将其强制转换为字符串,此时它至少应该有引号。你串起来,如果你按原样记录它,看起来会像:

insert into sometable
    values ( 2, 2015.10.26, 3.4);

当你需要的是

insert into sometable
    values ( 2, to_Date('2015/10/26','yyyy/mm/dd'), 3.4);

所以将字符串生成器更改为:

execute immediate 'insert into ' ||v_Table_Name||'
    values ( '||v_Clef_Var||', to_char('''||to_char(:new.EV_DateAuto,'yyyy/mm/dd')||''',''yyyy/mm/dd''), '||v_EV_ValeurAuto||');';   

显然,您可以使用不同的日期/时间格式作为您的风格,以及您是否需要时间部分。

除非您能100%保证所有目标表都是按照完全正确的顺序创建的,否则我强烈建议您在字段名称中添加。