触发嵌套表oracle

时间:2017-12-02 21:01:33

标签: oracle oop

你好我想在嵌套表中创建一个触发器,以验证在进入作者时这不是18岁以下。但它不起作用 我试过这个。

SET SERVEROUTPUT ON
CREATE OR REPLACE TRIGGER CHEQ_EDAD_AUTOR4
BEFORE INSERT OR UPDATE ON libros
FOR EACH ROW
DECLARE
    ANIO_ACTUAL INT := TO_NUMBER(SYSDATE,'YYYY');

BEGIN
        DBMS_OUTPUT.PUT_LINE('año actual' || TO_CHAR(ANIO_ACTUAL) - 'año nacimiento' || TO_CHAR(:NEW.autor.nacimiento.anio) );

        IF  ( ANIO_ACTUAL - :NEW.autor.nacimiento.anio ) <18 THEN
            RAISE_APPLICATION_ERROR(-20001,'El autor debe ser mayor de 18 años.');
        END IF;
END;

但是当我创建触发器时,sql开发人员说

  

错误(4,9):PL / SQL:忽略语句错误(4,110):PLS-00302:   组件&#39; NACIMIENTO&#39;必须声明Error(6,9):PL / SQL:Statement   忽略错误(6,40):PLS-00302:组件&#39; NACIMIENTO&#39;一定是   声明

--Autor

CREATE TYPE nacimiento_type AS OBJECT(
    ciudad VARCHAR2(20),
    pais VARCHAR2(20),
    anio INT
)
/

CREATE TYPE autores_type AS OBJECT(
    id_autor NVARCHAR2(20),
    nombres nombres_type,
    nacimiento nacimiento_type
)
/


CREATE TYPE autores_tab AS TABLE OF autores_type;
/
--------------------------------------------------------------------------------

--Libro

CREATE TYPE libros_type AS OBJECT(
    id_libro INT,
    titulo NVARCHAR2(50),
    editorial NVARCHAR2(50),
    anio INT,
    area NVARCHAR2(50),
    autor autores_tab
)
/

CREATE TABLE libros OF libros_type(
    id_libro PRIMARY KEY
)NESTED TABLE autor STORE AS autores_nested;
/

插入的数据是:

    --Insertando libros

    INSERT INTO LIBROS VALUES (1,'Base de datos relacionales','Rama',2001,'Informática',autores_tab());
    INSERT INTO LIBROS VALUES (2,'Sistemas operativos: fundamentos básicos','Alfaomega',2009,'Informática',autores_tab());
    COMMIT;
    /
    --Insertando autores de libros

    INSERT INTO THE(
        SELECT L.autor
        FROM libros L
        WHERE L.id_libro = 1)
        VALUES (
            autores_type('564212',nombres_type('Amanda','Miller','f'),nacimiento_type('Alemania','Colonia',1978))
        );
    COMMIT;

>>>>>HERE SHOULD HAVE PROBLEMS BECAUSE THE AGE IS 2012 so is only 5 years old.

INSERT INTO THE(
    SELECT L.autor
    FROM libros L
    WHERE L.id_libro = 1)
    VALUES (
        autores_type('511111',nombres_type('miuu','dfgg','f'),nacimiento_type('arge','arge',2012))
    );
COMMIT;

1 个答案:

答案 0 :(得分:0)

Autor是表类型(不是单个对象):

CREATE OR REPLACE TRIGGER CHEQ_EDAD_AUTOR4
BEFORE INSERT OR UPDATE ON libros
FOR EACH ROW
DECLARE
    ANIO_ACTUAL INT := CAST(TO_CHAR(SYSDATE,'YYYY') AS INT);
BEGIN
   IF :NEW.autor IS NOT EMPTY THEN
        DBMS_OUTPUT.PUT_LINE('año actual' || TO_CHAR(ANIO_ACTUAL) - 'año nacimiento' || TO_CHAR(:NEW.autor(0).nacimiento.anio) );

        IF  ( ANIO_ACTUAL - :NEW.autor(0).nacimiento.anio ) <18 THEN
            RAISE_APPLICATION_ERROR(-20001,'El autor debe ser mayor de 18 años.');
        END IF; 
    END IF;
END;
/