我正在尝试在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通常是由于另一个错误。但我不知道它可能在哪里。
谢谢你能否帮助我发现这个错误,或者告诉我我的触发器有什么问题。
答案 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%保证所有目标表都是按照完全正确的顺序创建的,否则我强烈建议您在字段名称中添加。