起因:新開發個儲存過程,需要當乙個使用者呼叫儲存過程操作一行資料時,另外的使用者不允許呼叫過程操作該資料。
解決辦法:先將該記錄的狀態改為處理中,當別的使用者看到為處理中時則跳出過程。此時用到了sql%rowcount來判斷是否更新了記錄的狀態
update table t set t.status = 'processing' where t.id = p_id and t.status <> 'processing' ;
if sql%rowcount = 0 then
return;
end if;
由於沒有用過sql%rowcount,所以特意測試了一下,下面是對sql%rowcount功能的測試:
--先建個測試用表
create table z_temp
( c1 varchar2(10),
c2 varchar2(10),
c3 varchar2(10)
);
--向表中插入3行測試資料,插入後:
c1 c2 c3
---------- ---------- ----------
1
2
3
寫了一段過程來測試:
declare
v_n number;
begin
update z_temp t set t.c2 = '1' where t.c1 = 1; --更新一行記錄 c1 = 1
v_n := sql%rowcount;
dbms_output.put_line('第1.0次:' || v_n);
commit;
v_n := sql%rowcount;
dbms_output.put_line('第1.1次:' || v_n);--提交後sql%rowcounty已經為0了
update z_temp t set t.c2 = '2' where t.c1 = 2; --更新一行記錄 c1 = 2
v_n := sql%rowcount;
dbms_output.put_line('第2次:' || v_n);
update z_temp t set t.c2 = '3'; --更新三行記錄
v_n := sql%rowcount;
dbms_output.put_line('第3次:' || v_n);
commit;
end;
/*輸出結果:
第1.0次:1
第1.1次:0
第2次:1
第3次:3
*/
執行後表中資料:
c1 c2 c3
---------- ---------- ----------
1 3
2 3
3 3
由此可見sql%rowcount只會記錄未被提交的最後一條sql語句的影響行數。這點很重要,如果想統計多個sql的合計影響行數,就必須在每個sql後面,用乙個變數儲存當前的sql%rowcount。
oracle中累計求和 oracle累計求和
poj2001 shortest prefixes trie樹應用 沉迷wow又頹了兩天orz,暴雪爸爸要在國服出月卡了.這是要我好好學習嗎?趕緊來刷題了.oj 題目大意是求所有字串裡每乙個字元 硬體相關 jtag介面 jtag joint test action group,聯合測試行動小組 是一...
oracle中累計求和 oracle累計求和
oracle累計求和 將當前行某列的值與前面所有行的此列值相加,即累計求和 方法一 with t as select 1 val from dual union all select 3 from dual union all select 5 from dual union all select ...
Oracle中臨時表
最近考慮到我們的資料庫端寫儲存過程關於臨時表使用的情況,由於我們 現在還不清楚資料庫端到底是怎麼處理的,是否和sql server的處理方式相 同,是否會存在隱患等等一些問題,為了避免將來不必要的麻煩我做了深 入的研究和檢視了一些權威的資料,現在和大家共享,希望大家在處理 oracle臨時表是注意一...