Oracle 如何在语句中获取受该语句影响的行数';扳机

Oracle 如何在语句中获取受该语句影响的行数';扳机,oracle,plsql,database-trigger,rowcount,Oracle,Plsql,Database Trigger,Rowcount,我有一个语句级触发器,每当对表(称为customers)执行INSERT-UPDATE或DELETE操作时都会触发它。我想显示一条消息(到DBMS_输出),其中包含插入/更新/删除的行数 我只希望每个触发语句有一条消息,例如 “已将4行插入客户表” 如何从触发器声明内部访问受触发器语句影响的行数,即下面代码中的XXX: CREATE OR REPLACE TRIGGER customer_changes_trigger_2 AFTER INSERT OR UPDATE OR DELETE ON

我有一个语句级触发器,每当对表(称为customers)执行INSERT-UPDATE或DELETE操作时都会触发它。我想显示一条消息(到DBMS_输出),其中包含插入/更新/删除的行数

我只希望每个触发语句有一条消息,例如 “已将4行插入客户表”

如何从触发器声明内部访问受触发器语句影响的行数,即下面代码中的XXX:

CREATE OR REPLACE TRIGGER customer_changes_trigger_2
AFTER INSERT OR UPDATE OR DELETE ON customers

DECLARE
v_operation   VARCHAR(10);
v_number_rows NUMBER;


BEGIN

v_number := XXX;

IF INSERTING THEN
   v_operation := 'inserted';
END IF;

IF UPDATING THEN
   v_operation := 'updated';
END IF;

IF DELETING THEN
   v_operation := 'deleted';
END IF;

DBMS_OUTPUT.PUT_LINE
          (v_number_rows|| ' rows were ' || v_operation || ' from customers.');
END;

在文档中找不到任何内容,请提供帮助

我不确定它是否在
触发器主体之后的
中可用,但您可以尝试检查
sql%rowcount
一种方法是使用全局变量跟踪行数,因为没有其他方法可以从语句级触发器获取行数。然后需要三个触发器。。。一个语句级别用于在运行语句之前初始化变量,一个行级别用于为每行的变量添加一个,一个语句级别用于根据需要使用行计数。首先,设置变量和一些程序来帮助它:

create or replace package PKG_ROWCOUNT is
  NUMROWS   number;

  procedure INIT_ROWCOUNT;

  procedure ADD_ONE;

  function GET_ROWCOUNT
    return number;
end PKG_ROWCOUNT;
/

create or replace package body PKG_ROWCOUNT as
  procedure INIT_ROWCOUNT is
  begin
    NUMROWS := 0;
  end;

  procedure ADD_ONE is
  begin
    NUMROWS := Nvl(NUMROWS, 0) + 1;
  end;

  function GET_ROWCOUNT
    return number is
  begin
    return NUMROWS;
  end;
end PKG_ROWCOUNT;
/
初始化变量的第一个触发器:

create or replace trigger CUSTOMER_CHANGES_TRIGGER_1
  before insert or update or delete
  on CUSTOMERS
begin
  PKG_ROWCOUNT.INIT_ROWCOUNT;
end;
每行要更新的第二个:

create or replace trigger CUSTOMER_CHANGES_TRIGGER_2
  after insert or update or delete
  on CUSTOMERS
  for each row
begin
  PKG_ROWCOUNT.ADD_ONE;
end;
/
第三个用于显示总数的选项:

create or replace trigger CUSTOMER_CHANGES_TRIGGER_3
  after insert or update or delete
  on CUSTOMERS
begin
   Dbms_output.
   PUT_LINE(PKG_ROWCOUNT.GET_ROWCOUNT || ' rows were affected.');
end;

你到底为什么要
dbms\u输出
?你每次都要去那里检查吗?在调试时,稍后插入到表中。为什么不将每行的触发器更改为
,然后插入到跟踪表中,然后进行单独的查询来求和?感谢你的输入-我想有很多方法可以做到这一点。但是,我想知道上面的问题是否有答案,这就是我为什么问它的原因。我不知道答案,这就是我为什么评论:-)。在语句重新启动的情况下,这可能会给出不正确的结果。如果行触发器是before触发器,我就知道这是个问题。作为一个后触发器,我不知道重启是否有可能。有关语句重新启动的更多信息,请参阅:自从引入复合触发器的Oracle11g以来,现在执行此操作要容易得多。在before语句中,初始化rowCount变量。在for each row部分中,递增该变量。在after语句部分,您将有权访问该值。所以你不需要3个触发器,所有的逻辑都可以存在于一个复合触发器中。