2014-12-12 6 views
0

У меня проблема с triggers. Прежде всего, у меня есть это:Как использовать ссылку в триггере?

Типы:

CREATE OR REPLACE TYPE Tipo_Lineaventa AS OBJECT 
(id NUMBER(5), 
cantidad NUMBER(5), 
precio_venta NUMBER(5,2), 
refProducto REF Tipo_Producto); 
/

CREATE OR REPLACE TYPE Tipo_Producto AS OBJECT 
(codigo NUMBER(5), 
modelo VARCHAR(15), 
precio NUMBER(5,2), 
stock_disp NUMBER(3), 
esSuministrado Tipo_esSuministrado 
) NOT FINAL; 
/

и столы:

CREATE TABLE Tabla_Lineaventa OF Tipo_Lineaventa 
(CONSTRAINT PK_Tabla_Lineaventa PRIMARY KEY (id), 
refProducto NOT NULL); 

CREATE TABLE Tabla_Producto OF Tipo_Producto 
(CONSTRAINT PK_Tabla_Producto PRIMARY KEY (codigo), 
    CONSTRAINT AK_Tabla_Producto UNIQUE(modelo)) 
NESTED TABLE esSuministrado STORE AS NT_esSuministrado; 

А теперь у меня есть этот trigger:

CREATE OR REPLACE TRIGGER checkQuantity 
BEFORE INSERT ON Tabla_Lineaventa 
FOR EACH ROW 
DECLARE 
    stock Tabla_Producto.stock_disp%TYPE; 
    cod Tabla_Producto.codigo%TYPE; 
    aux Tipo_Producto; 

BEGIN 
    SELECT DEREF(:OLD.refProducto).codigo INTO cod FROM dual; 

    SELECT stock_disp INTO stock FROM Tabla_Producto P WHERE P.codigo = cod; 

    IF stock > :OLD.cantidad THEN 
     DBMS_OUTPUT.PUT_LINE('OK') 
    ELSE 
     DBMS_OUTPUT.PUT_LINE('ERROR'); 
    END IF; 
END checkQuantity; 
/

С предложение SELECT DEREF(:OLD.refProducto).codigo INTO cod FROM dual; У меня проблема, потому что не вернуть мой продукт codigo атрибут что я ссылаюсь на refProducto.

Как его решить? Мне нужно знать, есть ли у меня достаточный запас для нового «Lineaventa».

Большое спасибо!

ответ

0

Я не уверен, что это вопрос, но, по крайней мере, для BEFORE INSERT триггера OLD: является нулевой. Вы должны использовать псевдо-запись NEW: для доступа к значению после вставки.

SELECT DEREF(:OLD.refProducto).codigo INTO cod FROM dual; 
--    ^^^^ 
--    here 

... 

    IF stock > :OLD.cantidad THEN 
--    ^^^^ 
--   and here 

См http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/triggers.htm#sthref784