【问题标题】:trigger on nested table oracle在嵌套表 oracle 上触发
【发布时间】:2017-12-03 06:37:20
【问题描述】:

您好,我想在嵌套表中创建一个触发器,以验证输入作者时该作者是否未满 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: 必须声明组件“NACIMIENTO”错误(6,9):PL/SQL:语句 忽略错误(6,40):PLS-00302:组件“NACIMIENTO”必须是 声明

--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;

【问题讨论】:

  • 如果你已经说Oracle为什么还要标记SQL Server
  • 我没有放sql server,可能是写错了:s
  • 我建议制作适当的规范化架构而不是嵌套表。
  • 只是为了一个任务,我需要知道如何在那个嵌套表中做一个触发器:l

标签: oracle oop


【解决方案1】:

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;
/

【讨论】:

  • 您好,感谢您的回复,该触发器编译得很好,但是如果我在此之后插入一个类似 INSERT 的元素 >>>>>> 这里应该有问题,因为年龄是 2012 年所以只有5岁。”触发器不执行。
  • 我需要你的帮助:c
猜你喜欢
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 2019-08-15
  • 2016-08-07
  • 2014-10-06
  • 1970-01-01
  • 2017-03-01
  • 2020-10-10
相关资源
最近更新 更多