Sql Oracle中的触发器

Sql Oracle中的触发器,sql,oracle,triggers,Sql,Oracle,Triggers,我想在oracle中创建一个触发器。 当有人在表上插入时,触发器应该更改insert语句的一个元素。例如: 有人插入: "User1" "Road2" "Town2" "Age44" 我的触发器应该: "User1 "Road2" "Town2 "**Age35**" 但这不应该是这样 "after insert on table1 begin update table1 set age='Age35'" 我需要一些可以立即执行的东西,比如“而不是在表1上插入开始在表1中插入”值“用户”“

我想在oracle中创建一个触发器。 当有人在表上插入时,触发器应该更改insert语句的一个元素。例如:

有人插入:

"User1" "Road2" "Town2" "Age44"
我的触发器应该:

"User1 "Road2" "Town2 "**Age35**"
但这不应该是这样

"after insert on table1 begin update table1 set age='Age35'"
我需要一些可以立即执行的东西,比如“而不是在表1上插入开始在表1中插入”值“用户”“道路”“城镇”“年龄35”


因此,触发器只更改插入的一个元素,其余元素相等。我非常感谢你们提供的任何帮助。我不知道怎么做。

只需使用“插入前”而不是“插入后”来编辑年龄变量的值。

只需使用“插入前”而不是“插入后”“编辑年龄变量的值。

您可以在插入之前执行此操作:

create table test (myuser varchar2(100), age number);
create or replace trigger test_trigger 
before insert on test
referencing new as new 
for each row
begin
  if :new.age = 45 then 
     :new.age := 35;
  end if;
end;
/
insert into test values ('user1',45);
insert into test values ('user2',46);
select * from test;
输出:

Table created.
Trigger created.
1 row created.
1 row created.

    MYUSER         AGE
----------  ----------
user1               35                                                              
user2               46

2 rows selected.
编辑:

您也可以在时使用
。但你不能避免一行一行地做。您无法以某种方式获取整个insert语句并对其进行操作。对于表,没有
代替触发器

create or replace trigger test_trigger 
    before insert on test
    referencing new as new 
    for each row
    when(new.age = 45)
    begin
      :new.age := 35;
    end;
    /

关于性能方面的问题,我认为你真的应该尝试一下。我不认为这真的会产生如此负面的影响。

你可以在插入之前这样做:

create table test (myuser varchar2(100), age number);
create or replace trigger test_trigger 
before insert on test
referencing new as new 
for each row
begin
  if :new.age = 45 then 
     :new.age := 35;
  end if;
end;
/
insert into test values ('user1',45);
insert into test values ('user2',46);
select * from test;
输出:

Table created.
Trigger created.
1 row created.
1 row created.

    MYUSER         AGE
----------  ----------
user1               35                                                              
user2               46

2 rows selected.
编辑:

您也可以在
时使用
。但你不能避免一行一行地做。您无法以某种方式获取整个insert语句并对其进行操作。对于表,没有
代替触发器

create or replace trigger test_trigger 
    before insert on test
    referencing new as new 
    for each row
    when(new.age = 45)
    begin
      :new.age := 35;
    end;
    /

关于性能方面的问题,我认为你真的应该尝试一下。我不认为这真的会产生如此负面的影响。

@SemihEker-您希望OP以什么方式和目的编辑此问题?@SemihEker-您希望OP以什么方式和目的编辑此问题?谢谢您的回答。我忘了提到我的桌子有500000k行。如果我理解正确,他将检查每一行在性能方面不可接受的内容。我只需要更改要插入的行。因为你提到你需要触发器,所以我给了你一个触发器。但是我不确定你是否会有这样的性能问题,如果你插入1/2百万行,你会让触发器运行50万次。您应该尝试一下,然后在出现问题时考虑调整。首先不要假设有一个。您的用例是什么?你是插入还是不受你控制的其他程序插入?在提交之前,其他用户看不见,所以你可以插入,然后更新,然后提交,根本不需要触发器。是的,程序插入。我不能更改程序代码。所以我必须改变这个程序的功能。我认为最简单的方法是在触发器中执行一些变量。就像你用java或其他语言编程一样。因此,它们将被程序插入的内容填充,我用insert命令执行触发器。因此,我可以使用insert中的变量,并删除我希望每次都具有相同数字的变量。也许你知道这样的事情是否可能。对不起,我迟了回答。我终于有时间尝试你的解决方案了。表演还可以。所以你的解决方案对我有效。非常感谢。谢谢你的回答。我忘了提到我的桌子有500000k行。如果我理解正确,他将检查每一行在性能方面不可接受的内容。我只需要更改要插入的行。因为你提到你需要触发器,所以我给了你一个触发器。但是我不确定你是否会有这样的性能问题,如果你插入1/2百万行,你会让触发器运行50万次。您应该尝试一下,然后在出现问题时考虑调整。首先不要假设有一个。您的用例是什么?你是插入还是不受你控制的其他程序插入?在提交之前,其他用户看不见,所以你可以插入,然后更新,然后提交,根本不需要触发器。是的,程序插入。我不能更改程序代码。所以我必须改变这个程序的功能。我认为最简单的方法是在触发器中执行一些变量。就像你用java或其他语言编程一样。因此,它们将被程序插入的内容填充,我用insert命令执行触发器。因此,我可以使用insert中的变量,并删除我希望每次都具有相同数字的变量。也许你知道这样的事情是否可能。对不起,我迟了回答。我终于有时间尝试你的解决方案了。表演还可以。所以你的解决方案对我有效。非常感谢。谢谢你的回答,但我想这并不是那么容易。使用before insert时,不会更改行,因为它不在表中。在插入行之前,我无法编辑该行。谢谢您的回答,但我想这并不容易。使用before insert时,不会更改行,因为它不在表中。在插入行之前,我无法编辑该行。