【发布时间】: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