1. 程式人生 > 其它 >C#程式碼掃描工具Sonarqube + Win10+SqlServer2017

C#程式碼掃描工具Sonarqube + Win10+SqlServer2017

儲存過程,又稱儲存程式(英語: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 INT
DEFAULT 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語句>;

儲存過程和函式的區別

相同點:都是永續性儲存模組

不同點:函式必須指定返回型別