Oracle中判断空游标的方法
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
聲明:本文是在看完一個(gè)帖子,經(jīng)過自己測試驗(yàn)證后得出來的一些結(jié)論,如果大家有更好的解決辦法,可以留言,如有錯(cuò)誤請指出。謝謝~
1、聲明包
create or replace package TAL_TEST is-- Author : ADMINISTRATOR-- Created : 2012/12/9 15:15:38-- Purpose : XXXX的測試TYPE myCursorType IS REF CURSOR;--測試空游標(biāo)PROCEDURE p_testEmptyCursor;end TAL_TEST;2、包體
create or replace package body TAL_TEST is--測試空游標(biāo)PROCEDURE p_testEmptyCursorISrowRecord SJ_CD_PERIODS%ROWTYPE;myCursorFirst myCursorType ;myCursorSecond myCursorType;myCursorThird myCursorType;myCursorForth myCursorType;BEGIN --使用notfound(失敗) 數(shù)據(jù)庫中不存在限制條件下的數(shù)據(jù)集 OPEN myCursorFirst FORSELECT A.* FROM SJ_CD_PERIODS A WHERE A.FPERIODID = '1001' ;IF myCursorFirst%notfound THENdbms_output.put_line('數(shù)據(jù)庫中不存在FPERIODID為1001的數(shù)據(jù)集');ELSEdbms_output.put_line('數(shù)據(jù)庫中存在FPERIODID為1001的數(shù)據(jù)庫');END IF;--使用ROWCOUNT(失敗)數(shù)據(jù)庫中存在限制條件下的數(shù)據(jù)集OPEN myCursorSecond FORSELECT A.* FROM SJ_CD_PERIODS A WHERE A.FPERIODID = '20112012141202260210001003001002002';IF myCursorSecond%ROWCOUNT = 0 THEN dbms_output.put_line('數(shù)據(jù)庫中不存在FPERIODID為20112012141202260210001003001002002的數(shù)據(jù)集');ELSEdbms_output.put_line('數(shù)據(jù)庫中存在FPERIODID為20112012141202260210001003001002002的數(shù)據(jù)集');END IF;--使用FETCH(成功)數(shù)據(jù)庫中存在限制條件下的數(shù)據(jù)集OPEN myCursorThird FORSELECT A.* FROM SJ_CD_PERIODS A WHERE A.FPERIODID = '20112012141202260210001003001002002';FETCH myCursorThird INTO rowRecord; IF myCursorThird%NOTFOUND THENdbms_output.put_line('數(shù)據(jù)庫中不存在FPERIODID為20112012141202260210001003001002002的數(shù)據(jù)集');ELSEdbms_output.put_line('數(shù)據(jù)庫中存在FPERIODID為20112012141202260210001003001002002的數(shù)據(jù)集');END IF;--使用FETCH(成功)數(shù)據(jù)庫中不存在限制條件下的數(shù)據(jù)集OPEN myCursorForth FORSELECT A.* FROM SJ_CD_PERIODS A WHERE A.FPERIODID = '1001';FETCH myCursorForth INTO rowRecord; IF myCursorForth%NOTFOUND THENdbms_output.put_line('數(shù)據(jù)庫中不存在FPERIODID為1001的數(shù)據(jù)集');ELSEdbms_output.put_line('數(shù)據(jù)庫中存在FPERIODID為1001的數(shù)據(jù)集');END IF; END;end TAL_TEST;3、下面對上述的測試進(jìn)行說明
myCursorFirst:
--使用notfound(失敗) 數(shù)據(jù)庫中不存在限制條件下的數(shù)據(jù)集 OPEN myCursorFirst FORSELECT A.* FROM SJ_CD_PERIODS A WHERE A.FPERIODID = '1001' ;IF myCursorFirst%notfound THENdbms_output.put_line('數(shù)據(jù)庫中不存在FPERIODID為1001的數(shù)據(jù)集');ELSEdbms_output.put_line('數(shù)據(jù)庫中存在FPERIODID為1001的數(shù)據(jù)庫');END IF;在我的數(shù)據(jù)庫中是不存在編號'1001'的數(shù)據(jù)集的。但在調(diào)試代碼的時(shí)候:
程序運(yùn)行不正確。
說明:其實(shí)上述的IF語句就有問題myCursorFirst%notFound肯定為Flase
myCursorSecond:
--使用ROWCOUNT(失敗)數(shù)據(jù)庫中存在限制條件下的數(shù)據(jù)集OPEN myCursorSecond FORSELECT A.* FROM SJ_CD_PERIODS A WHERE A.FPERIODID = '20112012141202260210001003001002002';IF myCursorSecond%ROWCOUNT = 0 THEN dbms_output.put_line('數(shù)據(jù)庫中不存在FPERIODID為20112012141202260210001003001002002的數(shù)據(jù)集');ELSEdbms_output.put_line('數(shù)據(jù)庫中存在FPERIODID為20112012141202260210001003001002002的數(shù)據(jù)集');END IF;在我的數(shù)據(jù)庫中是存在上述標(biāo)號的數(shù)據(jù)集的。但在調(diào)試代碼的時(shí)候:
程序運(yùn)行不正確。
說明:當(dāng)游標(biāo)不FETCH.%ROWCOUNT屬性就一直是0,所以根據(jù)這個(gè)判斷是沒有用的。一般都是先Fetch一下,執(zhí)行完Fetch操作后,再利用%NOTFOUND判斷Cursor中有沒有數(shù)據(jù)。于是就有了下面的兩個(gè)測試。
myCursorThird
--使用FETCH(成功)數(shù)據(jù)庫中存在限制條件下的數(shù)據(jù)集OPEN myCursorThird FORSELECT A.* FROM SJ_CD_PERIODS A WHERE A.FPERIODID = '20112012141202260210001003001002002';FETCH myCursorThird INTO rowRecord; IF myCursorThird%NOTFOUND THENdbms_output.put_line('數(shù)據(jù)庫中不存在FPERIODID為20112012141202260210001003001002002的數(shù)據(jù)集');ELSEdbms_output.put_line('數(shù)據(jù)庫中存在FPERIODID為20112012141202260210001003001002002的數(shù)據(jù)集');END IF;我的數(shù)據(jù)庫中存在上述的數(shù)據(jù)集,程序運(yùn)行的結(jié)果為:
程序運(yùn)行成功。
myCursorForth:
--使用FETCH(成功)數(shù)據(jù)庫中不存在限制條件下的數(shù)據(jù)集OPEN myCursorForth FORSELECT A.* FROM SJ_CD_PERIODS A WHERE A.FPERIODID = '1001';FETCH myCursorForth INTO rowRecord; IF myCursorForth%NOTFOUND THENdbms_output.put_line('數(shù)據(jù)庫中不存在FPERIODID為1001的數(shù)據(jù)集');ELSEdbms_output.put_line('數(shù)據(jù)庫中存在FPERIODID為1001的數(shù)據(jù)集');END IF;我的數(shù)據(jù)庫中不存在1001的數(shù)據(jù)集。程序運(yùn)行的結(jié)果為:
程序運(yùn)行正確。
總結(jié):在昨晚和喜姣討論的時(shí)候,我還以為Oracle中有提供直接判斷cursor是否為空的函數(shù),今天來在網(wǎng)上搜索了一下,貌似沒有。對于cursor來說,只Open,不Fetch的時(shí)候,Cursor是不會(huì)知道到底有多少數(shù)據(jù)的。當(dāng)然你也可以select count(*)......
歡迎指出錯(cuò)誤。
參考帖子:http://bbs.csdn.net/topics/370107459
?
?
?
?
轉(zhuǎn)載于:https://my.oschina.net/eillenme/blog/94759
總結(jié)
以上是生活随笔為你收集整理的Oracle中判断空游标的方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: window.open 打开新窗口被拦截
- 下一篇: Reading papers_15(Gr