【问题标题】:didn't send mail html body in plsql没有在 plsql 中发送邮件 html 正文
【发布时间】:2020-02-18 12:35:30
【问题描述】:

我在plsql中开发了一个触发器,触发器工作但我同时收到了6封邮件。我只需要一封邮件,我该怎么办?

CREATE or replace TRIGGER RI 
  AFTER insert or update on ap_supplier_sites_all 
  for each row 

DECLARE 
  x_count NUMBER;

begin

  select count(*) into x_count 
  from rib1 r1,rib2 r2 
  where r1.ATTRIBUTE4=r2.Supplier_RIB; 

  if(x_count > 0) 
  then 
     testrib;--execute SP
  end if;
end;

【问题讨论】:

  • 像@littlefoot 建议的那样切换到 after 语句 触发器是正确的如果您必须使用触发器,但请考虑将电子邮件生成移回应用程序代码。如果在提交事务或用户取消(回滚)事务之前发生错误,会发生什么情况。您的更新电子邮件已发送,但更新未进入数据库。

标签: oracle plsql oracle11g sendmail database-trigger


【解决方案1】:

事情是这样的:

  • AP_SUPPLIER_SITES_ALL 中插入或更新行时触发

    • 假设您运行了更新 6 行的 update 语句,类似于 Scott 的 EMP 表中的内容:

      update emp set 
        sal = sal * 1.1
        where deptno = 20;
      
  • 为每一行触发触发;如果有 6 行更新,它会触发 6 次

  • 它计算加入的rib1rib2 表中的行数

    • 可以不引用ap_supplier_sites_all 中的某些“ID”列吗?类似的东西

      select count(*) into x_count 
      from rib1 r1, rib2 r2 
      where r1.ATTRIBUTE4 = r2.Supplier_RIB
        and r1.some_id = :new.some_ap_supplier_sites_all_id;      --> this
      
  • 如果该数字大于 0,则您正在执行testrib 过程
    • 如果它发送一封电子邮件,那么是的 - 它会发送 6 次

怎么办?切换到语句级触发器(而不是您当前使用的行级),因为它会在每个语句中触发一次,而不管受影响的行数。

【讨论】:

  • 您好,感谢您的更新,以下是我的解释:
  • 请看我下面的反馈
  • 这是不可读的,抱歉。据我了解,您指的是“错误”计数。它不是触发器中的 SELECT 语句返回的行数,而是表 AP_SUPPLIER_SITES_ALL 上的 INSERT 或 UPDATE 影响的行数。
  • 是的,我统计每个供应商的attriute4数量,如果count>1,表示attriute4存在2个或更多供应商,在这种情况下给经理发邮件说,attriute4正在与其他人共享供应商。
  • 我创建另一个程序:创建或替换 PROCEDURE ribrib aS v_count number := 0; BEGIN select count(*) into v_count from rib1 r1,rib3 r3 where r1.ATTRIBUTE4=r3.Supplier_RIB;如果 v_count > 1 那么 testrib;万一;结尾;在我的触发器调用我的新程序之后:在每行开始 ribrib 的 ap_supplier_sites_all 上插入或更新后创建或替换 TRIGGER duplicate_RIB;结尾;而且同一期也同时发了 6 封邮件
猜你喜欢
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
  • 2019-06-11
  • 2021-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多