'詳解MYSQL數據庫的存儲過程和函數語法總結'

MySQL SQL 數據庫 編譯器 NoSQL Java 波波說運維 2019-07-16
"

什麼是存儲過程

簡單的說,就是一組SQL語句集,功能強大,可以實現一些比較複雜的邏輯功能,類似於JAVA語言中的方法;

ps:存儲過程跟觸發器有點類似,都是一組SQL集,但是存儲過程是主動調用的,且功能比觸發器更加強大,觸發器是某件事觸發後自動調用;


存儲過程特性

  1. 有輸入輸出參數,可以聲明變量,有if/else, case,while等控制語句,通過編寫存儲過程,可以實現複雜的邏輯功能;
  2. 函數的普遍特性:模塊化,封裝,代碼複用;
  3. 速度快,只有首次執行需經過編譯和優化步驟,後續被調用可以直接執行,省去以上步驟;

MySQL存儲過程的創建

1、語法

CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body

CREATE PROCEDURE 過程名([[IN|OUT|INOUT] 參數名 數據類型[,[IN|OUT|INOUT] 參數名 數據類型…]]) [特性 ...] 過程體

DELIMITER //
CREATE PROCEDURE myproc(OUT s int)
BEGIN
SELECT COUNT(*) INTO s FROM students;
END
//
DELIMITER ;

MySQL默認以";"為分隔符,如果沒有聲明分割符,則編譯器會把存儲過程當成SQL語句進行處理,因此編譯過程會報錯,所以要事先用“DELIMITER //”聲明當前段分隔符,讓編譯器把兩個"//"之間的內容當做存儲過程的代碼,不會執行這些代碼;“DELIMITER ;”的意為把分隔符還原。

2、參數

存儲過程根據需要可能會有輸入、輸出、輸入輸出參數,如果有多個參數用","分割開。MySQL存儲過程的參數用在存儲過程的定義,共有三種參數類型,IN,OUT,INOUT:

  • IN參數的值必須在調用存儲過程時指定,在存儲過程中修改該參數的值不能被返回,為默認值
  • OUT:該值可在存儲過程內部被改變,並可返回
  • INOUT:調用時指定,並且可被改變和返回

其中,sp_name參數是存儲過程的名稱;proc_parameter表示存儲過程的參數列表; characteristic參數指定存儲過程的特性;routine_body參數是SQL代碼的內容,可以用BEGIN…END來標誌SQL代碼的開始和結束。

技巧:創建存儲過程時,系統默認指定CONTAINS SQL,表示存儲過程中使用了SQL語句。但是,如果存儲過程中沒有使用SQL語句,最好設置為NO SQL。而且,存儲過程中最好在COMMENT部分對存儲過程進行簡單的註釋,以便以後在閱讀存儲過程的代碼時更加方便。


存儲過程實例

下面創建一個名為num_from_employee的存儲過程。

"

什麼是存儲過程

簡單的說,就是一組SQL語句集,功能強大,可以實現一些比較複雜的邏輯功能,類似於JAVA語言中的方法;

ps:存儲過程跟觸發器有點類似,都是一組SQL集,但是存儲過程是主動調用的,且功能比觸發器更加強大,觸發器是某件事觸發後自動調用;


存儲過程特性

  1. 有輸入輸出參數,可以聲明變量,有if/else, case,while等控制語句,通過編寫存儲過程,可以實現複雜的邏輯功能;
  2. 函數的普遍特性:模塊化,封裝,代碼複用;
  3. 速度快,只有首次執行需經過編譯和優化步驟,後續被調用可以直接執行,省去以上步驟;

MySQL存儲過程的創建

1、語法

CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body

CREATE PROCEDURE 過程名([[IN|OUT|INOUT] 參數名 數據類型[,[IN|OUT|INOUT] 參數名 數據類型…]]) [特性 ...] 過程體

DELIMITER //
CREATE PROCEDURE myproc(OUT s int)
BEGIN
SELECT COUNT(*) INTO s FROM students;
END
//
DELIMITER ;

MySQL默認以";"為分隔符,如果沒有聲明分割符,則編譯器會把存儲過程當成SQL語句進行處理,因此編譯過程會報錯,所以要事先用“DELIMITER //”聲明當前段分隔符,讓編譯器把兩個"//"之間的內容當做存儲過程的代碼,不會執行這些代碼;“DELIMITER ;”的意為把分隔符還原。

2、參數

存儲過程根據需要可能會有輸入、輸出、輸入輸出參數,如果有多個參數用","分割開。MySQL存儲過程的參數用在存儲過程的定義,共有三種參數類型,IN,OUT,INOUT:

  • IN參數的值必須在調用存儲過程時指定,在存儲過程中修改該參數的值不能被返回,為默認值
  • OUT:該值可在存儲過程內部被改變,並可返回
  • INOUT:調用時指定,並且可被改變和返回

