尝试在 oracle 中触发时出错
Posted
技术标签:
【中文标题】尝试在 oracle 中触发时出错【英文标题】:error trying to make a trigger in oracle 【发布时间】:2010-01-26 21:35:06 【问题描述】:我正在尝试使用 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
希望你能帮忙……请原谅我的英语
【问题讨论】:
调试消息“计划的日期应该早于当前日期”与您的触发器的逻辑相矛盾,如果日期晚于(“超过”),则触发器的逻辑会以 ORA-20601 停止当前日期。 你的英语比许多人认为把它作为第一语言的人要好。不需要道歉。 dbms_output.put_line 消息的目的是什么?没有人会看到该消息(除了您在 SQL Plus、Toad 等中测试触发器时) 【参考方案1】:您的触发器引用 FECHA_PLAN
与您定义表的方式不匹配。大概和DATE_SERVICE
一样。
正如您编写的那样,如果输入的日期大于当前日期,则触发器将失败。但是当你说...
我会检查输入的日期 ...将等于或大于 当前日期插入 记录。
...也许您想要的是强制执行日期必须大于或等于当前日期的规则。如果是这样,如果输入的日期小于当前日期,您的触发器应该会失败。像这样……
IF(:NEW.FECHA_PLAN
请注意,我们可以直接使用sysdate
,因此select ... from dual
是不必要的(除非 Rene 在 cmets 中指出您想多次使用相同的值)。
如果这不能解决您的问题,您需要再解释一下。
【讨论】:
您好,FECHA_PLAN 与 DATE_SERVICE 相同,对不起。 :) 当您想确保每次在触发器中使用完全相同的日期/时间时,将 sysdate 选择到变量中是有意义的。如果你只使用一次,直接使用它。 @Rene - 但即便如此,“fecha_ac DATE := SYSDATE;”是一个更巧妙的解决方案【参考方案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;
【讨论】:
【参考方案3】:如果触发器引发了您的自定义 20601 错误,则表示触发器已成功编译并且可以正常工作,并且问题出在您的逻辑中。在您的问题中,如果您想禁止过去或未来的日期,还不够清楚。换句话说:如果 fecha 计划必须是未来的,那么操作员是错误的。如果它必须是过去的日期,那很好。
话虽如此,将业务逻辑放在触发器中并不是一个好主意。
【讨论】:
以上是关于尝试在 oracle 中触发时出错的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用 jasypt 加密值连接 oracle 数据库时出错