如何解决这些触发错误? Oracle 11g Express

时间:2018-11-01 08:22:26

标签: sql oracle triggers

代码:

create or replace trigger "ARTICULOSCAT_INSERT" AFTER insert on 
"ARTICULOSCAT" for each row BEGIN INSERT INTO
BITACORA (USUARIO,FECHA,TABLA_AFECTADA,ACCION_EFECTUADA,COLUMNAS,VALORES_ANT,VALORES_NUEVOS) 
VALUES(USER,SYSDATE,'ArticulosCat','Insert','I_ID_ARTICULO,V_DESCRIPCION_100,I_ID_UM,F_PRECIO,I_ID_IMPUESO',
CONCAT('I_ID_ARTICULO:  ',:OLD.I_ID_ARTICULO,',','V_DESCRIPCION_100:  ',:OLD.V_DESCRIPCION_100,',','I_ID_UM: ',:OLD.I_ID_UM,',','F_PRECIO: ',:OLD.F_PRECIO,',','I_ID_IMPUESTO: ',:OLD.I_ID_IMPUESTO),
CONCAT('I_ID_ARTICULO:  ',:NEW.I_ID_ARTICULO,',','V_DESCRIPCION_100:  ',:NEW.V_DESCRIPCION_100,',','I_ID_UM: ',:NEW.I_ID_UM,',','F_PRECIO: ',:NEW.F_PRECIO,',','I_ID_IMPUESTO: ',:NEW.I_ID_IMPUESTO) 
END;​
  

错误:

     

编译失败,第3行(02:17:30)与   编译错误与第一个BEGIN语句有关。这个   仅影响数据库触发器的编译。 PL / SQL:ORA-00909:   参数数目无效编译失败,第2行(02:17:30)   与编译错误相关的行号是相对于   第一个BEGIN语句。这只会影响数据库的编译   触发器。 PL / SQL:忽略SQL语句编译失败,第4行   (02:17:30)与编译错误相关的行号是   相对于第一个BEGIN语句。这只会影响   数据库触发器的编译。 PLS-00103:遇到符号   预期以下情况之一时为“文件结束” :(开始情况   如果循环mod为null,则声明goto的结束异常退出   返回选择更新,同时使用

1 个答案:

答案 0 :(得分:1)

问题出在您使用CONCAT函数上。如您所见,from the documentation仅接受两个参数。

您应该使用串联运算符||,因为它可以用来将许多不同的部分串在一起,并且,IMO,比一系列嵌套的CONCAT更容易阅读!

因此,触发器将类似于:

CREATE OR REPLACE TRIGGER articuloscat_insert
  AFTER INSERT ON articuloscat
  FOR EACH ROW
BEGIN
  INSERT INTO bitacora
    (usuario,
     fecha,
     tabla_afectada,
     accion_efectuada,
     columnas,
     valores_ant,
     valores_nuevos)
  VALUES
    (USER,
     SYSDATE,
     'ArticulosCat',
     'Insert',
     'I_ID_ARTICULO,V_DESCRIPCION_100,I_ID_UM,F_PRECIO,I_ID_IMPUESO',
     'I_ID_ARTICULO:  ' || :old.i_id_articulo || ',' || 'V_DESCRIPCION_100:  ' || :old.v_descripcion_100 || ',' || 'I_ID_UM: ' || :old.i_id_um || ',' || 'F_PRECIO: ' || :old.f_precio || ',' || 'I_ID_IMPUESTO: ' || :old.i_id_impuesto,
     'I_ID_ARTICULO:  ' || :new.i_id_articulo || ',' || 'V_DESCRIPCION_100:  ' || :new.v_descripcion_100 || ',' || 'I_ID_UM: ' || :new.i_id_um || ',' || 'F_PRECIO: ' || :new.f_precio || ',' || 'I_ID_IMPUESTO: ' || :new.i_id_impuesto);
END articuloscat_insert;
/

在插入的末尾,您还缺少分号(;),我已为您添加了分号。