1. 程式人生 > >遊標的詳細用法

遊標的詳細用法

引用:https://www.cnblogs.com/xiaoliu66007/p/7495753.html

遊標的概念: 

    遊標是SQL的一個記憶體工作區,由系統或使用者以變數的形式定義。遊標的作用就是用於臨時儲存從資料庫中提取的資料塊。在某些情況下,需要把資料從存放在磁碟的表中調到計算機記憶體中進行處理,最後將處理結果顯示出來或最終寫回資料庫。這樣資料處理的速度才會提高,否則頻繁的磁碟資料交換會降低效率。 
遊標有兩種型別:顯式遊標和隱式遊標。在前述程式中用到的SELECT...INTO...查詢語句,一次只能從資料庫中提取一行資料,對於這種形式的查詢和DML操作,系統都會使用一個隱式遊標。但是如果要提取多行資料,就要由程式設計師定義一個顯式遊標,並通過與遊標有關的語句進行處理。顯式遊標對應一個返回結果為多行多列的SELECT語句。 
遊標一旦開啟,資料就從資料庫中傳送到遊標變數中,然後應用程式再從遊標變數中分解出需要的資料,並進行處理。 
隱式遊標 
如前所述,DML操作和單行SELECT語句會使用隱式遊標,它們是: 
* 插入操作:INSERT。 
* 更新操作:UPDATE。 
* 刪除操作:DELETE。 
* 單行查詢操作:SELECT ... INTO ...。 
當系統使用一個隱式遊標時,可以通過隱式遊標的屬性來了解操作的狀態和結果,進而控制程式的流程。隱式遊標可以使用名字SQL來訪問,但要注意,通過SQL遊標名總是隻能訪問前一個DML操作或單行SELECT操作的遊標屬性。所以通常在剛剛執行完操作之後,立即使用SQL遊標名來訪問屬性。遊標的屬性有四種,如下所示。 Sql程式碼 
  1. 隱式遊標的屬性 返回值型別   意    義   
  2. SQL%ROWCOUNT    整型  代表DML語句成功執行的資料行數   
  3. SQL%FOUND   布林型 值為TRUE代表插入、刪除、更新或單行查詢操作成功   
  4. SQL%NOTFOUND    布林型 與SQL%FOUND屬性返回值相反   
  5. SQL%ISOPEN  布林型 DML執行過程中為真,結束後為假  


【訓練1】 使用隱式遊標的屬性,判斷對僱員工資的修改是否成功。 
步驟1:輸入和執行以下程式: 

Sql程式碼 
  1. SET SERVEROUTPUT ON    
  2.         BEGIN  
  3.         UPDATE emp SET sal=sal+100 WHERE empno=1234;   
  4.          IF SQL%FOUND THEN    
  5.         DBMS_OUTPUT.PUT_LINE('成功修改僱員工資!');   
  6.         COMMIT;    
  7.         ELSE  
  8.         DBMS_OUTPUT.PUT_LINE('修改僱員工資失敗!');   
  9.          END IF;    
  10.         END;  


執行結果為: 

Sql程式碼 
  1. 修改僱員工資失敗!   
  2.         PL/SQL 過程已成功完成。  


步驟2:將僱員編號1234改為7788,重新執行以上程式: 
執行結果為: 

Sql程式碼 
  1. 成功修改僱員工資!   
  2.         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程式碼 
  1. SET SERVEROUTPUT ON  
  2.         DECLARE    
  3.          v_ename VARCHAR2(10);   
  4.          v_job VARCHAR2(10);   
  5.          CURSOR emp_cursor IS    
  6.          SELECT ename,job FROM emp WHERE empno=7788;   
  7.          BEGIN  
  8.      OPEN emp_cursor;   
  9.     FETCH emp_cursor INTO v_ename,v_job;   
  10.         DBMS_OUTPUT.PUT_LINE(v_ename||','||v_job);   
  11.         CLOSE emp_cursor;   
  12.         END;  


執行結果為: 

Sql程式碼 
  1. SCOTT,ANALYST   
  2.         PL/SQL 過程已成功完成。   


說明:該程式通過定義遊標emp_cursor,提取並顯示僱員7788的名稱和職務。 
作為對以上例子的改進,在以下訓練中採用了記錄變數。 
【訓練2】  用遊標提取emp表中7788僱員的姓名、職務和工資。 

Sql程式碼 
  1. SET SERVEROUTPUT ON  
  2.         DECLARE  
  3.          CURSOR emp_cursor IS  SELECT ename,job,sal FROM emp WHERE empno=7788;   
  4.          emp_record emp_cursor%ROWTYPE;   
  5.         BEGIN  
  6. OPEN emp_cursor;       
  7.         FETCH emp_cursor INTO emp_record;   
  8.            DBMS_OUTPUT.PUT_LINE(emp_record.ename||','|| emp_record.job||','|| emp_record.sal);   
  9.          CLOSE emp_cursor;   
  10.         END;  


執行結果為: 

