Oracle 没有';在plsql中不发送邮件html正文

Oracle 没有';在plsql中不发送邮件html正文,oracle,plsql,oracle11g,sendmail,database-trigger,Oracle,Plsql,Oracle11g,Sendmail,Database Trigger,我在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

我在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;
事情是这样的:

  • AP\u供应商\u站点\u ALL中插入或更新行时触发

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

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

  • 它计算联接的
    rib1
    rib2
    表中的行数

    • 不引用所有ap供应商站点的“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次
怎么办?切换到语句级触发器(而不是当前使用的行级触发器),因为它会对每个语句触发一次,而不考虑受影响的行数。

如下所示:

  • AP\u供应商\u站点\u ALL中插入或更新行时触发

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

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

  • 它计算联接的
    rib1
    rib2
    表中的行数

    • 不引用所有ap供应商站点的“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次

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

如果必须使用触发器,但考虑将电子邮件生成移回应用程序代码,则切换到@littlefoot建议的语句后触发器是正确的。如果在提交事务之前发生错误或用户取消(回滚)事务,会发生什么情况。您的更新电子邮件已发送,但更新未发送到数据库。如果您必须使用触发器,但考虑将电子邮件生成移回应用程序代码,则按照@littlefoot的建议切换到after语句触发器是正确的。如果在提交事务之前发生错误或用户取消(回滚)事务,会发生什么情况。您的更新电子邮件已发送,但更新未进入数据库。您好,谢谢您的更新,下面是我的说明:请参阅我下面的反馈这是无法阅读的,抱歉。据我所知,你指的是“错误的”计数。这不是触发器中SELECT语句返回的行数,而是受表AP_SUPPLIER_SITES_ALL上的INSERT或UPDATE影响的行数。是的,我计算每个供应商的attribute4数,如果count>1,则表示attribute4存在于2个或更多供应商,在这种情况下,请向经理发送电子邮件,告知:,属性4正在与其他供应商共享。我创建了另一个过程:创建或替换过程ribrib,因为v_计数编号:=0;开始从rib1 r1、rib3 r3中选择计数(*),其中r1.ATTRIBUTE4=r3.Supplier\u RIB;如果v_计数>1,则测试肋骨;如果结束;结束;在我的触发器调用我的新程序后:在ap\U供应商\U站点上插入或更新后创建或替换触发器复制\U RIB\U所有每行开始RIB;结束;但同样的问题6电子邮件在同一时间你好,谢谢你的更新,下面我的解释:请看我下面的反馈这是不可读的,对不起。据我所知,你指的是“错误的”计数。这不是触发器中SELECT语句返回的行数,而是受表AP_SUPPLIER_SITES_ALL上的INSERT或UPDATE影响的行数。是的,我计算每个供应商的attribute4数,如果count>1,则表示attribute4存在于2个或更多供应商,在这种情况下,请向经理发送电子邮件,告知:,属性4正在与其他供应商共享。我创建了另一个过程:创建或替换过程ribrib,因为v_计数编号:=0;开始从rib1 r1、rib3 r3中选择计数(*),其中r1.ATTRIBUTE4=r3.Supplier\u RIB;如果v_计数>1,则测试肋骨;如果结束;结束;在我的触发器调用我的新程序后:在ap\U供应商\U站点上插入或更新后创建或替换触发器复制\U RIB\U所有每行开始RIB;结束;但同样的问题,6封电子邮件在同一时间