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