在Oracle中删除/插入操作后返回记录数

时间:2014-08-29 13:25:54

标签: sql oracle stored-procedures plsql count

我想返回在存储过程中执行操作之前和之后的记录数。我查找了一个应该用于返回表中行数的函数。但是,它无法运作。有什么帮助吗?

类似:Please check this link on DBA Stack Exchange

该过程仅包含Dynamic SQL(执行立即命令)。代码太大,无法粘贴(和机密)。

真正的动机是我想知道在插入/删除命令之前(在执行立即执行中)表中有多少条记录,以及在插入/删除操作之后它包含多少条记录。

我想将过程的日志存储在另一个表(一种日志表)中,该表记录从正在操作的表中插入/删除的行数。

e.g。

PROCEDURE_NAME         OP_TYPE    RUN_DATE             RECORDS_BEFORE   RECORDS_AFTER
Name of the procedure  Type of    Operation Performed  1103929          1112982

程序正文。

create or replace procedure vector as 

begin

-- select count(*) from some_table 

execute immediate 'delete from some_table
where trunc(creation_date) >= trunc(sysdate) - 7';

execute immediate 'insert into log_table values
(''Procedure Name'',''Insert'', sysdate,''....'')';

-- select count(*) from some_table

execute immediate 'insert into some_table ....';

execute immediate 'insert into log_table values
(''Procedure Name'',''Insert'', sysdate,''....'')';

-- select count(*) from some_table

end vector;

基本要求:我希望将some_table的count(*)插入到log_table中。

1 个答案:

答案 0 :(得分:1)

您想要获得哪些数据?

如果它是受命令影响的行数 - 它应该在SQL%ROWCOUNT中(在执行每个单独的命令之后。它不会"总和"过程中的所有修改,如果这样是你需要的 - 你必须在每次插入/删除/更新后手动加总它。

但是,如果你想拥有表格中的总行数 - 你应该运行一个

SELECT count(*) from TABNAME

执行命令之前和之后(性能命中)。

您还可以将两者结合使用 - 在过程开始时运行计数(),并使用SQL%ROWCOUNT计算您修改的行数,并假设该表现在已计数() - rowcount(删除)。

请记住默认情况下,Oracle会在执行count(*)查询时(执行当前事务命令之后)显示表中的记录数,因此您将看到的更改不使用rowcount可能包含并发更改。有关Oracle隔离级别http://www.oracle.com/technetwork/issue-archive/2005/05-nov/o65asktom-082389.html的更多信息,请参阅。

此外 - 在您运行计数(*)查询和"删除"之间可能会发生并发更改。 /"更新" - 请考虑在特定情况下可能出现的情况。

如果您想要更详细/代码审查 - 更新您执行的过程/查询的相关部分。