程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> 解析數據庫中游標的使用方法

解析數據庫中游標的使用方法

編輯:關於MYSQL數據庫
游標是系統為用戶開設的一個數據緩沖區,存放SQL語句的執行結果。由系統或用戶以變量的形式定義。用戶可以用SQL語句逐一從游標中獲取記錄,並賦給主變量,交由主語言進一步處理,主語言是面向記錄的,一組主變量一次只能存放一條記錄在某些情況下,需要把數據從存放在磁盤的表中調到計算機內存中進行處理,最後將處理結果顯示出來或最終寫回數據庫。這樣數據處理的速度才會提高,否則頻繁的磁盤數據交換會降低效率。用數據庫語言來描述游標就是映射在結果集中一行數據上的位置實體,有了游標,用戶就可以訪問結果集中的任意一行數據了,將游標放置到某行後,即可對該行數據進行操作,例如提取當前行的數據等。

  游標有兩種類型:顯式游標和隱式游標。在程序中用到的SELECT...INTO...查詢語句,一次只能從數據庫中提取一行數據,對於這種形式的查詢和觸發器操作,系統都會使用一個隱式游標。但是如果要提取多行數據,就要由程序員定義一個顯式游標,並通過與游標有關的語句進行處理。顯式游標對應一個返回結果為多行多列的SELECT語句。

  游標一旦打開,數據就從數據庫中傳送到游標變量中,然後應用程序再從游標變量中分解出需要的數據,並進行處理。以下將通過詳細的例子為您介紹顯式游標和隱式游標。

顯式游標:

  1 定義游標

CURSOR CUR_NAME P1,P2,...

  IS

  SELECT語句

  --------------------

  A. 該SELECT語句不可以是SELECT..INTO..語句.

  B. 游標可以有參數,這些參數用來參與SELECT中的WHERE條件.

  2 打開游標: OPEN CUR_NAME P1,P2,...

  A. 如果有參數,則首先見實際參數傳遞給SELECT語句

  B. 執行SELECT語句.其結果將存在游標中,並且可以用游標名來進行控制.

  3 獲取數據: FETCH CUR_NAME INTO 變量;

  A. FETCH從第一行數據開始,每FETCH一行數據,自動跳到下一行.直到FETCH了最後一行數據為止.

  B. 如果使用普通變量來獲取數據,那麼,應該根據游標結構中的字段來定義變量.

  此時,變量列表與游標中的字段列表在類型,順序,個數上一致.

  C. 也可以使用記錄變量來獲取數據. "記錄變量 游標名%ROWTYPE";

  此時,該記錄變量的結構與游標的結構完全一致.(注意,此處最好不要用表名).

  4 關閉游標: CLOSE CUR_NAME;

  例 查詢7788的員工姓名,職務,工資.

DECLARE   V_ENAME EMP.ENAME%TYPE;   V_JOB EMP.JOB%TYPE;   -----------------------   --1.   CURSOR CUR_EMP   IS   SELECT ENAME,JOB FROM EMP WHERE EMPNO = 7788;   BEGIN   --2.   OPEN CUR_EMP;   --3.   FETCH CUR_EMP INTO V_ENAME,V_JOB;   DBMS_OUTPUT.PUT_LINE(V_ENAME||' '||V_JOB);   --4.   CLOSE CUR_EMP;   END;

  當系統使用一個隱式游標時,可以通過隱式游標的屬性來了解操作的狀態和結果,進而控制程序的流程。隱式游標可以使用名字SQL來訪問,但要注意,通過SQL游標名總是只能訪問前一個處理操作或單行SELECT操作的游標屬性。所以通常在剛剛執行完操作之後,立即使用SQL游標名來訪問屬性。游標的屬性有四種,分別是SQL %ISOPEN,SQL %FOUND,SQL %NOTFOUND,SQL %ROWCOUNT。

  SQL%ISOPEN返回的類型為布爾型,判斷游標是否被打開,如果打開%ISOPEN等於true,否則等於false,即執行過程中為真,結束後為假.

  SQL%NOTFOUND返回值為布爾型,判斷游標所在的行是否有效,如果有效,則%FOUNDD等於true,否則等於false,即與%FOUND屬性返回值相反.

  SQL%FOUND返回值的類型為布爾型,值為TRUE代表插入 刪除 更新或單行查詢操作成功.

  SQL%ROWCOUNT返回值類型為整型,返回當前位置為止游標讀取的記錄行數,即成功執行的數據行數。

  記錄並不保存在數據庫中,它與變量一樣,保存在內存空間中,在使用記錄時候,要首先定義記錄結構,然後聲明記錄變量。可以把PL/SQL記錄看作是一個用戶自定義的數據類型。

  游標for循環示顯示游標的一種快捷使用方式,它使用for循環依次讀取結果集中的行數據,當form循環開始時,游標自動打開(不需要open),每循環一次系統自動讀取游標當前行的數據(不需要fetch),當退出for循環時,游標被自動關閉(不需要使用close)。使用游標for循環的時候不能使用open語句,fetch語句和close語句,否則會產生錯誤。

