Oracle表的更新触发器问题,更新本表的字段。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle表的更新触发器问题,更新本表的字段。相关的知识,希望对你有一定的参考价值。
现有以表TABLE 有五个字段分别为:INDX,NAME,NAME1,NAME2,FULLNAME,其中INDX为主键,现在更新TABLE后触发,使得FULLNAME的值等于NAME,NAME1,NAME2相加,怎么建触发器
create or replace trigger tr_tbbefore 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;
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?请添加标签以指定您使用的是mysql
、postgresql
、sql-server
、oracle
还是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
SQL技巧两则:选择一个表的字段插入另一个表,根据其它表的字段更新本表内容