您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Oracle-创建触发器以更新另一个表时出现问题

Oracle-创建触发器以更新另一个表时出现问题

一些问题没有特别的顺序。

首先,在行级触发器的主体中,您需要使用:new:old引用新记录和旧记录。前导冒号是必要的。所以你的WHERE条款需要

WHERE PROJECTID = :new.PROJECTID

其次,如果您CREATE TRIGGERsql * Plus中运行,则可以使用以下SHOW ERRORS命令获得错误和警告的列表,即

sql> show errors

您还可以查询DBA_ERRORS表(或ALL_ERRORSUSER_ERRORS根据您的权限级别),但是这不是你通常需要求助于。

第三,假设语法错误已得到纠正,如果使用此逻辑,您将得到一个变异表错误。表A的行级触发器(TPM_TRAININGPLAN在这种情况下)无法查询表A,因为表可能处于不一致状态。如Tim在他的文章中所示,您可以通过以下方法解决此问题:创建一个带有集合的程序包,在before语句触发器中初始化该集合,在行级触发器中填充集合中的数据,然后在其中处理修改后的行。一个after语句触发器。但是,由于要管理多个不同的对象,因此增加了相当多的复杂性。

通常,最好将这种逻辑实现为用于操作TPM_TRAININGPLAN表的任何API的一部分。如果这是一个存储过程,则将要更新的逻辑TPM_PROJECT放入该存储过程中而不是将其放入触发器中就更有意义了。众所周知,尝试调试在触发器中嵌入很多逻辑的应用程序是很痛苦的,因为这使开发人员很难完全了解正在执行的操作。或者,您可以TRAININGDELIVERYSTARTTPM_PROJECT表中删除该列,然后仅在运行时计算最小开始日期。

第四,如果触发器在插入,更新和删除时触发,则不能简单地引用:new值。 :new对插入和更新有效,但如果要删除,它将为NULL。:old删除和更新有效,但如果要执行插入操作,则将为NULL。这意味着您可能需要遵循以下逻辑(参考Tim的软件包解决方案)

BEGIN
  IF inserting 
  THEN
    trigger_api.tab1_row_change(p_id => :new.projectid, p_action => 'INSERT');
  ELSIF updating
  THEN
    trigger_api.tab1_row_change(p_id => :new.projectid, p_action => 'UPDATE');
  ELSIF deleting
  THEN
    trigger_api.tab1_row_change(p_id => :old.projectid, p_action => 'DELETE');
  END IF;
END;
Oracle 2022/1/1 18:50:05 有384人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