mysql預存程序的作用:1、透過把處理封裝在容易使用的單元中,簡化複雜的操作;2、簡化對變動的管理;3、有助於提升應用程式的效能;4 、有助於減少應用程式和資料庫伺服器之間的流量,因為應用程式不必發送多個冗長的SQL語句,而只使用發送預存程序的名稱和參數;5、可增強SQL語句的功能和靈活性,使mysql能完成複雜的判斷和較複雜的運算;6、可提高資料庫的安全性和資料的完整性等等。
本教學操作環境:windows7系統、mysql8版本、Dell G3電腦。
#預存程序是一組為了完成特定功能的 SQL 語句集合。使用預存程序的目的是將常用或複雜的工作預先用 SQL 語句寫好並用一個指定名稱儲存起來,這個過程經過編譯和優化後儲存在資料庫伺服器中,因此稱為預存程序。當日後需要資料庫提供與已定義好的預存程序的功能相同的服務時,只需呼叫「CALL預存程序名稱」即可自動完成。
常用操作資料庫的 SQL 語句在執行的時候需要先編譯,然後再執行。預存程序則採用另一種方式來執行 SQL 語句。
一個預存程序是一個可程式化的函數,它在資料庫中建立並保存,一般由 SQL 語句和一些特殊的控制結構組成。當希望在不同的應用程式或平台上執行相同的特定功能時,預存程序尤其合適。
MySQL 5.0 版本以前不支援預存程序,這讓 MySQL 在應用程式上大打折扣。 MySQL 從5.0 版本開始支援預存程序,既提高了資料庫的處理速度,同時也提高了資料庫程式設計的靈活性
預存程序是資料庫中的重要功能,預存程序可以用來轉換資料、資料遷移、製作報表,它類似程式語言,一次執行成功,就可以隨時被調用,完成指定的功能操作。
使用預存程序不僅可以提高資料庫的存取效率,同時也可以提高資料庫使用的安全性。
對於呼叫者來說,預存程序封裝了 SQL 語句,呼叫者無需考慮邏輯功能的特定實作過程。只是簡單呼叫即可,它可以被 Java 和 C# 等程式語言呼叫。
預存程序的作用(優點)
#透過將處理封裝在容易使用的單元中,簡化複雜的操作;
簡化對變動的管理。如果表名、列名或業務邏輯有變化。只需要更改預存程序的程式碼,使用它的人員不會改變自己的程式碼;
通常預存程序有助於提高應用程式的效能。當創建的預存程序被編譯之後,就儲存在資料庫中。但是,MySQL 實作的預存程序略有不同。 MySQL 預存程序按需編譯。在編譯預存程序之後,MySQL 將其放入快取中。 MySQL 為每個連線維護自己的預存程序快取。如果應用程式在單一連線中多次使用預存程序,則使用編譯版本,否則預存程序的工作方式類似於查詢;
預存程序有助於減少應用程式和資料庫伺服器之間的流量,因為應用程式不必傳送多個冗長的SQL 語句,而只使用傳送預存程序的名稱和參數;
預存程序的缺點
預存程序的建構使得開發具有複雜業務邏輯的預存程序變得更加困難;
很難偵錯預存程序。只有少數資料庫管理系統允許您調試預存程序。不幸的是,MySQL 不提供偵錯預存程序的功能;
開發和維護預存程序並不容易。開發和維護預存程序通常需要一個不是所有應用程式開發人員擁有的專業技能。這可能會導致應用程式開發和維護階段的問題。
建立儲存過程,程式碼如下所示:
-- 创建存储过程 create procedure mypro(in a int,in b int,out sum int) begin set sum = a+b; end;
運行結果如下
#也可以在Navicat 用戶端「函數」節點下查看過程,如下圖中所示:
呼叫儲存過程,程式碼如下所示:
call mypro(1,2,@s);-- 调用存储过程 select @s;-- 显示过程输出结果
執行結果
create procedure
用來建立過程;mypro
用來定義過程名稱;(in a int,in b int,out sum int)
表示過程的參數,其中in
表示輸入參數,out
表示輸出參數。類似Java 定義方法時的形參與傳回值;begin
與end
表示過程主體的開始與結束,相當於Java 定義方法的一對大括號;call
用來呼叫過程,@s
是用來接收過程輸出參數的變數MySQL 預存程序的參數用在預存程序的定義,共有三種參數型別:
IN
輸入參數:表示呼叫者向過程傳入值(傳入值可以是字面量或變數);OUT
輸出參數:表示過程向呼叫者傳出值(可以傳回多個值)(傳出值只能是變數);INOUT
輸入輸出參數:既表示呼叫者向過程傳入值,又表示過程向呼叫者傳出值(值只能是變數)。 預存程序依參數可分為四個類別:
1).沒有參數的流程;
2).只有輸入參數的流程;
3).只有輸出參數的過程;
4).包含輸入和輸出參數的過程。
MySQL 中的預存程序類似 java 中的方法。
既然如此,在預存過程中也同樣可以使用變數。 java 中的局部變數作用域是變數所在的方法,而 MySQL 中的局部變數作用域是所在的預存程序。
DECLARE variable_name [,variable_name...] datatype [DEFAULT value];
#declare
用於宣告變數;
variable_name
表示變數名稱;
#datatype
為MySQL 的資料類型;
#default
用於宣告預設值;
例如:
declare name varchar(20) default ‘jack’。
SET 变量名 = 表达式值 [,variable_name = expression ...]
在預存程序中使用變量,程式碼如下所示
use schooldb;-- 使用 schooldb 数据库 -- 创建过程 create procedure mypro1() begin declare name varchar(20); set name = '丘处机'; select * from studentinfo where studentname = name; end; -- 调用过程 call mypro1();
運行結果
IF
語句包含多個條件判斷,根據結果為
TRUE、
FALSE執行語句,與程式語言中的
if、
else if、
else
-- 创建过程 create procedure mypro2(in num int) begin if num執行結果<p><img src="https://img.php.cn/upload/article/000/000/024/fe178bfb1a0eb7dd09df67d79c722d95-4.png" alt="mysql預存程序有什麼用"></p><h4> <a id="case__169"></a><strong></strong>case 條件語句</h4><p><code></code>case<code>是另一個條件判斷的語句,類似於程式語言中的</code>choose<code>、</code>when<code>語法。 MySQL 中的 </code>case<br>語句有兩種文法</p> 格式。 <p></p>定義預存程序,輸入整數,使用case 語句判斷是正數還是負數,程式碼如下所示:<p></p><pre class="brush:php;toolbar:false">-- 创建过程 create procedure mypro3(in num int) begin case -- 条件开始 when num執行結果<p><img src="https://img.php.cn/upload/article/000/000/024/fcb90e661eadc288d2d1d57364b7978a-5.png" alt="mysql預存程序有什麼用"></p><p></p><p></p>###################################################### ##定義預存程序,輸入整數,使用case 語句判斷是1 還是2,程式碼如下:###<pre class="brush:php;toolbar:false">-- 创建过程 create procedure mypro4(in num int) begin case num -- 条件开始 when 1 then select '数值是 1'; when 2 then select '数值是 2'; else select '不是 1 也不是 2'; end case; -- 条件结束 end; -- 调用过程 call mypro4(3);
两种 case 语法都可以实现条件判断,但第一种适合范围值判断,而第二种适合确定值判断。
while
语句的用法和 java
中的 while
循环类似。
定义存储过程,使用 while 循环输出 1 到 10 的累加和,代码如下所示:
-- 创建过程 create procedure mypro5(out sum int) begin declare num int default 0; set sum = 0; while num<p>运行结果</p><p><img src="https://img.php.cn/upload/article/000/000/024/fcb90e661eadc288d2d1d57364b7978a-7.png" alt="mysql預存程序有什麼用"></p><h4> <a id="repeat__243"></a><strong>repeat 循环语句</strong> </h4><p><code>repeat</code>语句的用法和 <code>java</code>中的 <code>do…while</code> 语句类似,都是先执行循环操作,再判断条件,区别是 <code>repeat</code>表达<br> 式值为 <code>false</code>时才执行循环操作,直到表达式值为 <code>true</code>停止。</p><p>定义存储过程,使用 repeat 循环输出 1 到 10 的累加和,代码如下所示:</p><pre class="brush:php;toolbar:false">-- 创建过程 create procedure mypro6(out sum int) begin declare num int default 0; set sum = 0; repeat-- 循环开始 set num = num+1; set sum = sum+num; until num>=10 end repeat; -- 循环结束 end; -- 调用过程 call mypro6(@sum); -- 查询变量值 select @sum;
运行结果
循环语句,用来重复执行某些语句。
执行过程中可使用 leave
语句或 iterate
跳出循环,也可以嵌套 IF
等判断语句。
leave
语句效果相当于 java 中的 break
,用来终止循环;iterate
语句效果相当于 java 中的 continue
,用来结束本次循环操作,进入下一次循环。定义存储过程,使用 loop 循环输出 1 到 10 的累加和,代码如下所示:
-- 创建过程 create procedure mypro7(out sum int) begin declare num int default 0; set sum = 0; loop_sum:loop-- 循环开始 set num = num+1; set sum = sum+num; if num>=10 then leave loop_sum; end if; end loop loop_sum; -- 循环结束 end; -- 调用过程 call mypro7(@sum); -- 查询变量值 select @sum;
运行结果
代码中的 loop_sum 相当于给循环贴个标签,方便多重循环时灵活操作。
存储过程的管理主要包括:显示过程、显示过程源码、删除过程。
比较简单的方式就是利用 navicat 客户端工具进行管理,鼠标点击操作即可,如下图所示:
SHOW PROCEDURE STATUS;
SHOW PROCEDURE status where db = 'schooldb';
SHOW PROCEDURE status where name like '%my%';
SHOW CREATE PROCEDURE mypro1;
drop PROCEDURE mypro1;
【相关推荐:mysql视频教程】
以上是mysql預存程序有什麼用的詳細內容。更多資訊請關注PHP中文網其他相關文章!