游標是系統為使用者開設的乙個資料緩衝區,存放sql語句的執行結果。由系統或使用者以變數的形式定義。使用者可以用sql語句逐一從游標中獲取記錄,並賦給主變數,交由主語言進一步處理,主語言是面向記錄的,一組主變數一次只能存放一條記錄在某些情況下,需要把資料從存放在磁碟的表中調到計算機記憶體中進行處理,最後將處理結果顯示出來或最終寫回資料庫。這樣資料處理的速度才會提高,否則頻繁的磁碟資料交換會降低效率。用資料庫語言來描述游標就是對映在結果集中一行資料上的位置實體,有了游標,使用者就可以訪問結果集中的任意一行資料了,將游標放置到某行後,即可對該行資料進行操作,例如提取當前行的資料等。
游標有兩種型別:顯式游標和隱式游標。在程式中用到的select...into...查詢語句,一次只能從資料庫中提取一行資料,對於這種形式的查詢和觸發器操作,系統都會使用乙個隱式游標。但是如果要提取多行資料,就要由程式設計師定義乙個顯式游標,並通過與游標有關的語句進行處理。顯式游標對應乙個返回結果為多行多列的select語句。
游標一旦開啟,資料就從資料庫中傳送到游標變數中,然後應用程式再從游標變數中分解出需要的資料,並進行處理。以下將通過詳細的例子為您介紹顯式游標和隱式游標。
顯式游標:
1 定義游標
cursor cur_name p1,p2,...
isselect語句
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
isselect 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 變數;
在變數宣告部分定義的游標是靜態的,不能在程式執行過程中修改。雖然可以通過引數傳遞來取得不同的資料,但還是有很大的侷限性。通過採用動態游標,可以在程式執行階段隨時生成乙個查詢語句作為游標。要使用動態游標需要先定義乙個游標型別,然後宣告乙個游標變數,游標對應的查詢語句可以在程式的執行過程中動態地說明。
mysql隱式游標 全面解析資料庫中游標的使用方法
游標是系統為使用者開設的乙個資料緩衝區,存放sql語句的執行結果。由系統或使用者以變數的形式定義。使用者可以用sql語句逐一從游標中獲取記錄,並賦給主變數,交由主語言進一步處理,主語言是面向記錄的,一組主變數一次只能存放一條記錄在某些情況下,需要把資料從存放在磁碟的表中調到計算機記憶體中進行處理,最...
資料庫中游標的使用
1.為何使用游標 使用游標 cursor 的乙個主要的原因就是把集合操作轉換成單個記錄處理方式。用sql語言從資料庫中檢索資料後,結果放在記憶體的一塊區域中,且結果往往是乙個含有多個記錄的集合。游標機制允許使用者在sql server內逐行地訪問這些記錄,按照使用者自己的意願來顯示和處理這些記錄。2...
ORACLE中游標的使用方法
游標被用的最多的是在儲存過程中執行批量修改或是批量刪除操作,比如刪除一條主表記錄之後,可以執行乙個儲存過程刪除該記錄對應的明細記錄。或者修改某張表的某個資料後反寫另一張表的資料。這在erp軟體開發中是經常用到的,例如出庫單實提之後要反寫合同上的實提重量等等,這也要靠好的資料庫設計來支援。下面是乙個o...