面試官突然問我MySQL儲存過程,我竟然連基礎都不會!(詳細)
MySQL儲存過程
一、儲存過程
1.1 什麼是儲存過程
儲存過程(Stored Procedure)是在大型資料庫系統中,一組為了完成特定功能的SQL 語句集,它儲存在資料庫中,一次編譯後永久有效,使用者通過指定儲存過程的名字並給出引數(如果該儲存過程帶有引數)來執行它。儲存過程是資料庫中的一個重要物件。在資料量特別龐大的情況下利用儲存過程能達到倍速的效率提升
1.2 資料庫儲存過程程式
當我們了了解儲存過程是什麼之後,就需要了解資料庫中存在的這三種類型的資料庫儲存型別程式,如下:
- 儲存過程: 儲存過程是最常見的儲存程式,儲存過程是能夠接受輸入和輸出引數並且能夠在請求時被執行的程式單元。
- 儲存函式: 儲存函式和儲存過程很相像,但是它的執行結果會返回一個值。最重要的是儲存函式可以被用來充當標準的 SQL 語句,允許程式設計師有效的擴充套件 SQL 語言的能力。
- 觸發器: 觸發器是用來響應啟用或者觸發資料庫行為事件的儲存程式。通常,觸發器用來作為資料庫操作語言的響應而被呼叫,觸發器可以被用來作為資料校驗和自動反向格式化。
注意: 其他的資料庫提供了別的資料儲存程式,包括包和類。目前MySQL不提供這種結構。
1.3 為什麼要使用儲存程式
雖然目前的開發中儲存程式我們使用的並不是很多,但是不一定就否認它。其實儲存程式會為我們使用和管理資料庫帶來了很多優勢:
- 使用儲存程式更加安全。
- 儲存程式提供了一種資料訪問的抽象機制,它能夠極大的改善你的程式碼在底層資料結構演化過程中的易維護性。
- 儲存程式可以降低網路擁阻,因為屬於資料庫伺服器的內部資料,這相比在網上傳輸資料要快的多。
- 儲存程式可以替多種使用不同構架的外圍應用實現共享的訪問例程,無論這些構架是基於資料庫伺服器外部還是內部。
- 以資料為中心的邏輯可以被獨立的放置於儲存程式中,這樣可以為程式設計師帶來更高、更為獨特的資料庫程式設計體驗。
- 在某些情況下,使用儲存程式可以改善應用程式的可移植性。(在另外某些情況下,可移植性也會很差!)
這裡我大致解釋一下上述幾種使用儲存程式的優勢:
我們要知道在Java語言中,我們使用資料庫與Java程式碼結合持久化儲存需要引入JDBC來完成。會想到JDBC,我們是否還能想起SQL注入問題呢?雖然使用PreparedStatement解決SQL注入問題,那就真的是絕對安全嗎?不,它不是絕對安全的。
這時候分析一下資料庫與Java程式碼的連線操作流程。在BS結構中,一般都是瀏覽器訪問伺服器的,再由伺服器傳送SQL語句到資料庫,在資料庫中對SQL語句進行編譯執行,最後把結果通過伺服器處理再返回瀏覽器。在此操作過程中,瀏覽器對伺服器每傳送一次對資料庫操作的請求就會呼叫對應的SQL語句編譯和執行,這是一件十分浪費效能的事情,效能下降 了就說明對資料庫的操作效率低 了。
還有一種可能是,在這個過程中進行傳送傳輸的SQL語句是對真實的庫表進行操作的SQL語句,如果在傳送傳輸的過程中被攔截了,一些不法分子會根據他所攔截的SQL語句推斷出我們資料庫中的庫表結構,這是一個很大的安全隱患 。
關於可維護性的提高,這裡模擬一個場景。通常資料庫在公司中是由DBA來管理的,如果管理資料庫多年的DBA辭職了,此時資料庫會被下一任DBA來管理。這裡時候問題來了,資料庫中這麼多的資料和SQL語句顯然對下一任管理者不太友好。就算管理多年的DBA長時間不操作檢視資料庫也會忘記點什麼東西。所以,我們在需要引入儲存程式來進行SQL語句的統一編寫和編譯,為維護提供了便利 。(其實我覺得這個例子並不生動合理,但是為了大家能理解,請體諒!)
講了很多儲存程式的優勢演變過程,其核心就是: 需要將編譯好的一段或多段SQL語句放置在資料庫端的儲存程式中,以便解決以上問題並方便開發者直接呼叫。
二、儲存過程的使用步驟
2.1 儲存過程的開發思想
儲存過程時資料庫的一個重要的物件,可以封裝SQL語句集,可以用來完成一些較複雜的業務邏輯,並且可以入參(傳參)、出參(返回引數),這裡與Java中封裝方式十分相似。
而且建立時會預先編譯後儲存,開發者後續的呼叫都不需要再次編譯。
2.2 儲存過程的優缺點
儲存過程使用的優缺點其實在1.3中的優勢中說到了。這裡我簡單羅列一下儲存過程的優點與缺點。
- 優點:
- 在生產環境下,可以通過直接修改儲存過程的方式修改業務邏輯或bug,而不用重啟伺服器。
- 執行速度快,儲存過程經過編譯之後會比單獨一條一條編譯執行要快很多。
- 減少網路傳輸流量。
- 便於開發者或DBA使用和維護。
- 在相同資料庫語法的情況下,改善了可移植性。
- 缺點:
- 過程化程式設計,複雜業務處理的維護成本高。
- 除錯不便。
- 因為不同資料庫語法不一致,不同資料庫之間可移植性差。
2.3 MySQL儲存過程的官方文件
英語好或者有能力的小夥伴可以去參考一下官方文件。如果不參考官方文件,沒關係,我在下面也會詳細講述MySQL儲存過程的各個知識點。
1https://dev.mysql.com/doc/refman/5.6/en/preface.html
2.3 儲存過程的使用語法
1create PROCEDURE 過程名( in|out|inout 引數名 資料型別 , ...)
2begin
3 sql語句;
4end;
5call 過程名(引數值);
in
是定義傳入引數的關鍵字。out
是定義出參的關鍵字。inout
是定義一個出入引數都可以的引數。如果括號內什麼都不定義,就說明該儲存過程時一個無參的函式。在後面會有詳細的案例分析。注意: SQL語句預設的結束符為
;
,所以在使用以上儲存過程時,會報1064的語法錯誤。我們可以使用DELIMITER
關鍵字臨時宣告修改SQL語句的結束符為//
,如下:
1-- 臨時定義結束符為"//"
2DELIMITER //
3create PROCEDURE 過程名( in|out 引數名 資料型別 , ...)
4begin
5 sql語句;
6end//
7-- 將結束符重新定義回結束符為";"
8DELIMITER ;
例如: 使用儲存過程來查詢員工的工資(無參)
注意: 如果在特殊的必要情況下,我們還可以通過delimiter
關鍵字將;
結束符宣告回來使用,在以下案例中我並沒有這樣將結束符宣告回原來的;
,在此請大家注意~
為什麼我在這裡提供了drop(刪除)呢?
是因為我們在使用的時候如果需要修改儲存過程中的內容,我們需要先刪除現有的儲存過程後,再creat重新建立。
1# 宣告結束符為//
2delimiter //
3
4# 建立儲存過程(函式)
5create procedure se()
6begin
7 select salary from employee;
8end //
9
10# 呼叫函式
11call se() //
12
13# 刪除已存在儲存過程——se()函式
14drop procedure if exists se //
三、儲存過程的變數和賦值
3.1 區域性變數
宣告區域性變數語法:
declare var_name type [default var_value];
賦值語法:
注意: 區域性變數的定義,在begin/end塊中有效。
使用set為引數賦值
1# set賦值
2
3# 宣告結束符為//
4delimiter //
5
6# 建立儲存過程
7create procedure val_set()
8begin
9 # 宣告一個預設值為unknown的val_name區域性變數
10 declare val_name varchar(32) default 'unknown';
11 # 為區域性變數賦值
12 set val_name = 'Centi';
13 # 查詢區域性變數
14 select val_name;
15end //
16
17# 呼叫函式
18call val_set() //
19
使用into接收引數
1delimiter //
2create procedure val_into()
3begin
4 # 定義兩個變數存放name和age
5 declare val_name varchar(32) default 'unknown';
6 declare val_age int;
7 # 查詢表中id為1的name和age並放在定義的兩個變數中
8 select name,age into val_name,val_age from employee where id = 1;
9 # 查詢兩個變數
10 select val_name,val_age;
11end //
12
13call val_into() //
14
3.2 使用者變數
使用者自定義使用者變數,當前會話(連線)有效。與Java中的成員變數相似。
- 語法:
@val_name
- 注意: 該使用者變數不需要提前宣告,使用即為宣告。
1delimiter //
2create procedure val_user()
3begin
4 # 為使用者變數賦值
5 set @val_name = 'Lacy';
6end //
7
8# 呼叫函式
9call val_user() //
10
11# 查詢該使用者變數
12select @val_name //
3.3 會話變數
會話變數是由系統提供的,只在當前會話(連線)中有效。
語法:
@@session.val_name
1# 檢視所有會話變數
2show session variables;
3# 檢視指定的會話變數
4select @@session.val_name;
5# 修改指定的會話變數
6set @@session.val_name = 0;
這裡我獲取了一下所有的會話變數,大概有500條會話變數的記錄。等我們深入學習MySQL後,瞭解了各個會話變數值的作用,可以根據需求和場景來修改會話變數值。
1delimiter //
2create procedure val_session()
3begin
4 # 檢視會話變數
5 show session variables;
6end //
7
8call val_session() //
9
3.4 全域性變數
全域性變數由系統提供,整個MySQL伺服器內有效。
語法:
@@global.val_name
1# 檢視全域性變數中變數名有char的記錄
2show global variables like '%char%' //
3# 檢視全域性變數character_set_client的值
4select @@global.character_set_client //
3.5 入參出參
入參出參的語法我們在文章開頭已經提過了,但是沒有演示,在這裡我將演示一下入參出參的使用。
語法:
in|out|inout 引數名 資料型別 , ...
in
定義出參;out
定義入參;inout
定義出參和入參。
出參in
使用出參in時,就是需要我們傳入引數,在這裡可以對參入的引數加以改變。簡單來說in只負責傳入引數到儲存過程中,類似Java中的形參。
1delimiter //
2create procedure val_in(in val_name varchar(32))
3begin
4 # 使用使用者變量出參(為使用者變數賦引數值)
5 set @val_name1 = val_name;
6end //
7
8# 呼叫函式
9call val_in('DK') //
10
11# 查詢該使用者變數
12select @val_name1 //
入參out
在使用out時,需要傳入一個引數。而這個引數相當於是返回值,可以通過呼叫、接收來獲取這個引數的內容。簡單來說out只負責作返回值。
1delimiter //
2# 建立一個入參和出參的儲存過程
3create procedure val_out(in val_id int,out val_name varchar(32))
4begin
5 # 傳入引數val_id查詢員工返回name值(查詢出的name值用出參接收並返回)
6 select name into val_name from employee where id = val_id;
7end //
8
9# 呼叫函式傳入引數並宣告傳入一個使用者變數
10call val_out(1, @n) //
11
12# 查詢使用者變數
13select @n //
入參出參inout
inout關鍵字,就是把in和out合併成了一個關鍵字使用。被關鍵字修飾的引數既可以出參也可以入參。
1delimiter //
2create procedure val_inout(in val_name varchar(32), inout val_age int)
3begin
4 # 宣告一個a變數
5 declare a int;
6 # 將傳入的引數賦值給a變數
7 set a = val_age;
8 # 通過name查詢age並返回val_age
9 select age into val_age from employee where name = val_name;
10 # 將傳入的a與-和查詢age結果字串做拼接並查詢出來(concat——拼接字串)
11 select concat(a, '-', val_age);
12end //
13
14# 宣告一個使用者變數並賦予引數為40
15set @ages = '40' //
16# 呼叫函式並傳入引數值
17call val_inout('Ziph', @ages) //
18# 執行結果
19# 40-18
四、儲存過程中的流程控制
4.1 if 條件判斷(推薦)
擴充套件:
timestampdiff(unit, exp1, exp2)
為exp2 - exp1得到的差值,而單位是unit。(常用於日期)擴充套件例子:
select timestampdiff(year,’2020-6-6‘,now()) from emp e where id = 1;
解釋擴充套件例子: 查詢員工表中id為1員工的年齡,exp2就可以為該員工的出生年月日,並以年為單位計算。
語法:
1IF 條件判斷 THEN 結果
2 [ELSEIF 條件判斷 THEN 結果] ...
3 [ELSE 結果]
4END IF
舉例: 傳入所查詢的id引數查詢工資標準(s<=6000為低工資標準;6000
1delimiter //
2create procedure s_sql(in val_id int)
3begin
4 # 宣告一個區域性變數result存放工資標準結果
5 declare result varchar(32);
6 # 宣告一個區域性變數存放查詢得到的工資
7 declare s double;
8 # 根據入參id查詢工資
9 select salary into s from employee where id = val_id;
10 # if判斷的使用
11 if s <= 6000 then
12 set result = '低工資標準';
13 elseif s <= 10000 then
14 set result = '中工資標準';
15 elseif s <= 15000 then
16 set result = '中上工資標準';
17 else
18 set result = '高工資標準';
19 end if;
20 # 查詢工資標準結果
21 select result;
22end //
23
24# 呼叫函式,傳入引數
25call s_sql(1);
4.2 case條件判斷
關於case語句,不僅僅在儲存過程中可以使用,MySQL基礎查詢語句中也有用到過。相當於是Java中的switch語句。
語法:
1# 語法一
2CASE case_value
3 WHEN when_value THEN 結果
4 [WHEN when_value THEN 結果] ...
5 [ELSE 結果]
6END CASE
7
8# 語法二(推薦語法)
9CASE
10 WHEN 條件判斷 THEN 結果
11 [WHEN 條件判斷 THEN 結果] ...
12 [ELSE 結果]
13END CASE
舉例:
1# 語法一
2delimiter //
3create procedure s_case(in val_id int)
4begin
5 # 宣告一個區域性變數result存放工資標準結果
6 declare result varchar(32);
7 # 宣告一個區域性變數存放查詢得到的工資
8 declare s double;
9 # 根據入參id查詢工資
10 select salary into s from employee where id = val_id;
11 case s
12 when 6000 then set result = '低工資標準';
13 when 10000 then set result = '中工資標準';
14 when 15000 then set result = '中上工資標準';
15 else set result = '高工資標準';
16 end case;
17 select result;
18end //
19
20call s_case(1);
21
22# 語法二(推薦)
23delimiter //
24create procedure s_case(in val_id int)
25begin
26 # 宣告一個區域性變數result存放工資標準結果
27 declare result varchar(32);
28 # 宣告一個區域性變數存放查詢得到的工資
29 declare s double;
30 # 根據入參id查詢工資
31 select salary into s from employee where id = val_id;
32 case
33 when s <= 6000 then set result = '低工資標準';
34 when s <= 10000 then set result = '中工資標準';
35 when s <= 15000 then set result = '中上工資標準';
36 else set result = '高工資標準';
37 end case;
38 select result;
39end //
40
41call s_case(1);
4.3 loop迴圈
loop為死迴圈,需要手動退出迴圈,我們可以使用
leave
來退出迴圈可以把leave看成Java中的break;與之對應的,就有
iterate
(繼續迴圈)也可以看成Java的continue
語法:
1[別名:] LOOP
2 迴圈語句
3END LOOP [別名]
注意:別名和別名控制的是同一個標籤。
示例1: 迴圈列印1~10(leave控制迴圈的退出)
注意:該loop迴圈為死迴圈,我們查的1~10數字是i,在死迴圈中設定了當大於等於10時停止迴圈,也就是說先後執行了10次該迴圈內的內容,結果查詢了10次,生成了10個結果(1~10)。
1delimiter //
2create procedure s_loop()
3begin
4 # 宣告計數器
5 declare i int default 1;
6 # 開始迴圈
7 num:
8 loop
9 # 查詢計數器記錄的值
10 select i;
11 # 判斷大於等於停止計數
12 if i >= 10 then
13 leave num;
14 end if;
15 # 計數器自增1
16 set i = i + 1;
17 # 結束迴圈
18 end loop num;
19end //
20
21call s_loop();
列印結果:
示例2: 迴圈列印1~10(iterate和leave控制迴圈)
注意:這裡我們使用字串拼接計數器結果,而條件如果用iterate就必須時 i < 10 了!
1delimiter //
2create procedure s_loop1()
3begin
4 # 宣告變數i計數器
5 declare i int default 1;
6 # 宣告字串容器
7 declare str varchar(256) default '1';
8 # 開始迴圈
9 num:
10 loop
11 # 計數器自增1
12 set i = i + 1;
13 # 字串容器拼接計數器結果
14 set str = concat(str, '-', i);
15 # 計數器i如果小於10就繼續執行
16 if i < 10 then
17 iterate num;
18 end if;
19 # 計數器i如果大於10就停止迴圈
20 leave num;
21 # 停止迴圈
22 end loop num;
23 # 查詢字串容器的拼接結果
24 select str;
25end //
26
27call s_loop1();
4.4 repeat迴圈
repeat迴圈類似Java中的do while迴圈,直到條件不滿足才會結束迴圈。
語法:
1[別名:] REPEAT
2 迴圈語句
3UNTIL 條件
4END REPEAT [別名]
示例: 迴圈列印1~10
1delimiter //
2create procedure s_repeat()
3begin
4 declare i int default 1;
5 declare str varchar(256) default '1';
6 # 開始repeat迴圈
7 num:
8 repeat
9 set i = i + 1;
10 set str = concat(str, '-', i);
11 # until 結束條件
12 # end repeat 結束num 結束repeat迴圈
13 until i >= 10 end repeat num;
14 # 查詢字串拼接結果
15 select str;
16end //
17
18call s_repeat();
4.5 while迴圈
while迴圈就與Java中的while迴圈很相似了。
語法:
1[別名] WHILE 條件 DO
2 迴圈語句
3END WHILE [別名]
示例: 迴圈列印1~10
1delimiter //
2create procedure s_while()
3begin
4 declare i int default 1;
5 declare str varchar(256) default '1';
6 # 開始while迴圈
7 num:
8 # 指定while迴圈結束條件
9 while i < 10 do
10 set i = i + 1;
11 set str = concat(str, '+', i);
12 # while迴圈結束
13 end while num;
14 # 查詢while迴圈拼接字串
15 select str;
16end //
17
18call s_while();
4.6 流程控制語句(繼續、結束)
至於流程控制的繼續和結束,我們在前面已經使用過了。這裡再列舉一下。
leave:與Java中break;相似
1leave 標籤;
iterate:與Java中的continue;相似
1iterate 標籤;
五、遊標與handler
5.1 遊標
遊標是可以得到某一個結果集並逐行處理資料。遊標的逐行操作,導致了遊標很少被使用!
語法:
相關推薦
面試官突然問我MySQL儲存過程,我竟然連基礎都不會!(詳細)
**所有知識體系文章,[GitHub](https://github.com/Ziphtracks/JavaLearningmanual)已收錄,歡迎Star!再次感謝,願你早日進入大廠!** **GitHub地址:** [https://github.com/Ziphtracks/JavaLearning
阿里巴巴Java程式設計師面試的11個題目,網友:居然一個都不會!
JAVA程式設計師是不是都以阿里、京東這些大的一線網際網路公司為目標?阿里巴巴java程式設計師
MySql儲存過程,傳陣列引數
專案中遇到批量資料的處理,使用hibernate的出來太慢,修改為儲存過程。 第一版修改為應用迴圈調儲存過程,發現效果不理想。可能是頻繁的開啟session和關閉。 第二版想法為,把所有引數傳入到儲存過程,迴圈引數為一個數組,mysql儲存過程裡沒有split函式, 取
mysql 儲存過程,迴圈
1. 儲存過程 delimiter // -- 分塊 -- 建立 drop procedure if exists test; create procedure test(in count int) begin declare i int; set i = 1; while (i <
面試官再問你 HashMap 底層原理,就把這篇文章甩給他看
前言 HashMap 原始碼和底層原理在現在面試中是必問的。因此,我們非常有必要搞清楚它的底層實現和思想,才能在面試中對答如流,跟面試官大戰三百回合。文章較長,介紹了很多原理性的問題,希望對你有所幫助~ 目錄 本篇文章主要包括以下內容: HashMap 的儲存結構 常用變數說明,如載入因子等 HashMap
面試官常問的“一致性雜湊”,都在這 18 張圖裡
大家好,好久不見啦。最近快年底了,公司、部門事情太多:衝刺 KPI、做部門預算……所以忙東忙西的,寫文章就被耽擱了。再加上這篇文章比較硬,我想給大家講得通俗易懂,著實花了很多時間琢磨怎麼寫。 話不多說,小故事開始。 # 前言 當架構師大劉看到實習生小李提交的**記賬流水亂序**的問題的時候,他知道沒錯了:
已知長度為n的線性表A採用順序儲存結構,請寫一個時間複雜度為O(n)、空間複雜度為O(1)的演算法,該演算法可刪除線性表中所有值為item的資料元素。
語言:C++ #include <iostream> using namespace std; typedef int ElemType; //定義 #define MAXSIZE 100 typedef struct {ElemType *elem; int length;}Sq
TCP的三次握手與四次揮手過程,各個狀態名稱與含義 三次握手(轉載)
TCP的三次握手與四次揮手過程,各個狀態名稱與含義 三次握手 第一次握手:主機A傳送位碼為syn=1,隨機產生seq number=10001的資料包到伺服器,主機B由SYN=1知道,A要求建立聯機,此時狀態為SYN_SENT; 第二次握手:主機B收到請求後要確
docker掃盲,面試連這都不會就等著掛吧!
現在很多公司專案部署都是採用K8S docker容器方式,出門面試被問的概率極大,如果被面試官問docker相關知識點直接懵逼,那麼基本就是被pass了,除非其他方面技術過硬。所以這種相對前沿的技術,就算達不到精通的程度,起碼還是要了解基礎理論和操作 一.安裝docker Docker要求執行在Cento
面試你所要知道的:MySQL儲存過程
儲存過程簡介SQL語句需要先編譯然後執行,而儲存過程(Stored Procedure)是一組為了完成特定功能的SQL語句集,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給定引數(如果該儲存過程帶有引數)來呼叫執行它。儲存過程是可程式設計的函式,在資料庫中建立並儲存
mysql 儲存過程的一個bug或者是我…
是 儲存過程中 和 事件結合使用 會出現bug呢還是我寫的語句有問題?------------------------------------------------------------------------------------end
面試官再問我如何保證 RocketMQ 不丟失訊息,這回我笑了!
最近看了 @JavaGuide 釋出的一篇『面試官問我如何保證Kafka不丟失訊息?我哭了!』,這篇文章承接這個主題,來聊聊如何保證 RocketMQ 不丟失訊息。 0x00. 訊息的傳送流程 一條訊息從生產到被消費,將會經歷三個階段: 生產階段,Producer 新建訊息,然後通過網路將訊息投遞給 M
面試官問我redis資料型別,我回答了8種
> **面試官**:小明呀,redis 有幾種資料結構呀? > > **小明**:8 種 > > **面試官**:那你說一下分別是什麼? > > **小明**:raw,int,ht,zipmap,linkedlist,ziplist,intset,skiplist,embstr > > **面試官**:額,你
位元組跳動面試官這樣問訊息佇列:高可用、不重複消費、可靠傳輸、順序消費、訊息堆積,我整理了下
## 寫在前面 又到了年底跳槽高峰季,很多小夥伴出去面試時,不少面試官都會問到訊息佇列的問題,不少小夥伴回答的不是很完美,有些小夥伴是心裡知道答案,嘴上卻沒有很好的表達出來,究其根本原因,還是對相關的知識點理解的不夠透徹。今天,我們就一起來探討下這個話題。注:文章有點長,你說你能一鼓作氣看完,我有點不信!!
Mysql儲存過程8:repeat循環
local cal 其他 host ted query code class pan 語法: repeat SQL until 條件 end repeat; 就是相當於其他語言中的: do{ # }while(); mys
Mysql儲存過程4:mysql變量設置
from 默認 pan procedure weight use mysql變量 sql 寫法 默認全局變量是兩個@@開頭, 可用show variables查看所有默認變量: @@user #declare定義變量只能用在儲存過程中 #declare 變量名 數據類型
Mysql儲存過程3:if語句
sql語句 inpu arguments ted div mysql then for clas --if/else語句 if 條件 then SQL語句 else SQL語句elseifSQL語句 end if; create procedure test1( n
Mysql儲存過程2:變量定義與參數傳遞
變量定義 color ted lec mysq 傳遞 參數傳遞 fault 可選 #儲存過程 中的變量定義 declare 變量名 類型 可選類型 -- 跟建表差不多 create procedure p() begin declare age int de
MySQL 儲存過程-原理、語法、函數詳細說明
exp sql 十六進制 作用範圍 安全機制 系統管理員 rtrim 編程 xtra Mysql儲存過程是一組為了完成特定功能的SQL語句集,經過編譯之後存儲在數據庫中,當需要使用該組SQL語句時用戶只需要通過指定儲存過程的名字並給定參數就可以調用執行它了,簡而言之就是一組