Sql程式碼 
  1. SCOTT,ANALYST,3000   
  2.         PL/SQL 過程已成功完成。   


說明:例項中使用記錄變數來接收資料,記錄變數由遊標變數定義,需要出現在遊標定義之後。 
注意:可通過以下形式獲得記錄變數的內容: 
記錄變數名.欄位名。 
【訓練3】  顯示工資最高的前3名僱員的名稱和工資。 

Sql程式碼 
  1. SET SERVEROUTPUT ON  
  2.         DECLARE  
  3.          V_ename VARCHAR2(10);   
  4.         V_sal NUMBER(5);   
  5.         CURSOR emp_cursor IS  SELECT ename,sal FROM emp ORDER BY sal DESC;   
  6.         BEGIN  
  7.          OPEN emp_cursor;   
  8.          FOR I IN 1..3 LOOP   
  9.            FETCH emp_cursor INTO v_ename,v_sal;   
  10.          DBMS_OUTPUT.PUT_LINE(v_ename||','||v_sal);   
  11.           END LOOP;   
  12.          CLOSE emp_cursor;   
  13.          END;  


執行結果為: 

Sql程式碼 
  1. KING,5000   
  2.      SCOTT,3000   
  3.      FORD,3000   
  4.      PL/SQL 過程已成功完成。  


  說明:該程式在遊標定義中使用了ORDER BY子句進行排序,並使用迴圈語句來提取多行資料。 
遊標迴圈 
【訓練1】  使用特殊的FOR迴圈形式顯示全部僱員的編號和名稱。 

Sql程式碼 
  1. SET SERVEROUTPUT ON  
  2. DECLARE  
  3.   CURSOR emp_cursor IS    
  4.   SELECT empno, ename FROM emp;   
  5. BEGIN  
  6. FOR Emp_record IN emp_cursor LOOP      
  7.     DBMS_OUTPUT.PUT_LINE(Emp_record.empno|| Emp_record.ename);   
  8.     END LOOP;   
  9.     END;  


執行結果為: 

Sql程式碼 
  1. 7369SMITH   
  2. 7499ALLEN   
  3. 7521WARD   
  4. 7566JONES   
  5.          PL/SQL 過程已成功完成。  


  說明:可以看到該迴圈形式非常簡單,隱含了記錄變數的定義、遊標的開啟、提取和關閉過程。Emp_record為隱含定義的記錄變數,迴圈的執行次數與遊標取得的資料的行數相一致。 
【訓練2】  另一種形式的遊標迴圈。 

Sql程式碼 
  1. SET SERVEROUTPUT ON    
  2. BEGIN  
  3.  FOR re IN (SELECT ename FROM EMP)  LOOP   
  4.   DBMS_OUTPUT.PUT_LINE(re.ename)   
  5.  END LOOP;   
  6. END;  


執行結果為: 

Sql程式碼 
  1. SMITH   
  2. ALLEN   
  3. WARD   
  4. JONES  


    說明:該種形式更為簡單,省略了遊標的定義,遊標的SELECT查詢語句在迴圈中直接出現。 
顯式遊標屬性 
雖然可以使用前面的形式獲得遊標資料,但是在遊標定義以後使用它的一些屬性來進行結構控制是一種更為靈活的方法。顯式遊標的屬性如下所示。 

Sql程式碼 
  1. 遊標的屬性   返回值型別   意    義   
  2. %ROWCOUNT   整型  獲得FETCH語句返回的資料行數   
  3. %FOUND  布林型 最近的FETCH語句返回一行資料則為真,否則為假   
  4. %NOTFOUND   布林型 與%FOUND屬性返回值相反   
  5. %ISOPEN 布林型 遊標已經開啟時值為真,否則為假  


可按照以下形式取得遊標的屬性: 
遊標名%屬性 
要判斷遊標emp_cursor是否處於開啟狀態,可以使用屬性emp_cursor%ISOPEN。如果遊標已經開啟,則返回值為“真”,否則為“假”。具體可參照以下的訓練。 
【訓練1】  使用遊標的屬性練習。 

相關推薦

Oracle中游標詳細用法 隱式遊標 顯式遊標 異常處理 錯誤處理

  oracle中游標詳細用法 轉自:http://blog.csdn.net/liyong199012/article/details/8948952 遊標的概念:      遊標是SQL的一個記憶體工作區,由系統或使用者以變數的形式定義。遊

遊標詳細用法

引用:https://www.cnblogs.com/xiaoliu66007/p/7495753.html遊標的概念:     遊標是SQL的一個記憶體工作區,由系統或使用者以變數的形式定義。遊標的作用就是用於臨時儲存從資料庫中提取的資料塊。在某些情況下,需要把資料從存放在

Robot Framework自動化測試Selenium2Library庫詳細用法

www range fire 查看 int log world 定時 until 一、瀏覽器驅動 通過不同的瀏覽器執行腳本。 Open Browser Htpp://www.xxx.com chrome 瀏覽器對應的關鍵字: fi

sqlmap 詳細用法

