2014-10-02 141 views
1

我尝试创建一个触发器,以获取购买价格(preco_custo),当购买价格为购买(E)并获得销售价格(preco_venda)时(S)。但无论它是什么类型,它都会获得购买价格。有人可以向我解释为什么这不起作用吗?Oracle触发器得到错误的值,我做错了什么?

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; 
/

如何修复这个触发器后,我使用函数返回的值?

+0

我看不到你想要做的和触发器中的代码之间的关系。你为什么要算'rownum'?两张桌子之间有什么关系?你为什么要运行两个查询,而不是一起加入表格? – 2014-10-02 23:56:08

+0

一张桌子是注册产品,另一张是注册销售/采购... – 2014-10-03 01:03:54

回答

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; 

我很惊讶触发的原始​​版本没有抛出ORA-04091当选择对旧金山。 MOVIMENTICAO被执行。

分享和享受。