我对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 :(得分:0)
我不确定这是 问题,但至少对于BEFORE INSERT
触发器,OLD:
null 。您应该使用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