set serveroutput on;

  declare

cursor mycur(vartype number)is

  select emp_no,emp_zc from cus_emp_basic

  where com_no=vartype;

  begin

  for person in mycur(000627) loop

  dbms_output.put_line('編號:'||person.emp_no||',住址:'||person.emp_zc);

  end loop;

  end;

  顯式游標的使用總共分4個步驟:

  1.聲明游標

  在DECLEAR部分按以下格式聲明游標:

  CURSOR 游標名 參數1 數據類型...

  IS SELECT語句;

  參數是可選部分,所定義的參數可以出現在SELECT語句的WHERE子句中。如果定義了參數,則必須在打開游標時傳遞相應的實際參數。

  SELECT語句是對表或視圖的查詢語句,甚至也可以是聯合查詢。可以帶WHERE條件、ORDER BY或GROUP BY等子句,但不能使用INTO子句。在SELECT語句中可以使用在定義游標之前定義的變量。

  例:

DELCARE

  CURSOR C_EMP IS SELECT empno,ename,salary

  FROM emp   WHERE salary>1500

  ORDER BY ename;

  ........

  BEGIN

  在游標定義中SELECT語句中不一定非要表可以是視圖,也可以從多個表或視圖中選擇.

2.打開游標

  使用游標中的值之前應該首先打開游標,打開游標初始化查詢處理。打開游標的語法

  OPEN 游標名 實際參數1,...;

  打開游標時,SELECT語句的查詢結果就被傳送到了游標工作區。

  例:

  OPEN C_EMP;

3.提取數據

  從游標得到一行數據使用FETCH命令。每一次提取數據後,游標都指向結果集的下一

  FETCH cursor_name INTO variable,..

  對於SELECT定義的游標的每一列,FETCH變量列表都應該有一個變量與之相對應,變

  在可執行部分,按以下格式將游標工作區中的數據取到變量中。提取操作必須在打開游標之後進行。

  FETCH 游標名 INTO 變量名;

  或

  FETCH 游標名 INTO 記錄變量;

  游標打開後有一個指針指向數據區,FETCH語句一次返回指針所指的一行數據,要返回多行需重復執行,可以使用循環語句來實現。控制循環可以通過判斷游標的屬性來進行。

  下面對這兩種格式進行說明:

  第一種格式中的變量名是用來從游標中接收數據的變量,需要事先定義。變量的個數和類型應與SELECT語句中的字段變量的個數和類型一致。

  第二種格式一次將一行數據取到記錄變量中,需要使用%ROWTYPE事先定義記錄變量,這種形式使用起來比較方便,不必分別定義和使用多個變量。

  定義記錄變量的方法如下:

  變量名 表名|游標名%ROWTYPE;

  其中的表必須存在,游標名也必須先定義。

4.關閉游標

  CLOSE 游標名;

  例:

  CLOSE C_EMP;

  顯式游標打開後,必須顯式地關閉。游標一旦關閉,游標占用的資源就被釋放,游標變成無效,必須重新打開才能使用。

  Oracle支持動態SELECT語句和動態游標,動態的方法大大擴展了程序設計的能力。

  對於查詢結果為一行的SELECT語句,可以用動態生成查詢語句字符串的方法,在程序執行階段臨時地生成並執行,語法是:

  execute immediate 查詢語句字符串 into 變量;

  在變量聲明部分定義的游標是靜態的,不能在程序運行過程中修改。雖然可以通過參數傳遞來取得不同的數據,但還是有很大的局限性。通過采用動態游標,可以在程序運行階段隨時生成一個查詢語句作為游標。要使用動態游標需要先定義一個游標類型,然後聲明一個游標變量,游標對應的查詢語句可以在程序的執行過程中動態地說明。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved