第九章存储过程
第九章存儲過程
- 9.1_游標的使用
- 9.1.1_游標簡介及使用流程
- 9.1.2_游標的聲明
- 9.1.3_使用游標讀取數據
- 9.1.4_舉例說明
- 9.2_存儲過程
- 9.2.1_存儲過程簡介
- 9.2.2_存儲過程定義及執行
- 9.2.3_重寫存儲過程
- 9.2.6_刪除存儲過程
- 9.2.5_舉例說明
9.1_游標的使用
9.1.1_游標簡介及使用流程
使用游標(CURSOR)在需要一行一行處理時,游標十分有用。游標可以打開一個結果集合(按照指定的標準選擇的行),并提供在結果集中一行一行處理的功能。基于游標的類型,可以對其進行回滾或者前進。
使用流程:
①定義
②通過Fetch讀取結果集中的數據
③打開游標
④關閉游標
close cursor_name9.1.2_游標的聲明
用DECLARE語句對游標進行聲明,有兩種方法可以指定一個游標。
SQL-92 語法:
Transact-SQL 擴展語法:
DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] [ FORWARD_ONLY | SCROLL ] [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] [ TYPE_WARNING ] FOR select_statement [ FOR UPDATE [ OF column_name [ ,...n ] ] ]9.1.3_使用游標讀取數據
在從游標中讀取數據的過程中,可以在結果集中的每一行上來回移動和處理。
如果游標定義成了可滾動的(在聲明時使用SCROLL關鍵字),則任何時候都可取出結果集中的任意行。
對于非滾動的游標,只能對當前行的下一行實施取操作。結果集可以取到局部變量中。Fetch命令的語法如下:
當@@fetch_status != 0時,讀取結束
--舉例 FETCH NEXT FROM student_cursor INTO @ID, @Name9.1.4_舉例說明
例程9.3:定義一個游標,返回學生信息表中所有的數據,打開游標,然后遍歷學生信息表,直到找到學生名稱為“張三豐”的記錄為止,并且打印學生學號和學生名稱。
--定義游標 DECLARE student_cursor CURSOR FOR SELECT sno,sname FROM student --定義變量 DECLARE @ID char(10), @Name char(30) --打開游標 OPEN student_cursor --指向集合的下一項 FETCH NEXT FROM student_cursor INTO @ID, @Name --進入whlie循環當全局變量@@fetch_status = 0時進入循環 WHILE @@fetch_status = 0 BEGIN IF @Name = '張三豐' BEGINPRINT '找到張三豐'PRINT @ID+@NameBREAK END --指向集合中下一項 FETCH NEXT FROM student_cursor INTO @ID, @Name END9.2_存儲過程
9.2.1_存儲過程簡介
過程化SQL塊主要有兩種類型,即命名塊和匿名塊。之前介紹的是匿名塊。匿名塊每次執行時都要進行編譯,它不能被存儲到數據庫中,也不能在其他過程化SQL塊中調用。存儲過程和函數是命名塊,它們被編譯后保存在數據庫中,稱為持久性存儲模塊,可以被反復調用,運行速度較快。
(簡單來說,存儲過程可以像函數一樣被調用,并且可以將這個功能存到數據庫中,以后可以直接用)
存儲過程分為兩類:系統存儲過程和用戶自定義存儲過程;
9.2.2_存儲過程定義及執行
無輸出參數的存儲過程:
USE students--在student數據庫上建立存儲過程 GO CREATE PROCEDURE procedure_name @xbbh varchar(4)--procedure_name 存儲過程名,@xbbh varchar(4)傳入參數及參數類型 AS begin --sql過程塊 end --上述中procedure可以簡寫為proc帶輸出參數的存儲過程:
USE students--在student數據庫上建立存儲過程 GO CTEATE PROCEDURE proc_testOutput ( @p1 int , @p2 int OUTPUT, --輸出參數@p3 int ) AS BEGIN --sql過程塊 END通過TRANSACT-SQL語句的EXEC命令執行一個已定義的存儲過程語法格式:
USE studentsGOEXEC proc_nameGO9.2.3_重寫存儲過程
USE students--在student數據庫上建立存儲過程 GO --把create改為alter即可 alter PROCEDURE procedure_name @xbbh varchar(4)--procedure_name 存儲過程名,@xbbh varchar(4)傳入參數及參數類型 AS begin --sql過程塊 end9.2.6_刪除存儲過程
USE students GO DROP PROCEDURE proc_scorepass9.2.5_舉例說明
補充:#name是臨時集合或臨時存儲過程
統計錄取新生最多的前幾所(數量查詢時給定)高中:(使用了存儲過程)
--定義游標 declare find_cursor cursor for select middle_school from Student group by middle_school order by COUNT(*) desc --存儲過程 use test go create procedure find_procedure @number int as begin --定義變量 declare @count int = 0 declare @school char(50) --打開游標 open find_cursor --讀取游標所指集合的下一項內容 fetch next from find_cursor into @school while @count < @number begin set @count = @count+1 print @count print @number print @school fetch next from find_cursor into @school end --關閉游標 close find_cursor end --調用存儲過程 exec find_procedure 5總結
- 上一篇: 全网最全的Numpy开发入门教程(详细案
- 下一篇: 最小c编译器