其中,sp_name參數是存儲過程的名稱;proc_parameter表示存儲過程的參數列表; characteristic參數指定存儲過程的特性;routine_body參數是SQL代碼的內容,可以用BEGIN…END來標誌SQL代碼的開始和結束。

技巧:創建存儲過程時,系統默認指定CONTAINS SQL,表示存儲過程中使用了SQL語句。但是,如果存儲過程中沒有使用SQL語句,最好設置為NO SQL。而且,存儲過程中最好在COMMENT部分對存儲過程進行簡單的註釋,以便以後在閱讀存儲過程的代碼時更加方便。


存儲過程實例

下面創建一個名為num_from_employee的存儲過程。

詳解MYSQL數據庫的存儲過程和函數語法總結

上述存儲過程名稱為num_from_employee;輸入變量為emp_id;輸出變量為count_num。SELECT語句從employee表查詢d_id值等於emp_id的記錄,並用COUNT(*)計算d_id值相同的記錄的條數,最後將計算結果存入count_num中。執行結果如下:

"

什麼是存儲過程

簡單的說,就是一組SQL語句集,功能強大,可以實現一些比較複雜的邏輯功能,類似於JAVA語言中的方法;

ps:存儲過程跟觸發器有點類似,都是一組SQL集,但是存儲過程是主動調用的,且功能比觸發器更加強大,觸發器是某件事觸發後自動調用;


存儲過程特性

  1. 有輸入輸出參數,可以聲明變量,有if/else, case,while等控制語句,通過編寫存儲過程,可以實現複雜的邏輯功能;
  2. 函數的普遍特性:模塊化,封裝,代碼複用;
  3. 速度快,只有首次執行需經過編譯和優化步驟,後續被調用可以直接執行,省去以上步驟;

MySQL存儲過程的創建

1、語法

CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body

CREATE PROCEDURE 過程名([[IN|OUT|INOUT] 參數名 數據類型[,[IN|OUT|INOUT] 參數名 數據類型…]]) [特性 ...] 過程體

DELIMITER //
CREATE PROCEDURE myproc(OUT s int)
BEGIN
SELECT COUNT(*) INTO s FROM students;
END
//
DELIMITER ;

MySQL默認以";"為分隔符,如果沒有聲明分割符,則編譯器會把存儲過程當成SQL語句進行處理,因此編譯過程會報錯,所以要事先用“DELIMITER //”聲明當前段分隔符,讓編譯器把兩個"//"之間的內容當做存儲過程的代碼,不會執行這些代碼;“DELIMITER ;”的意為把分隔符還原。

2、參數

存儲過程根據需要可能會有輸入、輸出、輸入輸出參數,如果有多個參數用","分割開。MySQL存儲過程的參數用在存儲過程的定義,共有三種參數類型,IN,OUT,INOUT:

  • IN參數的值必須在調用存儲過程時指定,在存儲過程中修改該參數的值不能被返回,為默認值
  • OUT:該值可在存儲過程內部被改變,並可返回
  • INOUT:調用時指定,並且可被改變和返回

其中,sp_name參數是存儲過程的名稱;proc_parameter表示存儲過程的參數列表; characteristic參數指定存儲過程的特性;routine_body參數是SQL代碼的內容,可以用BEGIN…END來標誌SQL代碼的開始和結束。

技巧:創建存儲過程時,系統默認指定CONTAINS SQL,表示存儲過程中使用了SQL語句。但是,如果存儲過程中沒有使用SQL語句,最好設置為NO SQL。而且,存儲過程中最好在COMMENT部分對存儲過程進行簡單的註釋,以便以後在閱讀存儲過程的代碼時更加方便。


存儲過程實例

下面創建一個名為num_from_employee的存儲過程。

詳解MYSQL數據庫的存儲過程和函數語法總結

上述存儲過程名稱為num_from_employee;輸入變量為emp_id;輸出變量為count_num。SELECT語句從employee表查詢d_id值等於emp_id的記錄,並用COUNT(*)計算d_id值相同的記錄的條數,最後將計算結果存入count_num中。執行結果如下:

詳解MYSQL數據庫的存儲過程和函數語法總結

執行完畢後,沒有報出任何出錯信息就表示存儲函數已經創建成功。以後就可以調用這個存儲過程,數據庫中會執行存儲過程中的SQL語句。

說明:MySQL中默認的語句結束符為分號(;)。存儲過程中的SQL語句需要分號來 結束。為了避免衝突,首先用"DELIMITER &&"將MySQL的結束符設置為&&。最後再用"DELIMITER ;"來將結束符恢復成分號。這與創建觸發器時是一樣的。


函數

在MySQL中,創建存儲函數的基本形式如下:

