資料庫基礎篇(二)儲存過程中游標的使用

2021-07-13 23:10:45 字數 2049 閱讀 2701

1.儲存過程中游標的使用

在儲存過程中執行查詢語句,有時候可能會查詢出很多條記錄,此時,如果想逐條讀取查詢結果集中的記錄,就需要使用游標(有的書上叫游標)。

接下來將介紹游標在儲存過程中的使用。

1)宣告游標

declare curemployee cursor for select name,address from employee;

注釋:curemployee

代表宣告的游標名。

2)開啟游標

open curemployee;

3)使用游標

fetch curemployee into _name,_address;

注釋:上面**段的意思是使用名為curemployee

的游標,將查詢出來的資料存入到

_name

和_address

變數中。

4)關閉游標

close curemployee;

注釋:在上面使用游標的位置_name和_address這兩個變數是之前定義好的,也就是在使用游標之前 就要定義好這兩個變數。關閉游標了以後就不能用fetch

這個語句使用游標了。

5)通過例項演示游標在儲存過程中的應用

5.1)建立儲存過程

5.2)呼叫儲存過程

call starquery69(1,12,@getcount,@getname,@getaddress);

select @getcount,@getname,@getaddress;

5.3)執行結果

2.儲存過程游標注意事項

在寫上面的儲存過程示例時,最初期通過游標在repeat

中逐條查詢的寫法如下:

repeat

fetch cur_name_address into _name ,_address;

set namestr=","+namestr+_name;

set addressstrs=","+addressstrs+_address;

until 0 end repeat;

這種寫法,在通過call

呼叫儲存過程的時候,資料庫報錯,錯誤的大概意思翻譯成中文是有重複值,後來我意識到該錯誤的主要原因是不能用「

+」連線字串,接下來我做了如下修改:

repeat

fetch cur_name_address into _name ,_address;

set addressstrs=concat_ws(',',addressstrs,_address);

set namestr=concat_ws(',',namestr,_name);

until 0 end repeat;

該正後,再次呼叫儲存過程,此次出現了新的錯誤,如下:

出現這種錯誤的原因是游標讀到了空值,也就是資料集中的記錄被讀完了,知道了錯誤的原因後,通過查閱資料,做了如下修改:

首先定義乙個變數:

declare tmpname varchar(20) default '1' ;

然後在宣告游標後,加上如下**:

declare continue handler for sqlstate '02000' set tmpname = null;

該**的意思是如果資料集中的記錄被讀完,即游標讀不到資料,那麼將變數tmpname

的值設定為

null

,此時在迴圈條件判斷中,加上條件判斷,若

tmpname is null

則退出迴圈,即可避免該錯誤。但是在本文的例程中我沒有使用這種辦法,而是設定乙個自增變數來與查詢記錄總數進行判斷,效果基本一樣。

儲存過程中游標的使用

例如 乙個公司,按照如下規則計算加薪金額 1.公司中除了總裁 president 外,所有人都會至少增加p min的薪水 2.任何獎金 bonus 高於 600的員工都會另增加4 3.員工的佣金 commission 越高,增加越少。佣金 commission 少於 2000的另增加3 佣金 com...

Oracle儲存過程中多層巢狀游標的用法

oracle sql指令碼 create or replace procedure p delete qk pid in number,deep in number as pid 分類id deep 深度,層級 one val number two val number three val numb...

Oracle資料庫游標在儲存過程中的使用

作為關係型資料庫市場的老大,oracla占有舉足輕重的地位。雖然在操作上不如sqlserver那樣方便,但是他的強大的功能 還是吸引來大批大批的追隨著。本人作為oracle菜鳥,在工作當中也偶爾使用oracle。以下記錄的上由於工作需要寫的oracle的 使用游標的儲存過程,個人覺得比較有代表性。希...