<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    PL/SQL中用光標查詢多條記錄

    一、 什么是光標

    Oracle 使用兩種光標:顯式光標和隱式光標。不管語句返回多少條紀錄, PL/SQL 為使用的每一條 UPDATE 、 DELETE 和 INSERT 等 SQL 命令隱式的聲明一個光標。(要管理 SQL 語句的處理,必須隱式的給它定義一個光標。)用戶聲明并使用顯示光標處理 SELECT 語句返回的多條記錄。顯示的定義光標一種結構,它使用戶能夠為特定的語句指定內存區(qū)域,以便以后使用。

    二、 光標的作用

    當 PL/SQL 光標查詢返回多行數(shù)據(jù)時,這些記錄組被稱為活動集。 Oracle 將這種活動集存儲在您創(chuàng)建的顯示定義的已命名的光標中。Oracle 光標是一種用于輕松的處理多行數(shù)據(jù)的機制,沒有光標, Oracle 開發(fā)人員必須單獨地、顯式地取回并管理光標查詢選擇的每一條記錄。

    光標的另一項功能事,它包含一個跟蹤當前訪問的記錄的指針,這使您的程序能夠一次處理多條記錄。

    三、 使用顯示光標的基本方法

    步驟如下:

    1 、聲明光標

    聲明光標的語法如下:

    DECLARE cursor_name

    Is

    SELECT statement

    其中, cursor_name 是您給光標指定的名稱; SELECT statement 是給光標活動集返回記錄的查詢。

    聲明光標完成了下面兩個目的:

    給光標命名;

    將一個查詢與光標關聯(lián)起來。

    值得注意的是,必須在 PL/SQL 塊的聲明部分聲明光標;給光標指定的名稱是一個未聲明的標識符,而不是一個 PL/SQL 變量,不能給光標名稱賦值,也不能將它用在表達式中。 PL/SQL 塊使用這個名稱來引用光標查詢。

    例: DECLARE

    CURSOR c1

    Is

    SELECT VIEW_NAME FROM ALL_VIEWS

    WHERE ROWNUM<=10 ;

    另外還可以在光標定義語句中聲明光標的參數(shù),例:

    CURSOR c1 ( view _nbr number )

    Is

    SELECT VIEW_NAME FROM ALL_VIEWS

    WHERE ROWNUM<= view _nbr ;

    光標參數(shù)只對相應的光標是可見的,不能在光標范圍之外引用該光標的參數(shù)。如果試圖這樣做, Oracle 將返回一個錯誤,指出該變量沒有定義。

    2 、打開光標

    打開光標的語法如下:

    OPEN cursor_name ;

    其中 cursor_name 是您以前定義的光標名稱。

    打開光標將激活查詢并識別活動集,可是在執(zhí)行光標取回命令之前,并沒有真正取回記錄。 OPEN 命令還初始化了光標指針,使其指向活動集的第一條記錄。光標被打開后,直到關閉之前,取回到活動集的所有數(shù)據(jù)都是靜態(tài)的,換句話說,光標忽略所有在光標打開之后,對數(shù)據(jù)執(zhí)行的 SQL DML 命令( INSERT 、 UPDATE 、 DELETE 和 SELECT )。因此只有在需要時才打開它,要刷新活動集,只需關閉并重新打開光標即可。

    3 、從光標中取回數(shù)據(jù)

    FETCH 命令以每次一條記錄的方式取回活動集中的記錄。通常將 FETCH 命令和某種迭代處理結合起來使用,在迭代處理中, FETCH 命令每執(zhí)行一次,光標前進到活動集的下一條記錄。

    FETCH 命令的語法:

    FETCH cursor_name INTO record_list ;

    其中, cursor_name 是前面定義的光標的名稱; record_list 是變量列表,它接受活動集中的列。 FETCH 命令將活動集的結果放置到這些變量中。

    執(zhí)行 FETCH 命令后,活動集中的結果被取回到 PL/SQL 變量中,以便在 PL/SQL 塊中使用。每取回一條記錄,光標的指針就移向活動集的下一條記錄。

    例:

    FETCH C1 INTO VNAME;

    WHILE C1%FOUND LOOP

    DBMS_OUTPUT.PUT_LINE(TO_CHAR(C1%ROWCOUNT)||' '||VNAME);

    END LOOP;

    其中,使用屬性 '%FOUND' 使得當 FETCH 到達活動集的結尾時,不會引發(fā)異常。其它屬性及含義見下表:

    屬性 含量

    %FOUND 布爾型屬性,當最近一次該記錄時成功返回,則值為 TRUE

    %NOTFOUND 布爾型屬性,它的值總與 %FOUND 屬性的值相反

    %ISOPEN 布爾型屬性,當光標是打開時返回 TRUE

    %ROWCOUNT 數(shù)字型屬性,返回已從光標中讀取的記錄數(shù)

    屬性 含量

    %FOUND 布爾型屬性,當最近一次該記錄時成功返回,則值為 TRUE

    %NOTFOUND 布爾型屬性,它的值總與 %FOUND 屬性的值相反

    %ISOPEN 布爾型屬性,當光標是打開時返回 TRUE

    %ROWCOUNT 數(shù)字型屬性,返回已從光標中讀取的記錄數(shù)

    4 、關閉光標

    CLOSE 語句關閉以前打開的光標,使得活動集不確定。當用戶的程序或會話結束時, Oracle 隱式關閉光標。光標被關閉后,就不能對它執(zhí)行任何操作了 , 否則將引發(fā)異常。

    CLOSE 語句的語法是:

    CLOSE cursor_name ;

    其中, cursor_name 是以前打開的光標的名稱。

    完整的程序代碼如下:

    DECLARE

    CURSOR C1 IS SELECT VIEW_NAME FROM ALL_VIEWS

    WHERE ROWNUM<=10

    ORDER BY VIEW_NAME;

    VNAME VARCHAR2(40);

    BEGIN

    OPEN C1;

    FETCH C1 INTO VNAME;

    WHILE C1%FOUND LOOP

    DBMS_OUTPUT.PUT_LINE(TO_CHAR(C1%ROWCOUNT)||''||VNAME);

    END LOOP;

    END;

    …… CLOSE C1;

    四、 小結

    光標是一種結構 , 能夠以一次一條記錄的方式處理多行查詢的結果 . 為每條 DML 語句創(chuàng)建隱式光標 , 而顯式光標是由用戶創(chuàng)建的 , 以便處理返回多條記錄的查詢。而且 , 通過消除反復地分析代碼 , 光標提高了代碼的處理速度。

    posted on 2008-03-17 15:55 liujg 閱讀(292) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統(tǒng)計

    常用鏈接

    留言簿(1)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    相冊

    收藏夾

    boddiy

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 精品免费久久久久久久| 免费女人高潮流视频在线观看 | 无码精品A∨在线观看免费| 亚洲国产一区在线| 99re热精品视频国产免费| 久久亚洲AV成人无码电影| 日本免费一区二区三区| 久久综合亚洲色HEZYO社区| 免费在线观看h片| 亚洲色偷偷色噜噜狠狠99 | 国产在线播放免费| 日韩一级片免费观看| 亚洲午夜成人精品电影在线观看| 本道天堂成在人线av无码免费 | 亚洲色偷偷偷网站色偷一区| av免费不卡国产观看| 亚洲www77777| 免费在线观看毛片| 最近免费中文字幕中文高清| 亚洲图片一区二区| a毛片基地免费全部视频| 国产亚洲综合久久| 日韩亚洲欧洲在线com91tv| 久草视频在线免费| 国产精品亚洲专区无码牛牛| 久久久亚洲精品蜜桃臀| 久久午夜夜伦鲁鲁片免费无码影视| 国产99在线|亚洲| 亚洲区日韩区无码区| 久久久久久久久久国产精品免费| 亚洲丰满熟女一区二区v| 搡女人免费视频大全| 无码毛片一区二区三区视频免费播放 | 中文字幕亚洲免费无线观看日本 | 亚洲中文字幕日产乱码高清app| 国产在线精品免费aaa片| 亚洲avav天堂av在线网爱情| 免费在线观看黄色毛片| 青青草原1769久久免费播放| 在线观看亚洲AV日韩A∨| 一本色道久久综合亚洲精品高清|