当动画的类型是购买(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;
/
在修复此触发器后,我如何使用函数中返回的值?
答案 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。
分享并享受。