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