2014-08-29 62 views
0

我想返回在存儲過程中執行操作之前和之後的記錄數。我查了一個應該用於返回表中行數的函數。但是,它不工作。任何幫助?在Oracle中刪除/插入操作後返回記錄數

類似:Please check this link on DBA Stack Exchange

該過程只由動態SQL的(立即執行命令)。代碼太大,無法粘貼(並且保密)。

真正的動機是我想知道在插入/刪除命令(立即執行)之前表格有多少個記錄,以及在插入/刪除操作後它包含多少條記錄。

我想將過程的日誌存儲在另一個表(一種日誌表)中,該表保持跟蹤從正在操作的表中插入/刪除的行數。

例如

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

請根據您的預期行爲顯示您正在使用的程序並定義「無法使用」;你觀察到了什麼行爲;以及產生了什麼,如果有的話。 – 2014-08-29 13:45:19

+0

你需要擴大一點你想到的是什麼。如果你想得到一些受DML語句影響的記錄,可以使用'SQL%ROWCOUNT'隱式遊標屬性。爲了獲得之前的記錄數(爲什麼?),執行任何DML,您需要查詢一個表。 – 2014-08-29 13:47:00

回答

1

你想得到什麼數據?

如果它是受命令影響的行數 - 它應該在SQL%ROWCOUNT中(在執行每個單獨的命令之後,它不會「總結」過程中的所有修改,如果這是您需要的 - 每次插入/刪除/更新後,您都必須手動求和它)。

但是,如果你想在表中的行的總數 - 您應執行的命令(與它的性能命中)之前和之後運行

SELECT count(*) from TABNAME 

您也可以將二者結合起來 - 運行在你的程序的開始計數(),並使用SQL%ROWCOUNT來算你修改的行數,並承擔該表目前已擁有數() - 行數(刪除)。

請注意,默認情況下,Oracle會在執行count(*)查詢時(執行當前事務命令之後)向您顯示錶中的記錄數,因此您將看到的更改rowcount可能包含併發更改。有關更多信息,請閱讀Oracle隔離級別http://www.oracle.com/technetwork/issue-archive/2005/05-nov/o65asktom-082389.html

另外 - 運行計數(*)查詢和「刪除」/「更新」子句之間可能會有一個併發更改 - 請考慮可能在您的特定情況下發生的情況。

如果您想要更詳細的/代碼審查 - 更新您執行的過程/查詢的相關部分。