CREATE FUNCTION sp_name ([func_parameter[,...]]) RETURNS type [characteristic ...] routine_body

其中,sp_name參數是存儲函數的名稱;func_parameter表示存儲函數的參數列表;RETURNS type指定返回值的類型;characteristic參數指定存儲函數的特性,該參數的取值與存儲過程中的取值是一樣的;routine_body參數是SQL代碼的內容,可以用BEGIN…END來標誌SQL代碼的開始和結束。

func_parameter可以由多個參數組成,其中每個參數由參數名稱和參數類型組成,其形式如下:param_name type

其中,param_name參數是存儲函數的參數名稱;type參數指定存儲函數的參數類型,該類型可以是MySQL數據庫的任意數據類型。


函數實例

下面創建一個名為name_from_employee的存儲函數。

"

什麼是存儲過程

簡單的說,就是一組SQL語句集,功能強大,可以實現一些比較複雜的邏輯功能,類似於JAVA語言中的方法;

ps:存儲過程跟觸發器有點類似,都是一組SQL集,但是存儲過程是主動調用的,且功能比觸發器更加強大,觸發器是某件事觸發後自動調用;


存儲過程特性

  1. 有輸入輸出參數,可以聲明變量,有if/else, case,while等控制語句,通過編寫存儲過程,可以實現複雜的邏輯功能;
  2. 函數的普遍特性:模塊化,封裝,代碼複用;
  3. 速度快,只有首次執行需經過編譯和優化步驟,後續被調用可以直接執行,省去以上步驟;

MySQL存儲過程的創建

1、語法

CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body

CREATE PROCEDURE 過程名([[IN|OUT|INOUT] 參數名 數據類型[,[IN|OUT|INOUT] 參數名 數據類型…]]) [特性 ...] 過程體

DELIMITER //
CREATE PROCEDURE myproc(OUT s int)
BEGIN
SELECT COUNT(*) INTO s FROM students;
END
//
DELIMITER ;

MySQL默認以";"為分隔符,如果沒有聲明分割符,則編譯器會把存儲過程當成SQL語句進行處理,因此編譯過程會報錯,所以要事先用“DELIMITER //”聲明當前段分隔符,讓編譯器把兩個"//"之間的內容當做存儲過程的代碼,不會執行這些代碼;“DELIMITER ;”的意為把分隔符還原。

2、參數

存儲過程根據需要可能會有輸入、輸出、輸入輸出參數,如果有多個參數用","分割開。MySQL存儲過程的參數用在存儲過程的定義,共有三種參數類型,IN,OUT,INOUT:

  • IN參數的值必須在調用存儲過程時指定,在存儲過程中修改該參數的值不能被返回,為默認值
  • OUT:該值可在存儲過程內部被改變,並可返回
  • INOUT:調用時指定,並且可被改變和返回

其中,sp_name參數是存儲過程的名稱;proc_parameter表示存儲過程的參數列表; characteristic參數指定存儲過程的特性;routine_body參數是SQL代碼的內容,可以用BEGIN…END來標誌SQL代碼的開始和結束。

技巧:創建存儲過程時,系統默認指定CONTAINS SQL,表示存儲過程中使用了SQL語句。但是,如果存儲過程中沒有使用SQL語句,最好設置為NO SQL。而且,存儲過程中最好在COMMENT部分對存儲過程進行簡單的註釋,以便以後在閱讀存儲過程的代碼時更加方便。


存儲過程實例

下面創建一個名為num_from_employee的存儲過程。

詳解MYSQL數據庫的存儲過程和函數語法總結

上述存儲過程名稱為num_from_employee;輸入變量為emp_id;輸出變量為count_num。SELECT語句從employee表查詢d_id值等於emp_id的記錄,並用COUNT(*)計算d_id值相同的記錄的條數,最後將計算結果存入count_num中。執行結果如下:

詳解MYSQL數據庫的存儲過程和函數語法總結

執行完畢後,沒有報出任何出錯信息就表示存儲函數已經創建成功。以後就可以調用這個存儲過程,數據庫中會執行存儲過程中的SQL語句。

說明:MySQL中默認的語句結束符為分號(;)。存儲過程中的SQL語句需要分號來 結束。為了避免衝突,首先用"DELIMITER &&"將MySQL的結束符設置為&&。最後再用"DELIMITER ;"來將結束符恢復成分號。這與創建觸發器時是一樣的。


函數

在MySQL中,創建存儲函數的基本形式如下:

CREATE FUNCTION sp_name ([func_parameter[,...]]) RETURNS type [characteristic ...] routine_body

其中,sp_name參數是存儲函數的名稱;func_parameter表示存儲函數的參數列表;RETURNS type指定返回值的類型;characteristic參數指定存儲函數的特性,該參數的取值與存儲過程中的取值是一樣的;routine_body參數是SQL代碼的內容,可以用BEGIN…END來標誌SQL代碼的開始和結束。

