ORACLE中触发器中的子查询

时间:2014-10-22 22:34:50

标签: database oracle triggers

您好我想在触发器中执行子查询

像这样:

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;

/

但它不起作用......我该怎么办?

感谢。

1 个答案:

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