詳解Oracle資料庫SQL%ROWCOUNT用法及實驗說明

2019-09-22     波波說運維

概述

最近在編寫一個存儲過程時,因為打算記錄一下每次刪除的記錄數,所以用了SQL%ROWCOUNT來實現,這裡簡單記錄下。


SQL%ROWCOUNT

SQL%ROWCOUNT是一個游標屬性,而SQL中的DML操作實際上是一種隱式的游標操作,在做INSERT,UPDATE,DELETE,MERGE以及SELECT INTO操作時,Oracle會打開一個始終指向最近執行的SQL語句的隱式游標,這個游標有3個常用的屬性:

(1)SQL%FOUND,有記錄被修改,返回TRUE

(2)SQL%NOTFOUND,沒有記錄被修改,返回TRUE

(3)SQL%ROWCOUNT,語句操作的記錄數


簡單做個實驗演示一下

1、數據準備


2、存儲過程

set serveroutput on
declare
begin
execute immediate 'alter session enable parallel dml';
delete /* parallel(t,4) */ from test1 t where id=1;
dbms_output.put_line('刪除語句刪除了'||SQL%ROWCOUNT||'條記錄'||CHR(10)
||'SQL%FOUND='||CASE SQL%FOUND WHEN TRUE THEN 'TRUE' ELSE 'FALSE' END||CHR(10)
||'SQL%NOTFOUND='||CASE SQL%NOTFOUND WHEN TRUE THEN 'TRUE' ELSE 'FALSE' END);
commit;
delete from test1 where id=2;
dbms_output.put_line('刪除語句刪除了'||SQL%ROWCOUNT||'條記錄'||CHR(10)
||'SQL%FOUND='||CASE SQL%FOUND WHEN TRUE THEN 'TRUE' ELSE 'FALSE' END||CHR(10)
||'SQL%NOTFOUND='||CASE SQL%NOTFOUND WHEN TRUE THEN 'TRUE' ELSE 'FALSE' END);
commit;
delete from test1;
dbms_output.put_line('刪除語句刪除了'||SQL%ROWCOUNT||'條記錄'||CHR(10)
||'SQL%FOUND='||CASE SQL%FOUND WHEN TRUE THEN 'TRUE' ELSE 'FALSE' END||CHR(10)
||'SQL%NOTFOUND='||CASE SQL%NOTFOUND WHEN TRUE THEN 'TRUE' ELSE 'FALSE' END);
commit;
execute immediate 'alter session disable parallel dml';
EXCEPTION
WHEN OTHERS THEN
ROLLBACK; --有問題回滾
end;
/


3、測試效果

可以看到很明顯記錄了刪除的記錄。


後面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注下!

文章來源: https://twgreatdaily.com/zh-sg/2_CmWG0BJleJMoPMVCoh.html