在oracle中使用触发器更改日期的问题

阿西尔阿尔凯德

我想创建一个触发器,可以在我的表“合同”中修改或插入日期:

“如果当前合同的客户签订新合同,则前一个合同的结束日期将是新合同开始日期的前一天”

所以,我的触发器是:

CREATE OR REPLACE TRIGGER TRIGGER_D
BEFORE
INSERT OR UPDATE ON CONTRACTS
FOR EACH ROW
DECLARE
idcliente CONTRACTS.CLIENTID%TYPE;
fecha_fin CONTRACTS.ENDDATE%TYPE;
BEGIN
  if :NEW.CLIENTID = idcliente  
    then 
    if TO_CHAR(fecha_fin) IS NULL OR TO_CHAR(fecha_fin) > TO_CHAR(:NEW.STARTDATE)
      then
        INSERT INTO CONTRACTS (ENDDATE) VALUES 
        (:NEW.STARTDATE);
        update CONTRACTS
        set
          ENDDATE = :NEW.STARTDATE;
    end if;      
  end if;
END;

我试图插入这样的一行:

INSERT INTO CONTRACTS (CONTRACTID, CLIENTID, STARTDATE, ENDDATE, CONTRACT_TYPE ,ADDRESS ,TOWN, ZIPCODE, COUNTRY)
VALUES              ('TW42260/09','99/98480296/22T',TO_DATE('18/04/17','DD/MM/YY'), NULL ,'Flat Rate Lover','69 Citadel Street, Ground floor, door 1','Summer forest', '11164' ,'Taiwan, Province of China');

这个触发器编译得很好,但他们没有在桌子上做任何事情。

MT0

你想要这样的东西:

CREATE OR REPLACE TRIGGER TRIGGER_D
BEFORE
INSERT OR UPDATE ON CONTRACTS
FOR EACH ROW
DECLARE
BEGIN
  UPDATE CONTRACTS
  SET    ENDDATE   = :NEW.STARTDATE - INTERVAL '1' DAY
  WHERE  CLIENTID  = :NEW.CLIENTID
  AND    ENDDATE   > :NEW.STARTDATE
  AND    STARTDATE < :NEW.STARTDATE;
END;

但是,它正在更新触发器正在监视的表,并且触发器似乎可能会导致更新,从而再次调用触发器并出现变异表错误。

您最好将业务逻辑包装在一个存储过程中,它可以对前一行执行更新,然后执行插入/更新。然后,不是直接在表上执行 DML 语句,而是调用存储过程。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Oracle SQL使用触发器检查重叠的日期

来自分类Dev

如何使用触发器根据日期更改列值?

来自分类Dev

如何扩展Liquibase以使用存储过程,函数和触发器生成更改日志?

来自分类Dev

根据更新后的触发器插入更改日志

来自分类Dev

T-SQL如何仅在其他值实际发生更改时才设置修改日期而不使用触发器

来自分类Dev

在Oracle SQL中使用触发器时出错

来自分类Dev

在 Oracle 触发器代码中使用“exec”并失败

来自分类Dev

仅当未提供修改日期时才更新修改日期触发器

来自分类Dev

仅当未提供修改日期时才更新修改日期触发器

来自分类Dev

此Oracle触发器有问题

来自分类Dev

Oracle更新触发器问题

来自分类Dev

Oracle触发器更改值

来自分类Dev

在触发器中使用更新的项目

来自分类Dev

在MySQL中使用条件触发器

来自分类Dev

在触发器中使用 SELECT

来自分类Dev

使用触发器更改插入的值

来自分类Dev

使用触发器更改插入的值

来自分类Dev

如何从oracle触发器更改为oracle复合触发器?

来自分类Dev

在MySQL INSERT触发器中使用IF语句时出现问题

来自分类Dev

在Oracle中使用触发器将列值设置为等于另一列

来自分类Dev

Oracle触发器会导致性能问题吗

来自分类Dev

更新Oracle触发器之前的问题[PL / SQL]

来自分类Dev

Oracle触发器不执行-INSTR函数问题

来自分类Dev

Oracle触发器会导致性能问题吗

来自分类Dev

在Linux中使用Python更改日期/时间

来自分类Dev

在 r 中使用 posixct 更改日期格式

来自分类Dev

UPDATE触发器问题

来自分类Dev

MySQL的触发器问题

来自分类Dev

DataReceivedEventHandler触发器的问题