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