【问题标题】:Create trigger in oracle sql在 oracle sql 中创建触发器
【发布时间】: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 触发器。也许您需要通过有关应该实施此规则的应用程序的一些详细信息来澄清您的问题。

标签: oracle database-trigger


【解决方案1】:

下面是一个简单的例子,但首先让我解释几件事:

在 plsql 代码中,当你想使用变量时,你必须声明它们(正如@sticky bit 解释的那样)。

示例:

 declare var1 varchar2(10); 
 var1 varchar2(10);

您在表 reels_table1 上使用了触发器,这将导致变异错误,但是因为您使用了before,所以您没有遇到错误。

@Daniel E 指出插入不会有旧值。

请注意,在下面的示例中,我创建了一个测试表,并在更新中添加了一个条件,也许你忘记了。

drop table reels_table1
/
create table reels_table1 (id number(4), user_weight number(4), left_weight number(4),weight number(4) )
/
create or replace trigger left_balance
before delete or insert or update on reels_table1
for each row
declare

x number(2)  := :new.user_weight;
xx number (2) := :old.user_weight;
begin

update reels_table1 set 
user_weight =x+xx where id =1;

update reels_table1 set left_weight = weight - user_weight where id=1;

end;
/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 2018-02-07
    • 2011-09-02
    • 2012-08-23
    • 1970-01-01
    相关资源
    最近更新 更多