C#程式碼掃描工具Sonarqube + Win10+SqlServer2017
阿新 • • 發佈:2021-06-24
儲存過程,又稱儲存程式(英語:Stored Procedure),是在資料庫儲存複雜程式,以便外部程式呼叫的資料庫物件,可以視為資料庫的一種函式或子程式。
優點:
- 儲存過程可封裝,並隱藏複雜的商業邏輯
- 儲存過程可以回傳值,並可以接受引數
- 儲存過程無法使用SELECT指令執行,因為它是子程式,與查看錶、資料表或使用者定義函式不同
建立儲存過程
CREATE OR REPLACE 過程名([引數1, 引數2, ...]) AS <過程化SQL塊>;
執行儲存過程
CALL/PERFORM PROCEDURE 過程名([引數1, 引數2, ...]);
儲存過程定義變數的兩種方式
方式一:
使用set或select直接賦值,變數名以@開頭。
例如:set @val = 1;
方式二:
以DECLARE關鍵字宣告的變數,只能在儲存過程中使用,稱為儲存過程變數。
例如:DECLARE var1 INT DEFAULT 0;
區別:
在呼叫儲存過程時,以DECLARE宣告的變數會被初始化為NULL,而會話變數(以@開頭的變數則不會再次被初始化),在一個會話內只會被初始化一次。可以把會話變數當做是一個全域性變數,以DECLARE宣告的變數當做是函式內部的一個區域性變數。MySQL只能在儲存過程或函式中宣告變數。
舉個例子
對學生-課程資料庫編寫儲存過程,完成下述功能:
統計離散數學的成績分佈,即按照各分數段統計人數
思路:
其實剛開始碰到這道題的時候我是沒有思路的,看了別人的部落格之後才知道這道題應該怎麼來處理。
首先,可以宣告一些變數用來儲存各個分數段的學生人數,然後把各個分數段的名稱和人數儲存到一張表或者是一個檢視中,最後將檢視中的全部資訊輸出即可。
程式碼:
-- DROP PROCEDURE mycount; CREATE PROCEDURE `mycount`() BEGIN DECLARE less60 INT DEFAULT 0; DECLARE b60a70 INT DEFAULT 0; DECLARE b70a80 INTDEFAULT 0; DECLARE b80a90 INT DEFAULT 0; DECLARE larg90 INT DEFAULT 0; DECLARE courseid VARCHAR(10) DEFAULT '****'; SELECT c_id INTO courseid FROM course WHERE c_name = 'DM'; SELECT COUNT(*) INTO less60 FROM score WHERE c_id = courseid AND s_score < 60; SELECT COUNT(*) INTO b60a70 FROM score WHERE c_id = courseid AND s_score >= 60 AND s_score < 70; SELECT COUNT(*) INTO b70a80 FROM score WHERE c_id = courseid AND s_score >= 70 AND s_score < 80; SELECT COUNT(*) INTO b80a90 FROM score WHERE c_id = courseid AND s_score >= 80 AND s_score < 90; SELECT COUNT(*) INTO larg90 FROM score WHERE c_id = courseid AND s_score >= 90; CREATE TABLE score_range ( _range VARCHAR(10), number INT ); INSERT INTO score_range VALUES ('less60', less60); INSERT INTO score_range VALUES ('b60a70', b60a70); INSERT INTO score_range VALUES ('b70a80', b70a80); INSERT INTO score_range VALUES ('b80a90', b80a90); INSERT INTO score_range VALUES ('larg90', larg90); SELECT * FROM score_range; END
執行結果:
函式定義
CREATE OR REPLACE FUNCTION 函式名 ([引數1,引數2,...])
RETURNS <型別> AS <過程化SQL語句>;
儲存過程和函式的區別
相同點:都是永續性儲存模組
不同點:函式必須指定返回型別