2014-10-02 95 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被執行。

分享和享受。