SQL中的游標、異常處理、存儲函數(shù)及總結(最新推薦)
一.游標
游標(cursor)是用來存儲查詢結果集的數(shù)據(jù)類型,在存儲過程和函數(shù)中可以使用游標對結果集進行循環(huán)的處理。游標的使用包括游標的聲明、OPEN、FETCH和 CLOSE.
格式

操作

演示
use test_procedure ;
-- 需求:輸入一個部門名,查詢該部門員工的編號、名字、薪資,將查詢的結果集添加游標
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);
-- 聲明游標
declare my_cursor cursor for
select empno ,ename ,sal from emp e,dept d where d.dname =in_name ;
-- 打開游標
open my_cursor;
-- 通過游標獲得值
fetch my_cursor into var_empno,var_ename,var_sal;
select var_empno,var_ename,var_sal;
-- 關閉游標
close my_cursor;
end $$
delimiter ;
call proc21('銷售部');運行輸出的結果是

但是

我們發(fā)現(xiàn)符合要求的有多個值,這是因為游標是一條條往下執(zhí)行的所以我們可以用一個循環(huán)
use test_procedure ;
-- 需求:輸入一個部門名,查詢該部門員工的編號、名字、薪資,將查詢的結果集添加游標
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);
-- 聲明游標
declare my_cursor cursor for
select empno ,ename ,sal from emp e,dept d where d.dname =in_name ;
-- 打開游標
open my_cursor;
-- 通過游標獲得值
label:loop
fetch my_cursor into var_empno,var_ename,var_sal;
select var_empno,var_ename,var_sal;
end loop label;
-- 關閉游標
close my_cursor;
end $$
delimiter ;
call proc21('銷售部');結果會報錯

No data - zero rows fetched, selected, or processed 這句話意思是沒有數(shù)據(jù) 零行 讀取 選擇或處理,就是說循環(huán)到最后沒值了,所以我們需要找到一個條件并及時退出循環(huán),這就需要異常處理—handler句柄。
二.異常處理—handler句柄
格式

注意
在語法中,變量聲明、游標聲明、handler聲明是必須按照先后順序書寫的,否則創(chuàng)建存儲過程出錯。
--定義句柄:定義異常的處理方式
1:異常處理完之后程序該怎么執(zhí)行
continue :繼續(xù)執(zhí)行剩余代碼
exit :直接終止程序
undo:不支持
2:觸發(fā)條件
條件碼:1329
條件名:
SQLWARNING
NOT FOUND
SQLEXCEPTION

演示
-- 用條件名
use test_procedure ;
-- 需求:輸入一個部門名,查詢該部門員工的編號、名字、薪資,將查詢的結果集添加游標
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);
-- 定義標記值
declare flag int default 1;
-- 聲明游標
declare my_cursor cursor for
select empno ,ename ,sal from emp e,dept d where d.dname =in_name ;
-- 定義句柄,當數(shù)據(jù)未發(fā)現(xiàn)時將標記位設置為0
declare continue handler for not found set flag=0;
-- 打開游標
open my_cursor;
-- 通過游標獲得值
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;
-- 關閉游標
close my_cursor;
end $$
delimiter ;
call proc22('銷售部');
-- 用條件碼
use test_procedure ;
-- 需求:輸入一個部門名,查詢該部門員工的編號、名字、薪資,將查詢的結果集添加游標
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);
-- 定義標記值
declare flag int default 1;
-- 聲明游標
declare my_cursor cursor for
select empno ,ename ,sal from emp e,dept d where d.dname =in_name ;
-- 定義句柄,當數(shù)據(jù)未發(fā)現(xiàn)時將標記位設置為0
declare continue handler for 1329 set flag=0;
-- 打開游標
open my_cursor;
-- 通過游標獲得值
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;
-- 關閉游標
close my_cursor;
end $$
delimiter ;
call proc23('銷售部');兩個的運行結果是一樣的

三.存儲函數(shù)
格式
在MySQL中,創(chuàng)建存儲函數(shù)使用create function關鍵字,其基本形式如下:

參數(shù)說明
(1) func_name :存儲函數(shù)的名稱。
(2) param_name type:可選項,指定存儲函數(shù)的參數(shù)。type參數(shù)用于指定存儲函數(shù)的參數(shù)類型,該類型可以是MySQL數(shù)據(jù)庫中所有支持的類型。
(3)returns type:指定返回值的類型。
(4)characteristic:可選項,指定存儲函數(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 ;
運行結果可以會報錯,像這樣

意思是說“此函數(shù)在其聲明中沒有確定性、無 SQL 或讀取 SQL 數(shù)據(jù),并且啟用了二進制日志記錄(您*可能*希望使用不太安全的 log_bin_trust_function_creators 變量)”
所以我們設置允許創(chuàng)建函數(shù)權限信任即可
-- 允許創(chuàng)建函數(shù)權限信任
set global log_bin_trust_function_creators=true ;
-- 允許創(chuàng)建函數(shù)權限信任 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)用存儲函數(shù) select myfunc1_emp();

這樣就可以了
四.存儲過程總結







到此這篇關于SQL中的游標、異常處理、存儲函數(shù)及總結的文章就介紹到這了,更多相關SQL中的游標、異常處理、存儲函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SQL?Server數(shù)據(jù)庫入門教程之多表查詢
這篇文章主要給大家介紹了關于SQL?Server數(shù)據(jù)庫入門教程之多表查詢的相關資料,多表查詢是SQL數(shù)據(jù)庫里的高級查詢語句,文中通過圖文以及實例代碼介紹的非常詳細,需要的朋友可以參考下2023-06-06
使用Navicat從SQL?Server導入表數(shù)據(jù)到MySQL的操作流程
這篇文章主要介紹了使用Navicat從SQL?Server導入表數(shù)據(jù)到MySQL的操作流程,文中通過圖文結合的方式講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2024-12-12
SQL Server2022安裝教程的實現(xiàn)步驟(圖文教程)
在日常的工作中,sql server作為一款常用的數(shù)據(jù)庫管理系統(tǒng),安裝與配置就顯得非常重要,本文主要介紹了SQL Server2022安裝教程的實現(xiàn)步驟,感興趣的可以了解一下2023-09-09
SQL Server 監(jiān)控磁盤IO錯誤,msdb.dbo.suspect_pages
suspect_pages 表位于 msdb 數(shù)據(jù)庫中,是在 SQL Server 2005 中引入的。用于維護有關可疑頁的信息的 suspect_pages2014-10-10

