SQL中的游標(biāo)、異常處理、存儲(chǔ)函數(shù)及總結(jié)(最新推薦)
一.游標(biāo)
游標(biāo)(cursor)是用來存儲(chǔ)查詢結(jié)果集的數(shù)據(jù)類型,在存儲(chǔ)過程和函數(shù)中可以使用游標(biāo)對結(jié)果集進(jìn)行循環(huán)的處理。游標(biāo)的使用包括游標(biāo)的聲明、OPEN、FETCH和 CLOSE.
格式
操作
演示
use test_procedure ; -- 需求:輸入一個(gè)部門名,查詢該部門員工的編號、名字、薪資,將查詢的結(jié)果集添加游標(biāo) delimiter $$ create procedure proc21(in in_name varchar(50)) begin -- 定義局部變量 declare var_empno int; declare var_ename varchar(50); declare var_sal decimal(7,2); -- 聲明游標(biāo) declare my_cursor cursor for select empno ,ename ,sal from emp e,dept d where d.dname =in_name ; -- 打開游標(biāo) open my_cursor; -- 通過游標(biāo)獲得值 fetch my_cursor into var_empno,var_ename,var_sal; select var_empno,var_ename,var_sal; -- 關(guān)閉游標(biāo) close my_cursor; end $$ delimiter ; call proc21('銷售部');
運(yùn)行輸出的結(jié)果是
但是
我們發(fā)現(xiàn)符合要求的有多個(gè)值,這是因?yàn)橛螛?biāo)是一條條往下執(zhí)行的所以我們可以用一個(gè)循環(huán)
use test_procedure ; -- 需求:輸入一個(gè)部門名,查詢該部門員工的編號、名字、薪資,將查詢的結(jié)果集添加游標(biāo) delimiter $$ create procedure proc21(in in_name varchar(50)) begin -- 定義局部變量 declare var_empno int; declare var_ename varchar(50); declare var_sal decimal(7,2); -- 聲明游標(biāo) declare my_cursor cursor for select empno ,ename ,sal from emp e,dept d where d.dname =in_name ; -- 打開游標(biāo) open my_cursor; -- 通過游標(biāo)獲得值 label:loop fetch my_cursor into var_empno,var_ename,var_sal; select var_empno,var_ename,var_sal; end loop label; -- 關(guān)閉游標(biāo) close my_cursor; end $$ delimiter ; call proc21('銷售部');
結(jié)果會(huì)報(bào)錯(cuò)
No data - zero rows fetched, selected, or processed 這句話意思是沒有數(shù)據(jù) 零行 讀取 選擇或處理,就是說循環(huán)到最后沒值了,所以我們需要找到一個(gè)條件并及時(shí)退出循環(huán),這就需要異常處理—handler句柄。
二.異常處理—handler句柄
格式
注意
在語法中,變量聲明、游標(biāo)聲明、handler聲明是必須按照先后順序書寫的,否則創(chuàng)建存儲(chǔ)過程出錯(cuò)。
--定義句柄:定義異常的處理方式
1:異常處理完之后程序該怎么執(zhí)行
continue :繼續(xù)執(zhí)行剩余代碼
exit :直接終止程序
undo:不支持
2:觸發(fā)條件
條件碼:1329
條件名:
SQLWARNING
NOT FOUND
SQLEXCEPTION
演示
-- 用條件名 use test_procedure ; -- 需求:輸入一個(gè)部門名,查詢該部門員工的編號、名字、薪資,將查詢的結(jié)果集添加游標(biāo) delimiter $$ create procedure proc22(in in_name varchar(50)) begin -- 定義局部變量 declare var_empno int; declare var_ename varchar(50); declare var_sal decimal(7,2); -- 定義標(biāo)記值 declare flag int default 1; -- 聲明游標(biāo) declare my_cursor cursor for select empno ,ename ,sal from emp e,dept d where d.dname =in_name ; -- 定義句柄,當(dāng)數(shù)據(jù)未發(fā)現(xiàn)時(shí)將標(biāo)記位設(shè)置為0 declare continue handler for not found set flag=0; -- 打開游標(biāo) open my_cursor; -- 通過游標(biāo)獲得值 label:loop fetch my_cursor into var_empno,var_ename,var_sal; if flag=1 then select var_empno,var_ename,var_sal; else leave label; end if; end loop label; -- 關(guān)閉游標(biāo) close my_cursor; end $$ delimiter ; call proc22('銷售部'); -- 用條件碼 use test_procedure ; -- 需求:輸入一個(gè)部門名,查詢該部門員工的編號、名字、薪資,將查詢的結(jié)果集添加游標(biāo) delimiter $$ create procedure proc23(in in_name varchar(50)) begin -- 定義局部變量 declare var_empno int; declare var_ename varchar(50); declare var_sal decimal(7,2); -- 定義標(biāo)記值 declare flag int default 1; -- 聲明游標(biāo) declare my_cursor cursor for select empno ,ename ,sal from emp e,dept d where d.dname =in_name ; -- 定義句柄,當(dāng)數(shù)據(jù)未發(fā)現(xiàn)時(shí)將標(biāo)記位設(shè)置為0 declare continue handler for 1329 set flag=0; -- 打開游標(biāo) open my_cursor; -- 通過游標(biāo)獲得值 label:loop fetch my_cursor into var_empno,var_ename,var_sal; if flag=1 then select var_empno,var_ename,var_sal; else leave label; end if; end loop label; -- 關(guān)閉游標(biāo) close my_cursor; end $$ delimiter ; call proc23('銷售部');
兩個(gè)的運(yùn)行結(jié)果是一樣的
三.存儲(chǔ)函數(shù)
格式
在MySQL中,創(chuàng)建存儲(chǔ)函數(shù)使用create function關(guān)鍵字,其基本形式如下:
參數(shù)說明
(1) func_name :存儲(chǔ)函數(shù)的名稱。
(2) param_name type:可選項(xiàng),指定存儲(chǔ)函數(shù)的參數(shù)。type參數(shù)用于指定存儲(chǔ)函數(shù)的參數(shù)類型,該類型可以是MySQL數(shù)據(jù)庫中所有支持的類型。
(3)returns type:指定返回值的類型。
(4)characteristic:可選項(xiàng),指定存儲(chǔ)函數(shù)的特性。
(5)routine_body: SQL代碼內(nèi)容。
演示
drop function if exists myfunc1_emp; delimiter $$ create function myfunc1_emp() returns int begin declare cnt int default 0; select count(*) into cnt from emp; return cnt; end $$ delimiter ;
運(yùn)行結(jié)果可以會(huì)報(bào)錯(cuò),像這樣
意思是說“此函數(shù)在其聲明中沒有確定性、無 SQL 或讀取 SQL 數(shù)據(jù),并且啟用了二進(jìn)制日志記錄(您*可能*希望使用不太安全的 log_bin_trust_function_creators 變量)”
所以我們設(shè)置允許創(chuàng)建函數(shù)權(quán)限信任即可
-- 允許創(chuàng)建函數(shù)權(quán)限信任
set global log_bin_trust_function_creators=true ;
-- 允許創(chuàng)建函數(shù)權(quán)限信任 set global log_bin_trust_function_creators=true ; drop function if exists myfunc1_emp; delimiter $$ create function myfunc1_emp() returns int begin declare cnt int default 0; select count(*) into cnt from emp; return cnt; end $$ delimiter ; -- 調(diào)用存儲(chǔ)函數(shù) select myfunc1_emp();
這樣就可以了
四.存儲(chǔ)過程總結(jié)
到此這篇關(guān)于SQL中的游標(biāo)、異常處理、存儲(chǔ)函數(shù)及總結(jié)的文章就介紹到這了,更多相關(guān)SQL中的游標(biāo)、異常處理、存儲(chǔ)函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SQL語句執(zhí)行超時(shí)引發(fā)網(wǎng)站首頁訪問故障問題
由于獲取網(wǎng)站首頁列表的 SQL 語句出現(xiàn)突發(fā)的查詢超時(shí)問題,造成訪問網(wǎng)站首頁時(shí)出現(xiàn) 500 錯(cuò)誤,在故障期間記錄了大量錯(cuò)誤,小編給大家分享到腳本之家平臺,感興趣的朋友一起看看吧2020-02-02SQL Server 2005 創(chuàng)建簡單的存儲(chǔ)過程--總結(jié)分析
本篇文章是對使用SQL Server 2005創(chuàng)建簡單的存儲(chǔ)過程進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06將MSSQL Server 導(dǎo)入/導(dǎo)出到遠(yuǎn)程服務(wù)器教程的圖文方法分享
如何將MSSQL Server 導(dǎo)入/導(dǎo)出到遠(yuǎn)程服務(wù)器教程,需要mssql數(shù)據(jù)庫備份的朋友用得到。2011-08-08在SQLServer上查看SQL語句的執(zhí)行時(shí)間的方法
查看SQL語句在SQL Server上的執(zhí)行時(shí)間,方便大家監(jiān)控語句的性能。寫出更好的代碼。2010-06-06SQL SERVER 利用存儲(chǔ)過程查看角色和用戶信息的寫法
SQL SERVER 利用存儲(chǔ)過程查看角色(服務(wù)器/數(shù)據(jù)庫)和用戶信息,感興趣的朋友可以了解下,或許對你有所幫助2013-01-01SQL語句練習(xí)實(shí)例之四 找出促銷活動(dòng)中銷售額最高的職員
你剛在一家服裝銷售公司中找到了一份工作,此時(shí)經(jīng)理要求你根據(jù)數(shù)據(jù)庫中的兩張表得到促銷活動(dòng)銷售額最高的銷售員2011-10-10sql server服務(wù)無法啟動(dòng)的解決方案
sql server軟件是一款關(guān)系型數(shù)據(jù)庫管理系統(tǒng),具有使用方便可伸縮性好與相關(guān)軟件集成程度高等優(yōu)點(diǎn),我們在數(shù)據(jù)編程操作時(shí)經(jīng)常會(huì)使用這款編程軟件,在編程時(shí)系統(tǒng)有時(shí)會(huì)提示sql server服務(wù)無法啟動(dòng),那么大家該如何正常啟動(dòng)呢,下面就由小編來給大家介紹一下如何解決2023-11-11