oracle 隱式遊標,顯示遊標,遊標迴圈,動態SELECT語句和動態資料指標、異常等____oracle

來源:互聯網
上載者:User
遊標的概念:  
    遊標是SQL的一個記憶體工作區,由系統或使用者以變數的形式定義。遊標的作用就是用於臨時儲存從資料庫中提取的資料區塊。在某些情況下,需要把資料從存放在磁碟的表中調到電腦記憶體中進行處理,最後將處理結果顯示出來或最終寫回資料庫。這樣資料處理的速度才會提高,否則頻繁的磁碟資料交換會降低效率。 
遊標有兩種類型:顯式遊標和隱式遊標。在前述程式中用到的SELECT...INTO...查詢語句,一次只能從資料庫中提取一行資料,對於這種形式的查詢和DML操作,系統都會使用一個隱式遊標。但是如果要提取多行資料,就要由程式員定義一個顯式遊標,並通過與遊標有關的語句進行處理。顯式遊標對應一個返回結果為多行多列的SELECT語句。 
遊標一旦開啟,資料就從資料庫中傳送到遊標變數中,然後應用程式再從遊標變數中分解出需要的資料,並進行處理。 
隱式遊標  
如前所述,DML操作和單行SELECT語句會使用隱式遊標,它們是: 
* 插入操作:INSERT。 
* 更新操作:UPDATE。 
* 刪除操作:DELETE。 
* 單行查詢操作:SELECT ... INTO ...。 
當系統使用一個隱式遊標時,可以通過隱式遊標的屬性來瞭解操作的狀態和結果,進而控製程序的流程。隱式遊標可以使用名字SQL來訪問,但要注意,通過SQL遊標名總是只能訪問前一個DML操作或單行SELECT操作的遊標屬性。所以通常在剛剛執行完操作之後,立即使用SQL遊標名來訪問屬性。遊標的屬性有四種,如下所示。 
Sql代碼   隱式遊標的屬性 傳回值類型   意    義   SQL%ROWCOUNT    整型  代表DML語句成功執行的資料行數   SQL%FOUND   布爾型 值為TRUE代表插入、刪除、更新或單行查詢操作成功   SQL%NOTFOUND    布爾型 與SQL%FOUND屬性傳回值相反   SQL%ISOPEN  布爾型 DML執行過程中為真,結束後為假  
【訓練1】 使用隱式遊標的屬性,判斷對僱員工資的修改是否成功。 
步驟1:輸入和運行以下程式: 
Sql代碼   SET SERVEROUTPUT ON            BEGIN           UPDATE emp SET sal=sal+100 WHERE empno=1234;            IF SQL%FOUND THEN            DBMS_OUTPUT.PUT_LINE('成功修改僱員工資。');           COMMIT;            ELSE           DBMS_OUTPUT.PUT_LINE('修改僱員工資失敗。');            END IF;            END;  
運行結果為: 
Sql代碼   修改僱員工資失敗。           PL/SQL 過程已成功完成。  
步驟2:將僱員編號1234改為7788,重新執行以上程式: 
運行結果為: 
Sql代碼   成功修改僱員工資。           PL/SQL 過程已成功完成。  
說明:本例中,通過SQL%FOUND屬性判斷修改是否成功,並給出相應資訊。 
顯式遊標  
遊標的定義和操作 
遊標的使用分成以下4個步驟。 
1.聲明遊標  
在DECLEAR部分按以下格式聲明遊標: 
CURSOR 遊標名[(參數1 資料類型[,參數2 資料類型...])] 
IS SELECT語句; 
參數是可選部分,所定義的參數可以出現在SELECT語句的WHERE子句中。如果定義了參數,則必須在開啟遊標時傳遞相應的實際參數。 
SELECT語句是對錶或視圖的查詢語句,甚至也可以是聯集查詢。可以帶WHERE條件、ORDER BY或GROUP BY等子句,但不能使用INTO子句。在SELECT語句中可以使用在定義遊標之前定義的變數。 
2.開啟遊標  
在可執行部分,按以下格式開啟遊標: 
OPEN 遊標名[(實際參數1[,實際參數2...])]; 
開啟遊標時,SELECT語句的查詢結果就被傳送到了遊標工作區。 
3.提取資料  
在可執行部分,按以下格式將遊標工作區中的資料取到變數中。提取操作必須在開啟遊標之後進行。 
FETCH 遊標名 INTO 變數名1[,變數名2...]; 
或 
FETCH 遊標名 INTO 記錄變數; 
遊標開啟後有一個指標指向資料區,FETCH語句一次返回指標所指的一行資料,要返回多行需重複執行,可以使用迴圈語句來實現。控制迴圈可以通過判斷遊標的屬性來進行。 
下面對這兩種格式進行說明: 
第一種格式中的變數名是用來從遊標中接收資料的變數,需要事先定義。變數的個數和類型應與SELECT語句中的欄位變數的個數和類型一致。 
第二種格式一次將一行資料取到記錄變數中,需要使用%ROWTYPE事先定義記錄變數,這種形式使用起來比較方便,不必分別定義和使用多個變數。 
定義記錄變數的方法如下: 
變數名 表名|遊標名%ROWTYPE; 
其中的表必須存在,遊標名也必須先定義。 
4.關閉遊標  
CLOSE 遊標名; 
顯式遊標開啟後,必須顯式地關閉。遊標一旦關閉,遊標佔用的資源就被釋放,遊標變成無效,必須重新開啟才能使用。 
以下是使用顯式遊標的一個簡單練習。 
【訓練1】  用遊標提取emp表中7788僱員的名稱和職務。 
Sql代碼  
相關文章

聯繫我們

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

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

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.