1

我正在尝试使用 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;

这是我尝试运行 TRIGGER 时遇到的错误

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

我希望你能帮助......并原谅我的英语

4

3 回答 3

4

您的触发器引用FECHA_PLAN与您定义表的方式不匹配。想必是一样的DATE_SERVICE

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

我会检查输入的日期...是否等于或大于记录中插入的当前日期。

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

IF(:NEW.FECHA_PLAN < 系统日期)THEN

请注意,我们可以sysdate直接使用,因此select ... from dual不需要(除非 Rene 在评论中指出您想多次使用相同的值)。

如果这不能解决您的问题,您将需要更多解释。

于 2010-01-26T22:14:00.560 回答
2

您的日期比较不是与您所说的相反吗?如果插入的日期大于 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;
于 2010-01-27T00:12:53.580 回答
0

如果触发器引发您的自定义 20601 错误,则意味着触发器已成功编译并且可以正常工作,并且问题存在于您的逻辑中。在您的问题中,如果您想禁止过去或未来的日期,还不够清楚。换句话说:如果 fecha 计划必须是未来的,那么操作员是错误的。如果它必须是过去的日期,那很好。

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

于 2010-01-27T23:43:51.043 回答