func_parameter可以由多個參數組成,其中每個參數由參數名稱和參數類型組成,其形式如下:param_name type

其中,param_name參數是存儲函數的參數名稱;type參數指定存儲函數的參數類型,該類型可以是MySQL數據庫的任意數據類型。


函數實例

下面創建一個名為name_from_employee的存儲函數。

詳解MYSQL數據庫的存儲過程和函數語法總結

上述存儲函數的名稱為name_from_employee;該函數的參數為emp_id;返回值是VARCHAR類型。SELECT語句從employee表查詢num值等於emp_id的記錄,並將該記錄的name字段的值返回。執行結果如下:

"

什麼是存儲過程

簡單的說,就是一組SQL語句集,功能強大,可以實現一些比較複雜的邏輯功能,類似於JAVA語言中的方法;

ps:存儲過程跟觸發器有點類似,都是一組SQL集,但是存儲過程是主動調用的,且功能比觸發器更加強大,觸發器是某件事觸發後自動調用;


存儲過程特性

  1. 有輸入輸出參數,可以聲明變量,有if/else, case,while等控制語句,通過編寫存儲過程,可以實現複雜的邏輯功能;
  2. 函數的普遍特性:模塊化,封裝,代碼複用;
  3. 速度快,只有首次執行需經過編譯和優化步驟,後續被調用可以直接執行,省去以上步驟;

MySQL存儲過程的創建

1、語法

CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body

CREATE PROCEDURE 過程名([[IN|OUT|INOUT] 參數名 數據類型[,[IN|OUT|INOUT] 參數名 數據類型…]]) [特性 ...] 過程體

DELIMITER //
CREATE PROCEDURE myproc(OUT s int)
BEGIN
SELECT COUNT(*) INTO s FROM students;
END
//
DELIMITER ;

MySQL默認以";"為分隔符,如果沒有聲明分割符,則編譯器會把存儲過程當成SQL語句進行處理,因此編譯過程會報錯,所以要事先用“DELIMITER //”聲明當前段分隔符,讓編譯器把兩個"//"之間的內容當做存儲過程的代碼,不會執行這些代碼;“DELIMITER ;”的意為把分隔符還原。

2、參數

存儲過程根據需要可能會有輸入、輸出、輸入輸出參數,如果有多個參數用","分割開。MySQL存儲過程的參數用在存儲過程的定義,共有三種參數類型,IN,OUT,INOUT:

  • IN參數的值必須在調用存儲過程時指定,在存儲過程中修改該參數的值不能被返回,為默認值
  • OUT:該值可在存儲過程內部被改變,並可返回
  • INOUT:調用時指定,並且可被改變和返回

其中,sp_name參數是存儲過程的名稱;proc_parameter表示存儲過程的參數列表; characteristic參數指定存儲過程的特性;routine_body參數是SQL代碼的內容,可以用BEGIN…END來標誌SQL代碼的開始和結束。

技巧:創建存儲過程時,系統默認指定CONTAINS SQL,表示存儲過程中使用了SQL語句。但是,如果存儲過程中沒有使用SQL語句,最好設置為NO SQL。而且,存儲過程中最好在COMMENT部分對存儲過程進行簡單的註釋,以便以後在閱讀存儲過程的代碼時更加方便。


存儲過程實例

下面創建一個名為num_from_employee的存儲過程。

詳解MYSQL數據庫的存儲過程和函數語法總結

上述存儲過程名稱為num_from_employee;輸入變量為emp_id;輸出變量為count_num。SELECT語句從employee表查詢d_id值等於emp_id的記錄,並用COUNT(*)計算d_id值相同的記錄的條數,最後將計算結果存入count_num中。執行結果如下:

詳解MYSQL數據庫的存儲過程和函數語法總結

執行完畢後,沒有報出任何出錯信息就表示存儲函數已經創建成功。以後就可以調用這個存儲過程,數據庫中會執行存儲過程中的SQL語句。

說明:MySQL中默認的語句結束符為分號(;)。存儲過程中的SQL語句需要分號來 結束。為了避免衝突,首先用"DELIMITER &&"將MySQL的結束符設置為&&。最後再用"DELIMITER ;"來將結束符恢復成分號。這與創建觸發器時是一樣的。


函數

在MySQL中,創建存儲函數的基本形式如下:

CREATE FUNCTION sp_name ([func_parameter[,...]]) RETURNS type [characteristic ...] routine_body

其中,sp_name參數是存儲函數的名稱;func_parameter表示存儲函數的參數列表;RETURNS type指定返回值的類型;characteristic參數指定存儲函數的特性,該參數的取值與存儲過程中的取值是一樣的;routine_body參數是SQL代碼的內容,可以用BEGIN…END來標誌SQL代碼的開始和結束。

