您好我想在触发器中执行子查询
像这样:CREATE OR REPLACE TRIGGER verificar_edad
BEFORE INSERT ON reserva
FOR EACH ROW
DECLARE
BEGIN
IF (:new.pasaporte_cliente in (SELECT pasaporte FROM cliente WHERE fecha_nacimiento>'1996/01/01')) THEN
DBMS_OUTPUT.PUT_LINE ('El cliente debe ser mayor de edad');
END IF;
END;
/
但它不起作用......我该怎么办?
感谢。
答案 0 :(得分:0)
首先,我不认为你想在触发器中使用DBMS_OUTPUT.PUT_LINE,除非你的应用程序'包括在SQL * Plus或Toad中键入命令。如果你的意思是禁止插入并告诉客户端为什么,那么代替DBMS_OUTPUT.PUT_LINE:
RAISE_APPLICATION_ERROR (-20101, 'El cliente debe ser mayor de edad');
小于-20999和-20000的代码保留用于开发人员定义的错误
您的逻辑看起来不像检查客户的年龄,而不是检查客户是否在护照(' pasaporte')表中有记录。
对于需要SQL SELECT的验证,其中要点是验证客户端是否超过18岁,它会是这样的:
DECLARE
v_verified number;
BEGIN
select count(*) into v_verified
FROM cliente
WHERE fecha_nacimiento > (sysdate - (365*18)) -- or more sophisticated function that accounts for leap years
and pasaporte = :new.pasaporte_cliente;
IF v_verified = 0 then
RAISE_APPLICATION_ERROR (-20010, 'El cliente debe ser mayor de edad');
end if;
end;