2014-12-12 4 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 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; 
/

:

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이 문장 SELECT DEREF(:OLD.refProducto).codigo INTO cod FROM dual; 내 제품을 반품하지 않기 때문에 문제가 있습니다 codigo 속성 내가 refProducto을 참조하고있다.

어떻게 해결할 수 있습니까? 새로운 'Lineaventa'를 만들기에 충분한 재고가 있는지 알아야합니다.

고맙습니다.

답변