amp per cor 攔截 按鈕 asc mss 人性化 order 1. 基礎用法: ./sqlmap.py -u “註入地址” -v 1 –dbs // 列舉數據庫./sqlmap.py -u “註入地址” -v 1 –current-db // 當前數據庫.

ios開發之--CAKeyframeAnimation的詳細用法

edi true nco 創建 rds repeat oval iat ima 簡單的創建一個帶路徑的動畫效果,比較粗糙,不過事先原理都是一樣的, 代碼如下: 1,創建動畫所需的view -(void)creatView { moveView = [UIView

Linux find、grep命令詳細用法

標準輸出 獲取參數 返回 管道 每一個 作用 實例 文件名 opts 在linux下面工作,有些命令能夠大大提高效率。本文就向大家介紹find、grep命令,他哥倆可以算是必會的linux命令,我幾乎每天都要用到他們。本文結構如下:find命令 find命令的一般形式

chmod命令詳細用法

com inux 管理者 資料 屬組 www 屬組用戶 字串 有用 轉載: 指令名稱 : chmod 使用權限 : 所有使用者 使用方式 : chmod [-cfvR] [--help] [--version] mode file... 說明 : Linux/Unix 的檔

批處理命令之Start的詳細用法

圖形用戶界面 用法 blog 中斷 空間 file 創建 單獨 詳細信息 Start啟動單獨的“命令提示符”窗口來運行指定程序或命令。如果在沒有參數的情況下使用,start 將打開第二個命令提示符窗口。語法start ["title"] [/dPat

select函數詳細用法解析

集合 cep 返回值 null 毫無 文件中 str 個數 for 1.表頭文件 #include #include #include 2.函數原型 int select(int n,fd_set * readfds,fd_set * writefds,fd_set * e

sed詳細用法及詳解

sed#語法:sed [options] ‘command‘ in_file[s] options 部分:-n 靜默輸出(不打印默認輸出) -e 給予sed多個命令的時候需要-e選項#sed -e ‘s/root/haha/g‘ -e ‘s/bash/wwwww/g‘ passwd > passwd.b

java statement詳細用法

給定 需要 bsp lec conn nec 類型 sta 繼承 轉載]java中Statement詳細用法 一,Statement的介紹 1,Statement 是 Java 執行數據庫操作的一個重要方法,用於在已經建立數據庫連接的基礎上,向數據庫發送要執行的SQL語句

C# DateTime.Now詳細用法

ont add 解釋 apr ddd date 顯示 () months //2008年4月24日 System.DateTime.Now.ToString("D"); //2008-4-24 System.DateTime.Now.ToString

chmod 權限 命令詳細用法

不可 chm 執行權限 控制 設定 ... strong -h 其他 指令名稱 : chmod 使用權限 : 所有使用者 使用方式 : chmod [-cfvR] [--help] [--version] mode file... 說明 : Linux/Unix 的檔案調用

Flask中的session詳細用法教程

添加 不存在 lin 字符 days 註意 family 服務 鍵值 **Flask session 概念解釋:** session 是基於cookie實現, 保存在服務端的鍵值對(形式為 {隨機字符串:‘xxxxxx’}), 同時在瀏覽器中的cookie中也對應一相

Tcpdump 的詳細用法

別名 device 是否 lin less 沒有 ice 好用 block 1、抓取回環網口的包:tcpdump -i lo 2、防止包截斷:tcpdump -s0 3、以數字顯示主機及端口:tcpdump -n 第一種是關於類型的關鍵字,主要包括host,net,p

Ubuntu命令的學習_crontab計劃任務_詳細用法

一個 get 系統負載 nta 一封信 com 文字編輯器 安排 pg1 轉自:https://www.cnblogs.com/aminxu/p/5993769.html 轉自:http://blog.chinaunix.net/uid-25785357-id-343434

C# DataTable的詳細用法

在專案中經常用到DataTable,如果DataTable使用得當,不僅能使程式簡潔實用,而且能夠提高效能,達到事半功倍的效果,現對DataTable的使用技巧進行一下總結。          一、Data

ShellExecute詳細用法(可以單獨開啟一個檔案)

hellExecute的功能是執行一個外部程式,或者開啟一個已註冊的檔案、開啟一個目錄、列印檔案等等功能,它可以開啟電腦內的任何檔案,也可以開啟URL。 函式的原型:   1 HINSTANCE ShellExecute( 2 HWND hwnd

mysqldumpslow簡單使用方法-mysqldumpslow詳細用法

慢查詢日誌分析工具mysqldumpslow經常使用的引數:-s,是order的順序----- al 平均鎖定時間-----ar 平均返回記錄時間-----at 平均查詢時間(預設)-----c 計數-----l 鎖定時間-----r 返回記錄-----t 查詢時間-t,是top n的意思,即為返回前面多少條

vue watch的詳細用法

在vue中,使用watch來響應資料的變化。watch的用法大致有三種。下面程式碼是watch的一種簡單的用法: <input type="text" v-model="cityName"/> new Vue({ el: '#root', data: { city