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代碼