func_parameter可以由多個參數組成,其中每個參數由參數名稱和參數類型組成,其形式如下:param_name type

其中,param_name參數是存儲函數的參數名稱;type參數指定存儲函數的參數類型,該類型可以是MySQL數據庫的任意數據類型。


函數實例

下面創建一個名為name_from_employee的存儲函數。

詳解MYSQL數據庫的存儲過程和函數語法總結

上述存儲函數的名稱為name_from_employee;該函數的參數為emp_id;返回值是VARCHAR類型。SELECT語句從employee表查詢num值等於emp_id的記錄,並將該記錄的name字段的值返回。執行結果如下:

詳解MYSQL數據庫的存儲過程和函數語法總結

結果顯示,存儲函數已經創建成功。該函數的使用和MySQL內部函數的使用方法一樣。


變量的使用

在存儲過程和函數中,可以定義和使用變量。用戶可以使用DECLARE關鍵字來定義變量。然後可以為變量賦值。這些變量的作用範圍是BEGIN…END程序段中。

1、定義變量

MySQL中可以使用DECLARE關鍵字來定義變量。定義變量的基本語法如下:

DECLARE var_name[,...] type [DEFAULT value]

其中, DECLARE關鍵字是用來聲明變量的;var_name參數是變量的名稱,這裡可以同時定義多個變量;type參數用來指定變量的類型;DEFAULT value子句將變量默認值設置為value,沒有使用DEFAULT子句時,默認值為NULL。

下面定義變量my_sql,數據類型為INT型,默認值為10。

DECLARE my_sql INT DEFAULT 10 ;

2、為變量賦值

MySQL中可以使用SET關鍵字來為變量賦值。SET語句的基本語法如下:

SET var_name = expr [, var_name = expr] ...

其中,SET關鍵字是用來為變量賦值的;var_name參數是變量的名稱;expr參數是賦值表達式。一個SET語句可以同時為多個變量賦值,各個變量的賦值語句之間用逗號隔開。

下面為變量my_sql賦值為30。

SET my_sql = 30 ;

MySQL中還可以使用SELECT…INTO語句為變量賦值。其基本語法如下:

SELECT col_name[,…] INTO var_name[,…] FROM table_name WEHRE condition

其中,col_name參數表示查詢的字段名稱;var_name參數是變量的名稱;table_name參數指表的名稱;condition參數指查詢條件。

下面從employee表中查詢id為2的記錄,將該記錄的d_id值賦給變量my_sql。

SELECT d_id INTO my_sql FROM employee WEHRE id=2 ;

MySQL存儲過程寫法總結

1、創建無參存儲過程。

create procedure product()
begin
select * from user;
end;

一條簡單的存儲過程創建語句,此時調用的語句為:

call procedure();

2、創建有參存儲過程

有參的存儲包括兩種參數,

一個是傳入參數;

一個是傳出參數;

例如一個存儲過程:

create procedure procedure2(
out p1 decimal(8,2),
out p2 decimal(8,2),
in p3 int
)
begin
select sum(uid) into p1 from user where order_name = p3;
select avg(uid) into p2 from user ;
end ;

從上面sql語句可以看出,p1和p2是用來檢索並且傳出去的值,而p3則是必須有調用這傳入的具體值。

具體調用過程:

call product(); //無參

call procedure2(@userSum,@userAvg,201708); //有參

當用完後,可以直接查詢userSum和userAvg的值:

select @userSum, @userAvg;

結果如下:

"

什麼是存儲過程

簡單的說,就是一組SQL語句集,功能強大,可以實現一些比較複雜的邏輯功能,類似於JAVA語言中的方法;

ps:存儲過程跟觸發器有點類似,都是一組SQL集,但是存儲過程是主動調用的,且功能比觸發器更加強大,觸發器是某件事觸發後自動調用;


存儲過程特性

  1. 有輸入輸出參數,可以聲明變量,有if/else, case,while等控制語句,通過編寫存儲過程,可以實現複雜的邏輯功能;
  2. 函數的普遍特性:模塊化,封裝,代碼複用;
  3. 速度快,只有首次執行需經過編譯和優化步驟,後續被調用可以直接執行,省去以上步驟;

MySQL存儲過程的創建

1、語法

CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body

CREATE PROCEDURE 過程名([[IN|OUT|INOUT] 參數名 數據類型[,[IN|OUT|INOUT] 參數名 數據類型…]]) [特性 ...] 過程體

DELIMITER //
CREATE PROCEDURE myproc(OUT s int)
BEGIN
SELECT COUNT(*) INTO s FROM students;
END
//
DELIMITER ;

