【问题标题】:ORA-00984 on an after update pl/sql triggerORA-00984 在更新后 pl/sql 触发器上
【发布时间】:2013-06-17 02:08:48
【问题描述】:

我已经和这个触发器斗争了一段时间,我试图将旧股票,新股票发送到表“MOVIMIENTO”,它们之间的区别以及它是什么类型的操作,唯一的问题是我在第 12 行得到 ORA-00984 错误,在第 11 行忽略 sql 语句,有什么想法吗?

CREATE OR REPLACE TRIGGER TRG_MOVIMIENTO
AFTER UPDATE OF "STOCK" ON PRODUCTO
FOR EACH ROW
DECLARE  
 v_tmov VARCHAR2(7);
 v_cant NUMBER(6);
BEGIN
  v_cant:=:OLD.STOCK-:NEW.STOCK;
  IF :OLD.STOCK>:NEW.STOCK THEN
     v_tmov:='SALIDA';
  ELSE 
     v_tmov:='ENTRADA';
  END IF;
  INSERT INTO MOVIMIENTO(N_MOV,TIPO_MOV,STOCK_NEW,STOCK_OLD,CANT_MOV)
  VALUES(s_NUMEROMOV.nextval,v_tmod,:NEW.STOCK,:OLD.STOCK,v_cant);
END; 
/

【问题讨论】:

    标签: plsql


    【解决方案1】:

    v_tmodMOVIMIENTO 表中的一列。因为没有那个名字的变量。这可以解释错误。

    编辑:好的,看看 cmets,我想我知道发生了什么。

    声明部分的变量是v_tmovv_cant。 但是在您的INSERT 声明中,您打错了字并使用了v_tmod。 Oracle 认为这不是一个已知变量,因此假定它必须是列名。所以它然后报告 ORA-00984 错误,甚至没有检查它是否是有效的列名。这是因为您不能在此处使用列。

    所以真正的错误是v_tmod is not a defined variable

    【讨论】:

    • 不,不是,变量v_tmod 保存将插入到列TIPO_MOV 上的值,它的格式也与TIPO_MOV 相同。
    • @OmarAlfredoCantuariasSaleh v_tmod 在你的触发器中声明在哪里?
    • DECLARE 部分o.o
    • 不,你打错了。 v_tmov 在声明部分。我用完整的解释更新了我的答案
    • 做到了!非常感谢,我看不到结尾的字母有所不同
    猜你喜欢
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 2016-11-03
    相关资源
    最近更新 更多