Oracle表的更新触发器问题,更新本表的字段。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle表的更新触发器问题,更新本表的字段。相关的知识,希望对你有一定的参考价值。

现有以表TABLE 有五个字段分别为:INDX,NAME,NAME1,NAME2,FULLNAME,其中INDX为主键,现在更新TABLE后触发,使得FULLNAME的值等于NAME,NAME1,NAME2相加,怎么建触发器

create or replace trigger tr_tb
before insert or update on tb
for each row
begin
FULLNAME:=:new.NAME+:new.NAME1+:new.NAME2;
end;追问

假如增加判断,如果NAME的值为“A”,则重新赋值为“B”,NAME1的值为“A” ,则重新赋值为“B”,NAME2的值为“A”的时候,则重新赋值为“B”,此时,FULLNAME怎么弄?

追答

create or replace trigger tr_tb
before insert or update on tb
for each row
begin
FULLNAME:=decode(:new.NAME,'A','B',:new.NAME)+decode(:new.NAME1,'A','B',:new.NAME1)+decode(:new.NAME2,'A','B',:new.NAME2);
end;

参考技术A 程序可以解决的问题,千万别弄什么触发器,以后维护的成本会很大的

Oracle 触发器根据 sysdate 循环和更新字段

【中文标题】Oracle 触发器根据 sysdate 循环和更新字段【英文标题】:Oracle Trigger to loop and update field based on sysdate 【发布时间】:2016-01-15 13:49:32 【问题描述】:

我想创建一个触发器,当疫苗过期(“EXPIRATION_DATE”)时,可以将字段(“STATUS”)更新为非活动状态。 这是当前的表结构:

   **CREATE TABLE WAREHOUSE.VACCINE_INVENTORY (
      VACCINE  VARCHAR2(200 BYTE) NOT NULL,
      RECEIPT_DATE  DATE  NOT NULL,
      CONTAINER_SIZE  VARCHAR2(200 BYTE),
      QUANTITY  NUMBER(6, 0),
      REQUISITION  NUMBER(6, 0),
      FISCAL_YEAR  NUMBER(4, 0),
      RECEIVED_BY  VARCHAR2(50 BYTE),
      EXPIRATION_DATE DATE,
      LOT_NUMBER  VARCHAR2(30 BYTE)  NOT NULL,
      VENDOR  VARCHAR2(200 BYTE),
      STATUS  VARCHAR2(10 BYTE),
      CATALOG_NUMBER  NUMBER(5, 0),
      CONSTRAINT PK_VACC PRIMARY KEY (VACCINE, RECEIPT_DATE, LOT_NUMBER) USING INDEX TABLESPACE WAREHOUSE STORAGE**

所以我们的想法是,如果 SYSDATE > EXPIRATION_DATE,到期日期应该从 Active 更改为 Inactive。

我假设我需要创建一个循环,以便当触发器运行时,它将循环遍历表中的所有记录并将每个过期的疫苗设置为非活动状态。

我将不胜感激任何帮助......

谢谢, 马修

【问题讨论】:

这适用于哪个 RDBMS?请添加标签以指定您使用的是mysqlpostgresqlsql-serveroracle 还是db2 - 或完全其他的东西。 抱歉,这是针对 Oracle (Oracle 12c) 的。谢谢。 “触发器”是指每天运行的计划作业吗?如果是这样,则不需要循环;一条更新语句就可以完成这项工作。您只需将其放入 pl/sql 过程中,然后设置作业以调用该过程 感谢 Boneist:我最终使用了更新声明。谢谢。 【参考方案1】:

创建一个附加视图以提供依赖于表列和 sysdate 的字段,例如

CREATE TABLE VACCINE_INVENTORY(VACCINE VARCHAR2(200 BYTE) NOT NULL,
                               -- ---
                               EXPIRATION_DATE DATE NOT NULL
                               -- ...
                               );

CREATE view VACCINE_INVENTORY_VW AS
  select v.*,
         case
           when v.expiration_date < sysdate then
            'I'
           else
            'A'
         end as status
    from VACCINE_INVENTORY v;

【讨论】:

以上是关于Oracle表的更新触发器问题,更新本表的字段。的主要内容,如果未能解决你的问题,请参考以下文章

oracle触发器发现a表的p字段更新到123数值后将其字段更新到456

Oracle 将另外一张表的列更新到本表的列

SQL技巧两则:选择一个表的字段插入另一个表,根据其它表的字段更新本表内容

关于SQL触发器 B表读取A表的字段信息 并更新到指定的B表字段

oracle update触发器如何获取被修改的字段

oracle当表A1,数据发生update时,将字段time更新为当前时间