如何在触发器中使用引用?

时间:2014-12-12 16:33:27

标签: sql database plsql reference oracle9i

我对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'

非常感谢!

1 个答案:

答案 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