我想返回在存储过程中执行操作之前和之后的记录数。我查找了一个应该用于返回表中行数的函数。但是,它无法运作。有什么帮助吗?
类似: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中。
答案 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的更多信息,请参阅。
此外 - 在您运行计数(*)查询和"删除"之间可能会发生并发更改。 /"更新" - 请考虑在特定情况下可能出现的情况。
如果您想要更详细/代码审查 - 更新您执行的过程/查询的相关部分。