【发布时间】:2018-12-26 08:51:29
【问题描述】:
我在 SQL 中创建了一个触发器,但我得到了一个错误并且不知道我的代码中的错误是什么。我试图从其他问题中找到我的解决方案,但没有根据我的问题找到任何答案
我需要一个触发器来更改我的表变量的值,例如:我在一个名为 used_weight 的变量中有一个值 (200kg),当我在此变量上插入、更新或删除时,该值应该是我的驱动器代码。
编译错误如下
警告:触发器创建时出现编译错误
当我更新我的变量时,我得到的错误是
第 1 行出现错误:
ORA-04098: 触发器 'ALI.LEFT_BALANCE' 无效并且重新验证失败
这是我的代码:
create or replace trigger left_balance
before delete or insert or update on reels_table
for each row
declare
begin
user_weight:=:new.used_weight+:old.used_weight;
left_weight:=weight-used_weight;
end;
/
我声明了变量,但错误仍然相同
create or replace trigger left_balance
before delete or insert or update on reels_table
for each row
declare
x number=:new.user_weight;
xx number=:old.user_weight;
begin
user_weight:=x+xx;
left_weight:=weight-user_weight;
end;
/
【问题讨论】:
-
如果是插入,则不会有 old.user_weight,如果是删除,则没有 new.user_weight。您必须为每个操作使用条件。
-
您没有声明
user_weight、left_weight、weight也没有声明used_weight。你可能在那里错过了一些:new.或:old.。 -
@sticky bit 在处理表名时是否需要声明这些变量。
-
是的,如果您希望它们作为变量。但我确实怀疑您想从
:new或:old访问具有相应名称的列。但是你还需要在他们前面写:new.或:old.。 -
您已标记此
[oracleforms],但您显示的代码是 database 触发器。也许您需要通过有关应该实施此规则的应用程序的一些详细信息来澄清您的问题。