在執行DML(insert,update,delete)語(yǔ)句時(shí),可以用到以下三個(gè)隱式游標(游標是維護查詢(xún)結果的內存中的一個(gè)區域,運行DML時(shí)打開(kāi),完成時(shí)關(guān)閉,用sql%isopen檢查是否打開(kāi)):
sql%found (布爾類(lèi)型,默認值為null)
sql%notfound(布爾類(lèi)型,默認值為null)
sql%rowcount(數值類(lèi)型默認值為0)
sql%isopen(布爾類(lèi)型)
當執行一條DML語(yǔ)句后,DML語(yǔ)句的結果保存在四個(gè)游標屬性中,這些屬性用于控制程序流程或者了解程序的狀態(tài)。當運行DML語(yǔ)句時(shí),PL/SQL打開(kāi)一個(gè)內建游標并處理結果,游標是維護查詢(xún)結果的內存中的一個(gè)區域,游標在運行DML語(yǔ)句時(shí)打開(kāi),完成后關(guān)閉。隱式游標只使用SQL%FOUND,SQL%NOTFOUND,SQL%ROWCOUNT三個(gè)屬性.SQL%FOUND,SQL%NOTFOUND是布爾值,SQL%ROWCOUNT是整數值。
SQL%FOUND和SQL%NOTFOUND
在執行任何DML語(yǔ)句前SQL%FOUND和SQL%NOTFOUND的值都是NULL,在執行DML語(yǔ)句后,SQL%FOUND的屬性值將是:
. TRUE :INSERT
. TRUE :DELETE和UPDATE,至少有一行被DELETE或UPDATE.
. TRUE :SELECT INTO至少返回一行
當SQL%FOUND為T(mén)RUE時(shí),SQL%NOTFOUND為FALSE。
SQL%ROWCOUNT
在執行任何DML語(yǔ)句之前,SQL%ROWCOUNT的值都是NULL,對于SELECT INTO語(yǔ)句,如果執行成功,SQL%ROWCOUNT的值為1,如果沒(méi)有成功或者沒(méi)有操作(如update、insert、delete為0條),SQL%ROWCOUNT的值為0.
SQL%ISOPEN
SQL%ISOPEN是一個(gè)布爾值,如果游標打開(kāi),則為T(mén)RUE, 如果游標關(guān)閉,則為FALSE.對于隱式游標而言SQL%ISOPEN總是FALSE,這是因為隱式游標在DML語(yǔ)句執行時(shí)打開(kāi),結束時(shí)就立即關(guān)閉。
no_data_found 與sql%notfound 以及sql%rowcount 的區別:
NO_DATA_FOUND:該異??梢栽趦煞N不同的情況下出現:第一種:當SELECT。。。。INTO語(yǔ)的 WHERE子句 沒(méi)匹配任何數據行時(shí);第二種:試圖引用尚未賦值的PL/SQL index-by表元素時(shí)。
SQL%NOTFOUND:是隱匿游標的屬性,當沒(méi)有可檢索的數據時(shí),該屬性為:TRUE;常作為檢索循環(huán)退出的條件。若某UPDATE或DELETE語(yǔ)句的WHERE子句不匹配任何數據行,該屬性為:TRUE,但不并不出現NO_DATA_FOUND異常.
SQL%ROWCOUNT:該數字屬性返回了到目前為止,游標所檢索數據庫行的個(gè)數。
摘自 朱金托的專(zhuān)欄
聯(lián)系客服