MySQL默認以";"為分隔符,如果沒有聲明分割符,則編譯器會把存儲過程當成SQL語句進行處理,因此編譯過程會報錯,所以要事先用“DELIMITER //”聲明當前段分隔符,讓編譯器把兩個"//"之間的內容當做存儲過程的代碼,不會執行這些代碼;“DELIMITER ;”的意為把分隔符還原。

2、參數

存儲過程根據需要可能會有輸入、輸出、輸入輸出參數,如果有多個參數用","分割開。MySQL存儲過程的參數用在存儲過程的定義,共有三種參數類型,IN,OUT,INOUT:

  • IN參數的值必須在調用存儲過程時指定,在存儲過程中修改該參數的值不能被返回,為默認值
  • OUT:該值可在存儲過程內部被改變,並可返回
  • INOUT:調用時指定,並且可被改變和返回

其中,sp_name參數是存儲過程的名稱;proc_parameter表示存儲過程的參數列表; characteristic參數指定存儲過程的特性;routine_body參數是SQL代碼的內容,可以用BEGIN…END來標誌SQL代碼的開始和結束。

技巧:創建存儲過程時,系統默認指定CONTAINS SQL,表示存儲過程中使用了SQL語句。但是,如果存儲過程中沒有使用SQL語句,最好設置為NO SQL。而且,存儲過程中最好在COMMENT部分對存儲過程進行簡單的註釋,以便以後在閱讀存儲過程的代碼時更加方便。


存儲過程實例

下面創建一個名為num_from_employee的存儲過程。

詳解MYSQL數據庫的存儲過程和函數語法總結

上述存儲過程名稱為num_from_employee;輸入變量為emp_id;輸出變量為count_num。SELECT語句從employee表查詢d_id值等於emp_id的記錄,並用COUNT(*)計算d_id值相同的記錄的條數,最後將計算結果存入count_num中。執行結果如下:

詳解MYSQL數據庫的存儲過程和函數語法總結

執行完畢後,沒有報出任何出錯信息就表示存儲函數已經創建成功。以後就可以調用這個存儲過程,數據庫中會執行存儲過程中的SQL語句。

說明:MySQL中默認的語句結束符為分號(;)。存儲過程中的SQL語句需要分號來 結束。為了避免衝突,首先用"DELIMITER &&"將MySQL的結束符設置為&&。最後再用"DELIMITER ;"來將結束符恢復成分號。這與創建觸發器時是一樣的。


函數

在MySQL中,創建存儲函數的基本形式如下:

CREATE FUNCTION sp_name ([func_parameter[,...]]) RETURNS type [characteristic ...] routine_body

其中,sp_name參數是存儲函數的名稱;func_parameter表示存儲函數的參數列表;RETURNS type指定返回值的類型;characteristic參數指定存儲函數的特性,該參數的取值與存儲過程中的取值是一樣的;routine_body參數是SQL代碼的內容,可以用BEGIN…END來標誌SQL代碼的開始和結束。

func_parameter可以由多個參數組成,其中每個參數由參數名稱和參數類型組成,其形式如下:param_name type

其中,param_name參數是存儲函數的參數名稱;type參數指定存儲函數的參數類型,該類型可以是MySQL數據庫的任意數據類型。


函數實例

下面創建一個名為name_from_employee的存儲函數。

詳解MYSQL數據庫的存儲過程和函數語法總結

上述存儲函數的名稱為name_from_employee;該函數的參數為emp_id;返回值是VARCHAR類型。SELECT語句從employee表查詢num值等於emp_id的記錄,並將該記錄的name字段的值返回。執行結果如下:

詳解MYSQL數據庫的存儲過程和函數語法總結

結果顯示,存儲函數已經創建成功。該函數的使用和MySQL內部函數的使用方法一樣。


變量的使用

在存儲過程和函數中,可以定義和使用變量。用戶可以使用DECLARE關鍵字來定義變量。然後可以為變量賦值。這些變量的作用範圍是BEGIN…END程序段中。

1、定義變量

MySQL中可以使用DECLARE關鍵字來定義變量。定義變量的基本語法如下:

DECLARE var_name[,...] type [DEFAULT value]

其中, DECLARE關鍵字是用來聲明變量的;var_name參數是變量的名稱,這裡可以同時定義多個變量;type參數用來指定變量的類型;DEFAULT value子句將變量默認值設置為value,沒有使用DEFAULT子句時,默認值為NULL。

下面定義變量my_sql,數據類型為INT型,默認值為10。

DECLARE my_sql INT DEFAULT 10 ;

2、為變量賦值

MySQL中可以使用SET關鍵字來為變量賦值。SET語句的基本語法如下:

SET var_name = expr [, var_name = expr] ...

其中,SET關鍵字是用來為變量賦值的;var_name參數是變量的名稱;expr參數是賦值表達式。一個SET語句可以同時為多個變量賦值,各個變量的賦值語句之間用逗號隔開。

