Oracle 9i 遊標

來源:互聯網
上載者:User
  遊標是從資料表中提取出來的資料,以暫存資料表的形式存放在記憶體中,在遊標中有一個資料指標,在初始狀態下指向的是首記錄,利用fetch語句可以移動該指標,從而對遊標中的資料進行各種操作,然後將操作結果寫回資料表中。

定義遊標

    遊標作為一種資料類型,首先必須進行定義,其文法如下。
    cursor 遊標名 is select 語句;
    cursor是定義遊標的關鍵詞,select是建立遊標的資料表查詢命令。
    以scott使用者串連資料庫,在【SQLPlus Worksheet】中執行下列PL/SQL程式,該程式定義tempsal為與scott.emps資料表中的sal欄位類型相同的變數,mycursor為從scott.emp資料表中提取的sal大於tempsal的資料構成的遊標。
    執行結果如圖9.35所示。
    ―――――――――――――――――――――――――――――――――――――
    set serveroutput on
    declare
        tempsal scott.emp.sal%type;
        cursor mycursor is
            select * from scott.emp
            where sal>tempsal;
    begin
        tempsal:=800;
        open mycursor;
    end;
    ―――――――――――――――――――――――――――――――――――――
    【配套程式位置】:第9章\ cursordefine.sql。

開啟遊標

    要使用建立好的遊標,接下來要開啟遊標,文法結構如下:
    open 遊標名;
    開啟遊標的過程有以下兩個步驟:
    (1)將合格記錄送入記憶體。
    (2)將指標指向第一條記錄。

提取遊標資料

    要提取遊標中的資料,使用fetch命令,文法形式如下。
    fetch 遊標名 into 變數名1, 變數名2,……;
    或
    fetch 遊標名 into 記錄型變數名;
    在【SQLPlus Worksheet】中執行下列PL/SQL程式,該程式定義cursorrecord變數是遊標mycursor的記錄行變數,在遊標mycursor的結果中找到sal欄位大於800的第一個記錄,顯示deptno欄位的內容。
    執行結果如圖9.36所示。

    ―――――――――――――――――――――――――――――――――――――
    set serveroutput on
    declare
        tempsal scott.emp.sal%type;
        cursor mycursor is
            select * from scott.emp
            where sal>tempsal;
        cursorrecord mycursor%rowtype;
    begin
        tempsal:=800;
        open mycursor;
        fetch mycursor into cursorrecord;
        dbms_output.put_line(to_char(cursorrecord.deptno));
    end;
    ―――――――――――――――――――――――――――――――――――――
    【配套程式位置】:第9章\ cursorfetch.sql。

關閉遊標

    使用完遊標後,要關閉遊標,使用close命令,文法形式如下:
    close 遊標名;

遊標的屬性

    遊標提供的一些屬性可以協助編寫PL/SQL程式,遊標屬性的使用方法為:遊標名[屬性],例如mycursor%isopen,主要的遊標屬性如下。
    1. %isopen屬性
    該屬性功能是測試遊標是否開啟,如果沒有開啟遊標就使用fetch語句將提示錯誤。
    在【SQLPlus Worksheet】中執行下列PL/SQL程式,該程式利用%isopen屬性判斷遊標是否開啟。執行結果如圖9.37所示。
    ―――――――――――――――――――――――――――――――――――――
    set serveroutput on
    declare
       tempsal scott.emp.sal%type;
       cursor mycursor is
           select * from scott.emp
           where sal>tempsal;
       cursorrecord mycursor%rowtype;
     begin
       tempsal:=800;
       if mycursor%isopen then
           fetch mycursor into cursorrecord;
           dbms_output.put_line(to_char(cursorrecord.deptno));
       else
           dbms_output.put_line('遊標沒有開啟!');
       end if;
    end;
    ―――――――――――――――――――――――――――――――――――――
    【配套程式位置】:第9章\ isopenattribute.sql。

    2. %found屬性
    該屬性功能是測試前一個fetch語句是否有值,有值將返回true,否則為false。
    在【SQLPlus Worksheet】中執行下列PL/SQL程式。該程式利用%found屬性判斷遊標是否有資料。
    執行結果如圖9.38所示。
    ―――――――――――――――――――――――――――――――――――――
    set serveroutput on
    declare
        tempsal scott.emp.sal%type;
        cursor mycursor is
           select * from scott.emp
           where sal>tempsal;
        cursorrecord mycursor%rowtype;
    begin
        tempsal:=800;
        open mycursor;
            fetch mycursor into cursorrecord;
            if mycursor%found then
                dbms_output.put_line(to_char(cursorrecord.deptno));
            else
                dbms_output.put_line('沒有資料!');
            end if;
    end;
    ―――――――――――――――――――――――――――――――――――――
    【配套程式位置】:第9章\ foundattribute.sql。

    3. %notfound屬性
    該屬性是%found屬性的反邏輯,常被用於退出迴圈。
    在【SQLPlus Worksheet】中執行下列PL/SQL程式。該程式利用%notfound屬性判斷遊標是否沒有資料。
    執行結果如圖9.39所示。

    【配套程式位置】:第9章\ notfoundattribute.sql。

    4. %rowcount屬性
    該屬性用於返回遊標的資料行數。
    在SQLPlus Worksheet的【代碼編輯區】執行下列PL/SQL程式,該程式利用%rowcount屬性判斷遊標資料行數。
    執行結果如圖9.40所示。

    【配套程式位置】:第9章\ rowcountattribute.sql。
    若傳回值為0,表明遊標已經開啟,但沒有提取出資料。


相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。