当前位置: 首页 > 面试题库 >

在Oracle中使用触发器更改日期时出现问题

糜宜民
2023-03-14
问题内容

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

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

因此,我的 触发条件 是:

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');

该触发器可以很好地编译,但是他们在桌上没有做任何事情。


问题答案:

您想要这样的东西:

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语句,不如调用存储过程。



 类似资料:
  • 问题内容: 我有一个班上的一个项目。当我们的两个表对它们进行了更改时,我们需要创建一个日志:insert / update /delete。我们需要使用Oracle触发器和PL-SQL。在日志文件中,我们需要记录UserID,DateTime,IPAddress和Event(插入/更新/删除)。我知道如何设置触发器,但是我遇到的主要问题是UserID(从以UserID在Users表中登录到PHP站

  • 问题内容: 我已经阅读了有关创建触发器的Oracle文档,并且正在按照显示的方式进行操作,但是这是行不通的。我的目标是使用出现在TPM_TRAININGPLAN表中的最小STARTDATE更新TPM_PROJECT表。因此,每次有人更新TPM_TRAININGPLAN中的STARTDATE列时,我都想更新TPM_PROJECT表。这是我正在尝试的方法: 创建的触发器没有错误,但是我得到了警告: 当

  • 我在向表单输入日期时遇到了一个问题,我查看了其他帖子,但他们给我的解决方案对我不起作用:(错误指示我一个无效的月份错误。 我尝试使用TO_DATE('...','dd/mm/yyyy'),但通过这样做引发了另一个错误(actualizaoferta.php): 我试了很多方法来输入日期,但什么都没有。 程序 提前致谢:)

  • 问题内容: 我正在尝试为我的表创建一个触发器,该触发器根据某个标志设置为“ Y”的时间自动添加发布日期 我没有创建触发器的丰富经验,但到目前为止,这是我所拥有的 更新列时出现此错误 触发器“ USER.ADD_CREATE_DT”无效且重新验证失败 有任何想法吗? 谢谢 问题答案: 使用WHEN子句: 或使用IF: 在这种情况下,WHEN更合适,更有效。

  • 问题内容: 我该如何解决Oracle不允许在触发器中进行子查询的局限性。 这是我尝试创建的示例触发器,但由于无法使用子查询而无法创建。 问题答案: 这个触发器可以做到: 我假设从项目中进行选择将始终找到一行;如果不是,它将引发您可能需要处理的NO_DATA_FOUND异常。

  • 我有一个jdbc客户机与postgresql数据库通信。从JDBC中创建一条准备好的语句,用于在表中插入一些数据,但在创建查询时,客户机不知道要在语句中插入的所有字段,为了完成查询,我编写了一个触发器,在该表上插入之前触发,找到缺少的值,继续执行查询。这是jdbc代码: 这是触发代码: 当触发器触发时,我有一个错误: 这是什么意思?记录新的,正如你在jdbc代码中看到的那样。。。