Oracle Trigger获取了错误的值,我做错了什么?

时间:2014-10-02 23:29:11

标签: sql oracle function triggers

当动画的类型是购买(E)时,我试图创建一个触发器以获得购买价格(preco_custo),并在销售时获得销售价格(preco_venda)(S)。但它正在获得购买价格,无论它是什么类型。有人可以向我解释为什么这不起作用吗?

CREATE OR REPLACE TRIGGER P_CUSTO
BEFORE INSERT ON FRANCISCO.MOVIMENTACAO
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
DECLARE
   V_COUNT      PLS_INTEGER                := NULL;
   V_TIPO       FRANCISCO.MOVIMENTACAO.TIPO%TYPE      := NULL;
   V_PCUSTO     FRANCISCO.PRODUTOS.PRECO_CUSTO%TYPE   := NULL;
   V_PVENDA     FRANCISCO.PRODUTOS.PRECO_VENDA%TYPE   := NULL;
BEGIN
   SELECT COUNT(ROWNUM), NVL(MAX(TIPO),'E')
   INTO V_COUNT, V_TIPO
   FROM FRANCISCO.MOVIMENTACAO
   WHERE ID = :New.ID;

   SELECT COUNT(ROWNUM), NVL(MAX(PRECO_CUSTO),0), NVL(MAX(PRECO_VENDA),0)
   INTO V_COUNT, V_PCUSTO, V_PVENDA
   FROM FRANCISCO.PRODUTOS
   WHERE ID = :New.ID_PRODUTO;

   IF UPPER(V_TIPO) = 'E' THEN
     :New.CUSTO_UNITARIO := V_PCUSTO;
   ELSE 
      :New.CUSTO_UNITARIO := V_PVENDA;
   END IF; 
END;
/

在修复此触发器后,我如何使用函数中返回的值?

1 个答案:

答案 0 :(得分:2)

尝试使用触发器中可用的NEW值,如下所示:

CREATE OR REPLACE TRIGGER P_CUSTO
   BEFORE INSERT ON FRANCISCO.MOVIMENTACAO
   REFERENCING OLD AS OLD NEW AS NEW
   FOR EACH ROW
DECLARE
   V_COUNT      PLS_INTEGER                           := NULL;
   V_PCUSTO     FRANCISCO.PRODUTOS.PRECO_CUSTO%TYPE   := NULL;
   V_PVENDA     FRANCISCO.PRODUTOS.PRECO_VENDA%TYPE   := NULL;
BEGIN
   SELECT COUNT(ROWNUM), NVL(MAX(PRECO_CUSTO),0), NVL(MAX(PRECO_VENDA),0)
   INTO V_COUNT, V_PCUSTO, V_PVENDA
   FROM FRANCISCO.PRODUTOS
   WHERE ID = :New.ID_PRODUTO;

   IF UPPER(:NEW.TIPO) = 'E' THEN
      :New.CUSTO_UNITARIO := V_PCUSTO;
   ELSE 
      :New.CUSTO_UNITARIO := V_PVENDA;
   END IF; 
END;

我很惊讶触发器的原始版本在执行SELECT对FRANCISCO.MOVIMENTICAO时没有抛出ORA-04091。

分享并享受。