尝试在oracle中触发时出错

时间:2010-01-26 21:35:07

标签: sql oracle triggers ora-04088

我正在尝试使用ORACLE SQL DEVELOPER在ORACLE中创建TRIGGER,我会检查输入的日期作为开始日期预留到预订日期或服务费用的日期将等于或大于插入的当前日期在记录中。

这些是我表格中的字段

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

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

3 个答案:

答案 0 :(得分:4)

您的触发器引用FECHA_PLAN,它与您定义表的方式不匹配。据推测它与DATE_SERVICE相同。

编码后,如果输入的日期大于当前日期,则触发器会失败。但是,当你说...时,

  

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

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

IF(:NEW.FECHA_PLAN< sysdate)那么

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

如果这不能解决您的问题,您需要解释一下。

答案 1 :(得分: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;

答案 2 :(得分:0)

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

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