Sql 在oracle中尝试触发时出错

Sql 在oracle中尝试触发时出错,sql,oracle,triggers,ora-04088,Sql,Oracle,Triggers,Ora 04088,我正在尝试使用ORACLE SQL DEVELOPER在ORACLE中触发,我将检查作为开始日期预订到预订日期或服务费日期输入的日期是否等于或大于插入记录中的当前日期 这些是我表中的字段 Service (date_service, cost_variation, number_room, id_service); 这是我的代码: CREATE OR REPLACE TRIGGER VERIFY_DATE BEFORE INSERT OR UPDATE OF FECHA_PLAN ON SER

我正在尝试使用ORACLE SQL DEVELOPER在ORACLE中触发,我将检查作为开始日期预订到预订日期或服务费日期输入的日期是否等于或大于插入记录中的当前日期

这些是我表中的字段

Service (date_service, cost_variation, number_room, id_service);
这是我的代码:

CREATE OR REPLACE TRIGGER VERIFY_DATE
BEFORE INSERT OR UPDATE OF FECHA_PLAN ON SERVICE
FOR EACH ROW
DECLARE
  fecha_ac DATE;
BEGIN
  SELECT SYSDATE INTO fecha_ac FROM DUAL;
  IF(:NEW.FECHA_PLAN > fecha_ac)THEN
    dbms_output.put_line('The date of the plan should be more than the current date ');
    raise_application_error(-20601, 'Dato invalido');
  END IF;
END;
这就是我在尝试运行触发器时遇到的错误

INSERT INTO "MIGRARBD"."SERVICE" 
    (date_service, cost_variation, number_room, id_service) 
VALUES 
    (TO_DATE('20/01/10', 'DD/MM/RR'), '2', '1', '1')
将更改保存到表MIGRARBD.SERVICE时出错:

Fila 1: ORA-20601: Dato invalido
ORA-06512: en "MIGRARBD.VERIFICAR_FECHA", línea 7
ORA-04088: error during execution of trigger 'MIGRARBD.VERIFICAR_FECHA'
ORA-06512: on line 1
我希望你能帮我。。。请原谅我的英语

您的触发器引用了FECHA_计划,该计划与您定义表格的方式不匹配。这大概与DATE_服务相同

正如您所编码的,如果输入的日期大于当前日期,则触发器将失败。但是当你说

我会检查输入的日期 ... 将等于或大于 当前日期将插入到 记录

。。。也许您想要的是强制执行一条规则,即日期必须大于或等于当前日期。如果是这样,如果输入的日期小于当前日期,则触发器应该失败。像这样

如果:NEW.FECHA_PLAN 请注意,我们可以直接使用sysdate,因此选择。。。除非Rene在注释中指出,您希望多次使用相同的值,否则from dual是不必要的

如果这不能解决你的问题,你需要多解释一点

触发器引用的FECHA_计划与您定义表的方式不匹配。这大概与DATE_服务相同

正如您所编码的,如果输入的日期大于当前日期,则触发器将失败。但是当你说

我会检查输入的日期 ... 将等于或大于 当前日期将插入到 记录

。。。也许您想要的是强制执行一条规则,即日期必须大于或等于当前日期。如果是这样,如果输入的日期小于当前日期,则触发器应该失败。像这样

如果:NEW.FECHA_PLAN 请注意,我们可以直接使用sysdate,因此选择。。。除非Rene在注释中指出,您希望多次使用相同的值,否则from dual是不必要的


如果这不能解决你的问题,你需要多解释一点

你的约会对比不是跟你说的你想要的相反吗?如果插入的日期大于SYSDATE,则会引发错误。您不应该测试SYSDATE是否大于新记录中插入的日期吗?试试这个:

  IF(fecha_ac >= :NEW.FECHA_PLAN)THEN
    dbms_output.put_line('The date of the plan should be more than the current date ');
    raise_application_error(-20601, 'Dato invalido');
  END IF;

你的约会对比不是跟你说的你想要的相反吗?如果插入的日期大于SYSDATE,则会引发错误。您不应该测试SYSDATE是否大于新记录中插入的日期吗?试试这个:

  IF(fecha_ac >= :NEW.FECHA_PLAN)THEN
    dbms_output.put_line('The date of the plan should be more than the current date ');
    raise_application_error(-20601, 'Dato invalido');
  END IF;

如果触发器引发自定义20601错误,则表示触发器已成功编译并正常工作,问题在于您的逻辑。在你的问题中,如果你想禁止过去或未来的日期,这还不够清楚。换句话说:如果fecha计划必须是未来的,那么运营商就错了。如果一定是过去的日子,那没关系


话虽如此,将业务逻辑放在触发器中不是一个好主意。

如果触发器引发自定义20601错误,则意味着触发器已成功编译并工作,问题在于您的逻辑。在你的问题中,如果你想禁止过去或未来的日期,这还不够清楚。换句话说:如果fecha计划必须是未来的,那么运营商就错了。如果一定是过去的日子,那没关系


话虽如此,将业务逻辑放在触发器中不是一个好主意。

嗨,FECHA_计划与日期服务相同,很抱歉:当您希望确保每次在触发器中使用sysdate时都使用完全相同的日期/时间时,将sysdate选择到变量中是有意义的。如果只使用一次,请直接使用。@Rene-但即使如此,fecha_ac DATE:=SYSDATE;这是一个更圆滑的解决方案嗨,FECHA_计划与日期服务相同,对不起:当您希望确保每次在触发器中使用sysdate时都使用完全相同的日期/时间时,将sysdate选择到变量中是有意义的。如果只使用一次,请直接使用。@Rene-但即使如此,fecha_ac DATE:=SYSDATE;是一个更加巧妙的解决方案调试消息计划的日期应大于当前日期与触发器的逻辑相矛盾,如果日期晚于当前日期,触发器将停止使用ORA-20601。你的英语比许多人的母语要好。无需道歉。dbms_output.put_line消息的目的是什么?在SQL Plus、Toad等中测试触发器时,除了您之外,没有人会看到该消息。调试消息计划的日期应大于当前日期与触发器的逻辑相矛盾,如果日期大于当前日期,则触发器的逻辑将以ORA-20601停止。您
r英语比许多人认为英语是他们的第一语言要好。无需道歉。dbms_output.put_line消息的目的是什么?在SQL Plus、Toad等中测试触发器时,除了您之外,没有人会看到该消息。