下面為變量my_sql賦值為30。

SET my_sql = 30 ;

MySQL中還可以使用SELECT…INTO語句為變量賦值。其基本語法如下:

SELECT col_name[,…] INTO var_name[,…] FROM table_name WEHRE condition

其中,col_name參數表示查詢的字段名稱;var_name參數是變量的名稱;table_name參數指表的名稱;condition參數指查詢條件。

下面從employee表中查詢id為2的記錄,將該記錄的d_id值賦給變量my_sql。

SELECT d_id INTO my_sql FROM employee WEHRE id=2 ;

MySQL存儲過程寫法總結

1、創建無參存儲過程。

create procedure product()
begin
select * from user;
end;

一條簡單的存儲過程創建語句,此時調用的語句為:

call procedure();

2、創建有參存儲過程

有參的存儲包括兩種參數,

一個是傳入參數;

一個是傳出參數;

例如一個存儲過程:

create procedure procedure2(
out p1 decimal(8,2),
out p2 decimal(8,2),
in p3 int
)
begin
select sum(uid) into p1 from user where order_name = p3;
select avg(uid) into p2 from user ;
end ;

從上面sql語句可以看出,p1和p2是用來檢索並且傳出去的值,而p3則是必須有調用這傳入的具體值。

具體調用過程:

call product(); //無參

call procedure2(@userSum,@userAvg,201708); //有參

當用完後,可以直接查詢userSum和userAvg的值:

select @userSum, @userAvg;

結果如下:

詳解MYSQL數據庫的存儲過程和函數語法總結

3、刪除存儲過程

語法:drop procedure procedure_name;


後面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注一下~

"

什麼是存儲過程

簡單的說,就是一組SQL語句集,功能強大,可以實現一些比較複雜的邏輯功能,類似於JAVA語言中的方法;

ps:存儲過程跟觸發器有點類似,都是一組SQL集,但是存儲過程是主動調用的,且功能比觸發器更加強大,觸發器是某件事觸發後自動調用;


存儲過程特性

  1. 有輸入輸出參數,可以聲明變量,有if/else, case,while等控制語句,通過編寫存儲過程,可以實現複雜的邏輯功能;
  2. 函數的普遍特性:模塊化,封裝,代碼複用;
  3. 速度快,只有首次執行需經過編譯和優化步驟,後續被調用可以直接執行,省去以上步驟;

MySQL存儲過程的創建

1、語法

CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body

CREATE PROCEDURE 過程名([[IN|OUT|INOUT] 參數名 數據類型[,[IN|OUT|INOUT] 參數名 數據類型…]]) [特性 ...] 過程體

DELIMITER //
CREATE PROCEDURE myproc(OUT s int)
BEGIN
SELECT COUNT(*) INTO s FROM students;
END
//
DELIMITER ;

MySQL默認以";"為分隔符,如果沒有聲明分割符,則編譯器會把存儲過程當成SQL語句進行處理,因此編譯過程會報錯,所以要事先用“DELIMITER //”聲明當前段分隔符,讓編譯器把兩個"//"之間的內容當做存儲過程的代碼,不會執行這些代碼;“DELIMITER ;”的意為把分隔符還原。

2、參數

存儲過程根據需要可能會有輸入、輸出、輸入輸出參數,如果有多個參數用","分割開。MySQL存儲過程的參數用在存儲過程的定義,共有三種參數類型,IN,OUT,INOUT:

  • IN參數的值必須在調用存儲過程時指定,在存儲過程中修改該參數的值不能被返回,為默認值
  • OUT:該值可在存儲過程內部被改變,並可返回
  • INOUT:調用時指定,並且可被改變和返回

其中,sp_name參數是存儲過程的名稱;proc_parameter表示存儲過程的參數列表; characteristic參數指定存儲過程的特性;routine_body參數是SQL代碼的內容,可以用BEGIN…END來標誌SQL代碼的開始和結束。

技巧:創建存儲過程時,系統默認指定CONTAINS SQL,表示存儲過程中使用了SQL語句。但是,如果存儲過程中沒有使用SQL語句,最好設置為NO SQL。而且,存儲過程中最好在COMMENT部分對存儲過程進行簡單的註釋,以便以後在閱讀存儲過程的代碼時更加方便。


存儲過程實例

下面創建一個名為num_from_employee的存儲過程。

詳解MYSQL數據庫的存儲過程和函數語法總結

上述存儲過程名稱為num_from_employee;輸入變量為emp_id;輸出變量為count_num。SELECT語句從employee表查詢d_id值等於emp_id的記錄,並用COUNT(*)計算d_id值相同的記錄的條數,最後將計算結果存入count_num中。執行結果如下:

詳解MYSQL數據庫的存儲過程和函數語法總結

執行完畢後,沒有報出任何出錯信息就表示存儲函數已經創建成功。以後就可以調用這個存儲過程,數據庫中會執行存儲過程中的SQL語句。

說明:MySQL中默認的語句結束符為分號(;)。存儲過程中的SQL語句需要分號來 結束。為了避免衝突,首先用"DELIMITER &&"將MySQL的結束符設置為&&。最後再用"DELIMITER ;"來將結束符恢復成分號。這與創建觸發器時是一樣的。


函數

在MySQL中,創建存儲函數的基本形式如下:

CREATE FUNCTION sp_name ([func_parameter[,...]]) RETURNS type [characteristic ...] routine_body

其中,sp_name參數是存儲函數的名稱;func_parameter表示存儲函數的參數列表;RETURNS type指定返回值的類型;characteristic參數指定存儲函數的特性,該參數的取值與存儲過程中的取值是一樣的;routine_body參數是SQL代碼的內容,可以用BEGIN…END來標誌SQL代碼的開始和結束。

func_parameter可以由多個參數組成,其中每個參數由參數名稱和參數類型組成,其形式如下:param_name type

其中,param_name參數是存儲函數的參數名稱;type參數指定存儲函數的參數類型,該類型可以是MySQL數據庫的任意數據類型。


函數實例

下面創建一個名為name_from_employee的存儲函數。

詳解MYSQL數據庫的存儲過程和函數語法總結

上述存儲函數的名稱為name_from_employee;該函數的參數為emp_id;返回值是VARCHAR類型。SELECT語句從employee表查詢num值等於emp_id的記錄,並將該記錄的name字段的值返回。執行結果如下:

詳解MYSQL數據庫的存儲過程和函數語法總結

結果顯示,存儲函數已經創建成功。該函數的使用和MySQL內部函數的使用方法一樣。


變量的使用

在存儲過程和函數中,可以定義和使用變量。用戶可以使用DECLARE關鍵字來定義變量。然後可以為變量賦值。這些變量的作用範圍是BEGIN…END程序段中。

1、定義變量

MySQL中可以使用DECLARE關鍵字來定義變量。定義變量的基本語法如下:

DECLARE var_name[,...] type [DEFAULT value]

其中, DECLARE關鍵字是用來聲明變量的;var_name參數是變量的名稱,這裡可以同時定義多個變量;type參數用來指定變量的類型;DEFAULT value子句將變量默認值設置為value,沒有使用DEFAULT子句時,默認值為NULL。

下面定義變量my_sql,數據類型為INT型,默認值為10。

DECLARE my_sql INT DEFAULT 10 ;

2、為變量賦值

MySQL中可以使用SET關鍵字來為變量賦值。SET語句的基本語法如下:

SET var_name = expr [, var_name = expr] ...

其中,SET關鍵字是用來為變量賦值的;var_name參數是變量的名稱;expr參數是賦值表達式。一個SET語句可以同時為多個變量賦值,各個變量的賦值語句之間用逗號隔開。

下面為變量my_sql賦值為30。

SET my_sql = 30 ;

MySQL中還可以使用SELECT…INTO語句為變量賦值。其基本語法如下:

SELECT col_name[,…] INTO var_name[,…] FROM table_name WEHRE condition

其中,col_name參數表示查詢的字段名稱;var_name參數是變量的名稱;table_name參數指表的名稱;condition參數指查詢條件。

下面從employee表中查詢id為2的記錄,將該記錄的d_id值賦給變量my_sql。

SELECT d_id INTO my_sql FROM employee WEHRE id=2 ;

MySQL存儲過程寫法總結

1、創建無參存儲過程。

create procedure product()
begin
select * from user;
end;

一條簡單的存儲過程創建語句,此時調用的語句為:

call procedure();

2、創建有參存儲過程

有參的存儲包括兩種參數,

一個是傳入參數;

一個是傳出參數;

例如一個存儲過程:

create procedure procedure2(
out p1 decimal(8,2),
out p2 decimal(8,2),
in p3 int
)
begin
select sum(uid) into p1 from user where order_name = p3;
select avg(uid) into p2 from user ;
end ;

從上面sql語句可以看出,p1和p2是用來檢索並且傳出去的值,而p3則是必須有調用這傳入的具體值。

具體調用過程:

call product(); //無參

call procedure2(@userSum,@userAvg,201708); //有參

當用完後,可以直接查詢userSum和userAvg的值:

select @userSum, @userAvg;

結果如下:

詳解MYSQL數據庫的存儲過程和函數語法總結

3、刪除存儲過程

語法:drop procedure procedure_name;


後面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注一下~

詳解MYSQL數據庫的存儲過程和函數語法總結

"

相關推薦

推薦中...