当前位置: 首页 > 知识库问答 >
问题:

嵌套表oracle上的触发器

周浩淼
2023-03-14

你好,我想在嵌套表中创建一个触发器,以验证在输入作者时,这不是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;

共有1个答案

张亦
2023-03-14

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

 类似资料:
  • 我试图遍历一个对象列表,并为每个对象生成一个,并为每个对象生成一个嵌套的。 这是生成第234行异常的代码 更新:注意:第234行在并且有,因为处缺少 templateInputException:模板解析过程中发生错误(模板:“类路径资源[templates/qrcodes.html]”-第234行,第10行) 我已经讨论过这些话题了 在Thymeleaf中如何处理if-else? Thymele

  • 触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行。 因此触发器不需要人为的去调用,也不能调用。触发器的触发条件其实在定义的时候就已经设定好了。这里面需要说明一下,触发器可以分为语句级触发器和行级触发器。 触发器的基础知识和示例: Oracle之前插入触发器 - https://www.xnip.cn/oracle/before_insert.html Oracle之后插

  • 问题内容: 我有一个触发器,我正尝试使用它来更新它侦听的同一张表。 但是,提交创建或更新后,出现以下错误: 感谢您的帮助! 问题答案: 您正在更新触发器已写入的同一表。您需要这样的东西:

  • 问题内容: 我想知道如何从具有类型列的表中进行选择语句?该列的类型定义为: UPD1 表定义为 如果我选择此列, 我将得到以下无意义的结果: 我只想打开这种类型。 问题答案: 像这样尝试: 这是一个sqlfiddle演示

  • 问题内容: 我需要使用ajax和FormData发送一些数据,因为我想发送文件和其他一些参数。我通常发送数据的方式是这样的: 如果我不使用FormData(),就没有问题,但是当使用FormData()时,只有Lvl1上的数据可以,但是嵌套的任何内容都显示为这样的字符串 如果我使用FormData()对Lvl1-3中的数据进行编码,而不是得到 如何在Lvl1-3上获取数组而不是字符串? 注意:如果

  • 问题内容: 在oracle中,我可以指定列,这将引发触发器的触发: 现在,我想执行以下操作:当 只 更新 一 列时,我不希望触发触发器。这怎么可能? 我可以列出除那一列之外的所有列,该列不应引起触发器的触发。对于具有许多列的表而言,这非常麻烦。 另一种方法是使用像这样的UPDATING函数: 但是,如果我立即更改了COL1 和 COL3,则该语句的计算结果为false。那不是我想要的,因为我只想更