遊標current of cur特性

dotaddjj發表於2012-01-17

有關遊標的current of特性使用,建立測試表test001

create table test001(id number, user_name varchar2(20));
insert into test001 values(1, 'hzk');
insert into test001 values(2, 'zak');
insert into test001 values(3, 'zaglzd');

commit;

需要把每行id自增長10,遍歷遊標fetch到變數中

可以利用如下pl/sql程式塊進行處理

declare

v_ab test001%rowtype;

cursor cur01 is select * from test001;

begin

open cur01;

loop

fetch cur01 into v_ab;

update test001 set id=id+10 where user_name=v_ab.user_name;

exit when cur01%notfound;

commit;

end loop;

end;

/

此時我們利用遊標的where current of cur01對遊標讀取的所在行進行更新和刪除。

而利用遊標的current of特性可以很方便的處理updatedelete操作取出表中游標最近賦值的資料,當然要使用這個特性也需要在宣告遊標時使用for update子串,而返回的資料行將處於row-level獨佔式鎖定,其他session只能查詢不能修改。

create or replace procedure procedure02

as

cursor cur01 is select * from test001 for update;

v_ab test001%rowtype;

begin

open cur01;

loop

fetch cur01 into v_ab;

exit when cur01%notfound;

update test001 set id=id+10 where current of cur01;

end loop;

commit;

end;

這裡從sql語言特點說一下sql語句的一些概念問題:

Sql語句採用集合操作方式,對資料處理是成組進行的,不過執行sql語句確是應用程式逐條發出,資料庫伺服器逐條執行的,採用pl/sql封裝sql語句則可以降低傳送請求次數,減少網路傳輸,提高效能。

這倒想起了很早之前的pub的帖子中一個sql最佳化,說到是多個sql語句,某位大牛直接把sql語句封裝到pl/sql中,其餘沒做什麼改變,當時真是想不通為什麼會這樣,減少網路開銷,直接處理pl/sql塊,減少逐條處理sql語句,看來直接封裝到pl/sql中倒是最簡單可能也是最有效的最佳化。

Select語句,也就是查詢語句

Dml也就是資料操縱語言,改變資料庫資料

Tcl也就是事務控制語言,用於提交回滾事務,commitrollbacksavepoint

Ddl也就是資料定義語言,用於建立 修改 刪除物件,create alter drop

Dcl資料控制語言,用於授權和回收許可權,grantrevoke

這裡近段時間的懶散,還是提醒下自己:心沉下去,切忌浮誇!

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1057155/,如需轉載,請註明出處,否則將追究法律責任。

相關文章