【问题标题】:Value of a unset column in :new pseudorecord before update oracle trigger更新oracle触发器之前:new pseudorecord中未设置列的值
【发布时间】:2020-04-07 21:30:31
【问题描述】:

当我没有显式更新此列但其他列时,我想知道before update oracle 触发器中:new 伪记录中的列的值是多少?

例子:

create table example (cod number(10),name varchar(50),description varchar(50));
update example set description = 'value example' where cod = 1;

如果在example 表上有一个before update 触发器,那么:new.name 的值是多少?请记住,我只是在更新 description 专栏。

谢谢

【问题讨论】:

  • 如果此答案对您有疑问,请将答案标记为正确或投票。

标签: sql oracle plsql sql-update database-trigger


【解决方案1】:

如果在example 表上有一个before update 触发器,那么:new.name 的值是多少?请记住,我只是在更新description 专栏。

它将包含当前正在更新的行的name 列中的值。

这是quite easy to test

create table example (cod number(10),name varchar(50),description varchar(50)); 

create trigger trg_example
before update on example
for each row
begin
    dbms_output. put_line('new name:' || :new.name);
end;
/

insert into example(cod, name, description) values(1, 'foo', 'bar');
-- 1 rows affected

update example set description = 'zoo' where cod = 1;
-- 1 rows affected
dbms_输出: 新名称:foo

【讨论】:

  • 谢谢,我已经测试过了,但想确定这是默认行为。
【解决方案2】:

如果示例表上有更新前触发器,:new.name 的值是多少? :new.name 将仅包含 name 的现有值。请参阅下面我尝试过的示例。

insert into example values(123,'name','dummy desc');
CREATE OR REPLACE TRIGGER example_before_update 
BEFORE UPDATE of description 
   ON example 
   FOR EACH ROW 

  DECLARE 
   description varchar2(10); 
   name varchar2(50); 

 BEGIN 
 -- Update updated_description 
  description:=:new.description; 
  name:=:new.name; 
  dbms_output.put_line( 'description  ' || description); 
  dbms_output.put_line( 'name  ' || name); 

 END; 

  update example set description = 'newexm' where cod = 123;

输出如下

   1 row(s) updated.
   description newexm
   name name

请参阅以下链接以获取完整示例。 https://livesql.oracle.com/apex/livesql/s/jw4epiekg9l76g2zad19x04pc

【讨论】:

    猜你喜欢
    • 2016-06-11
    • 2019-06-13
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2017-11-08
    相关资源
    最近更新 更多