系列文章目錄
1.MySQL編程基礎
2.程序控制流語句
3.存儲過程
4.游標
5.嵌入式SQL
文章目錄
- 系列文章目錄
- 前言
- 一、程序控制流語句:
- 二、存儲函數:
- 1.存儲函數的特點:
- 2.存儲函數的定義:
- 3.調用存儲函數
- 三、存儲過程:
- 1.存儲過程的特點:
- 2.存儲過程的定義:
- 3. 調用存儲過程:
- 四、兩者區別:
- 總結
前言
? ? ? 前面我們簡單學習了一些SQL的基本語句,增刪改查等一些常用的知識,現在我們要稍微學習一點數據庫編程的內容,在一些復雜的程序中我們就需要一些語句來增強這個程序的可讀性和邏輯性,下面我們先講講存儲函數和存儲過程:
一、程序控制流語句:
? ? 與所有的程序設計語言一樣,MySQL提供了用于編寫過程化代碼的語法結構,可進行順序,分支,循環,存儲過程,存儲函數,觸發器等程序設計,編寫結構化的模塊代碼,并放置到數據庫服務器上。
? ?語句塊,注釋和重置命令結束標記:
? ? ? ? 1.語句塊:
?BEGIN···END用于定義SQL語句塊,其語法格式如下:
? ? ? ?
BEGINSQL語句|SQL語句塊
END
? ? ? ? 說明:
? ?(1)BEGIN····END語句塊包含了該程序塊的所有處理操作,允許語句塊嵌套。
? ?(2)在MySQL中單獨使用BEGIN···END語句塊沒有任何意義,只有將其封裝到存儲過程,存儲函數,觸發器等存儲程序內部才有意義。
? ? ? ?2.注釋
? ? ?在源代碼中加入注釋便于用戶對程序的更好理解,有兩種聲明注釋的方式,即單行注釋和多行注釋。
? ?(1)單行注釋:
使用##符號作為單行語句的注釋符,寫在需要注釋的行或語句的后面。
? ?(2)多行注釋:
使用/*和*/括起來可以連續書寫多行注釋語句。
? ? ? ?3.重置命令結束標記
?在MySQL中,服務器處理的語句式以分號為結束標記的。但在創建存儲函數,存儲過程時,在函數體或存儲過程體中可以包含多個SQL語句,每個SQL語句都是以分號結尾,而服務器處理程序時遇到第一個分號則結束程序的執行,這時就需要使用DELIMITER語句將MySQL語句的結束標記修改為其他符號。
? 語句格式:
?
DELIMITER 符號
?示例:
DELIMITER @@
SELECT *FROM emp@@DELIMITER ;
SELECT * FROM emp;
? ? ?恢復使用分號作為結束標記,執行“DELIMITER;”即可。
二、存儲函數:
? ? ? ?用戶在編寫程序的過程中,不僅可以調用系統函數,也可以根據應用程序的需要創建存儲函數。
? ? ? ?存儲函數是類似于存儲過程的一種程序單元,但它的返回值必須是一個單一的值,通常用于計算和返回某些值。存儲函數可以用在 SQL 語句中,作為一個表達式。
存儲函數的特點:
- 必須返回一個值:存儲函數必須有一個?
RETURN
?語句來返回一個值。 - 可以作為表達式使用:存儲函數可以嵌入到 SQL 語句中,例如在?
SELECT
?語句中作為計算的一部分。 - 不能執行多個 SQL 語句:與存儲過程不同,存儲函數通常只能執行單一的操作,并返回一個結果,不能像存儲過程一樣返回多個結果集。
?
存儲函數的定義:
創建存儲函數使用 CREATE FUNCTION
語句,語法如下:
DELIMITER $$CREATE FUNCTION function_name (param1 datatype, param2 datatype)
RETURNS return_datatype
DETERMINISTIC
BEGIN-- 計算過程RETURN result;
END $$DELIMITER ;
return_datatype
?是函數的返回類型。DETERMINISTIC
?表示該函數對于相同的輸入參數返回相同的結果。如果函數結果依賴于外部因素(如隨機數、時間等),則應使用?NOT DETERMINISTIC
。RETURN result
?用于返回結果。
調用存儲函數:
存儲函數的調用方式可以像普通的表達式一樣使用,通常是查詢中的一部分。例如:
SELECT function_name(param1_value, param2_value);
示例:
DELIMITER $$CREATE FUNCTION CalculateTax(price DECIMAL(10,2))
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGINDECLARE tax DECIMAL(10,2);SET tax = price * 0.1;RETURN tax;
END $$DELIMITER ;
刪除存儲函數:
DROP FUNCTION NAME_FN;
函數名后面不要加括號
三、存儲過程:
??
存儲過程是由一組 SQL 語句組成的預編譯程序,可以根據需要在數據庫中被多次執行。存儲過程可以接受參數,也可以返回多個結果集。通常用于執行復雜的業務邏輯,封裝一組 SQL 操作或事務。
存儲過程的特點:
- 沒有返回值:存儲過程不能返回值,但可以使用?
OUT
?參數來返回值。 - 支持多個結果集:存儲過程可以返回多個查詢結果集,可以通過?
SELECT
?語句來返回數據。 - 執行方式:存儲過程在數據庫中創建后,可以通過?
CALL
?語句執行。 - 封裝復雜邏輯:存儲過程非常適合封裝一些復雜的查詢或事務操作。
? ??
存儲過程的定義:
創建存儲過程使用 CREATE PROCEDURE
語句,語法如下:
??
DELIMITER $$CREATE PROCEDURE procedure_name (param1 datatype, param2 datatype)
BEGIN-- SQL語句SELECT * FROM table_name;
END $$DELIMITER ;
DELIMITER $$
?是用來修改命令結束符的,通常 MySQL 的默認命令結束符是?;
,但是存儲過程體內部也會使用?;
?來分隔 SQL 語句,因此需要使用?DELIMITER
?來改變結束符。procedure_name
?是存儲過程的名字。param1
、param2
?等是存儲過程的輸入參數,可以指定類型,如?INT
、VARCHAR
?等。
? ? ?
調用存儲過程:
創建好存儲過程后,可以使用 CALL
來調用存儲過程:
CALL procedure_name(param1_value, param2_value);
示例:
DELIMITER $$CREATE PROCEDURE GetEmployeeInfo(IN emp_id INT)
BEGINSELECT name, position FROM employees WHERE id = emp_id;
END $$DELIMITER ;
調用:
CALL GetEmployeeInfo(101);
四、兩者區別:
存儲過程與存儲函數的主要區別:
特性 | 存儲過程(Stored Procedure) | 存儲函數(Stored Function) |
---|---|---|
返回值 | 沒有返回值,通常通過?OUT ?參數返回結果。 | 必須有返回值,使用?RETURN ?語句返回一個值。 |
執行的操作 | 可以執行?SELECT 、INSERT 、UPDATE 、DELETE ?等操作。 | 只能執行?SELECT ?查詢,不能修改數據。 |
調用方式 | 使用?CALL ?語句調用存儲過程。 | 直接在 SQL 語句中調用,如?SELECT function_name(); 。 |
使用場景 | 用于需要執行一系列操作的場景,例如批量插入、更新等。 | 用于需要返回單個計算值的場景,例如計算某個值的統計信息。 |
是否可以嵌套使用 | 可以調用存儲過程、存儲函數或其他 SQL 語句。 | 可以在 SQL 查詢中嵌套調用,但不能直接修改數據。 |
總結
以上就是我們今天要講的內容,我簡單講了存儲函數和存儲過程以及他們的區別,下面我會持續更新數據庫的內容的,希望大家多多關注。