Plsql 确定删除了多少行

Plsql 确定删除了多少行,plsql,Plsql,我正在使用一个表来驱动另一个表的删除。我希望能够跟踪驱动删除的表中每条记录删除了多少行。使用SQL%ROWCOUNT对我来说似乎没有什么用处,因为它只会返回DELETE语句中删除的行总数。还有别的方法可以用吗?说明 DELETE FROM my_schema.tbl_companies A WHERE EXISTS ( SELECT * FROM my_schema.table_that_includes_companies_to_be_deleted RMV

我正在使用一个表来驱动另一个表的删除。我希望能够跟踪驱动删除的表中每条记录删除了多少行。使用SQL%ROWCOUNT对我来说似乎没有什么用处,因为它只会返回DELETE语句中删除的行总数。还有别的方法可以用吗?说明

DELETE 
FROM my_schema.tbl_companies A 
WHERE EXISTS (
        SELECT *
        FROM my_schema.table_that_includes_companies_to_be_deleted RMV 
        WHERE RMV.company = A.company
    );

如果“我的表”中有两条记录包含“要删除的公司”表,并且这些记录中的每一条都映射到tbl“公司”表中的20条记录,那么这将导致SQL%ROWCOUNT返回值40。我希望能够看到表中第一条记录(包括要删除的公司)和表中第二条记录(包括要删除的公司)删除了多少条记录。

根据@plirke的评论,您可以使用光标和for循环删除它们。或者你可以这样做:

DECLARE
  l_tab SYS.KU$_VCNT; -- This is a pre-existing collection type
BEGIN
  DELETE 
  FROM my_schema.tbl_companies A 
  WHERE EXISTS (
          SELECT *
          FROM my_schema.table_that_includes_companies_to_be_deleted RMV 
          WHERE RMV.company = A.company
      )
  RETURNING company BULK COLLECT INTO l_tab;

  for r in (select column_value, count(*) cnt from table(l_tab) group by column_value)
  loop
    dbms_output.put_line('company '||r.column_value||' deleted '||r.cnt);
  end loop;
END;

所以
SQL%ROWCOUNT
将返回
40
(如您所说),因为实际上
40
记录从
tbl\u公司中删除的位置。为什么您希望返回任何其他号码?我想,如果您想跟踪每条记录的删除(确切地说是每次重复),那么您必须在过程或匿名pl/sql块中使用
游标
for
循环
来实现删除逻辑。。。当然,使用Oracle未记录的对象(如
SYS.KU$\u VCNT
)有一个缺点。你不能依赖它们,因为它们可能会在没有任何通知的情况下发生变化(我指的是Oracle)。@Plirkee True,我可能会在现实中创建自己的集合类型。非常有趣的解决方案Tony,谢谢。我以前没有在PL/SQL中使用过集合,所以我将尝试一下,看看结果如何。