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的 使用游標的儲存過程,個人覺得比較有代表性。希...