創建無參的存儲過程(四十七)


 

 

 

 

 

創建無參的存儲過程

  這節我們主要來學習Mysql數據庫的存儲過程,我們知道我們要經常的對數據表進行增刪改查的操作,或者叫CURD,實際上,當我們成功的輸入SQL命令時,mysql引擎會對輸入的命令進行語法分析,來檢查一下我們的sql命令是否正確,如果正確的話,將會進行編譯,編譯成mysql引擎能夠識別的語句。最后才開始執行,並將最后執行的結果返回給客戶端,這就是mysql命令的執行流程。

  我們想一下,如果我們把這個流程簡化一下,比如我們省略掉語法分析和編譯環節,那么mysql的執行效率是不是會有很大的提高,那么我們如何實現這個效果,那么就涉及到今天我們要講的存儲過程,那么首先我們來了解一下什么是存儲過程?

 

 

 

一、什么是存儲過程?

  存儲過程是SQL語句和控制語句的預編譯集合,以一個名稱存儲並作為一個單元處理

  存儲過程存儲在數據庫內,可以由應用程序調用執行,而且允許用戶聲明變量以及進行流程控制,存儲過程可以接收參數,可以接收輸入類型的參數,也可以接收輸出類型的參數,並且可以存在多個返回值。

  存儲過程的效率要比我們簡單的sql語句的執行的效率要高,原因就在於,比如我們要執行兩條語句,那么mysql引擎就會逐一的對這兩條語句進行分析,編譯和執行,而我們使用存儲過程之后,只有在第一次才會使用語法分析和編譯,以后客戶端再調用,只調用編譯后的結果就可以了,省略了分析和編譯的環節,所以效率要比之前要高,那么存儲過程具體會有哪些優點?

 

 

 

二、存儲過程的優點

  第一,增強了sql語句的功能和靈活性。

因為在存儲過程中可以寫控制語句,那么就有很強的靈活性,也可以完成復雜的判斷和運算。

  第二,實現了較快的執行速度。

如果某一個操作包含了大量的操作語句,那么這些語句都將被mysql引擎進行語法分析和編譯,所以執行過程的效率相對較低,而存儲過程是預編譯的,當客戶端第一次調用這個存儲過程的時候,mysql引擎將對他進行語法分析和編譯操作,然后把這個編譯的結果存儲到內存當中,所以說第一次是和之前的效率是相同的,但是以后客戶端再次調用這個存儲過程的時候,便直接在內存當中來執行,所以說相比效率比較高,速度比較快。

  第三,減少網絡流量

如果我們通過客戶端單獨發送sql語句讓服務器來執行的話,那么通過http協議提交的數據量相對較大,而使用存儲過程,我們只需要傳遞存儲過程的名字,后面加上我們要操作的那個值就行了,所以說,他提交給服務器的數據量相對較少,那么也就減少了網絡流量。

 

 

 

三、如何創建存儲過程

1、創建存儲過程的語法結構

CREATE

[DEFINER={user | CURRENT_USER}]

PROCEDURE sp_name ([proc_parameter[,...]])

[characteristic ...] routine_body

proc_parameter:

[IN | OUT | INOUT] param_name type

  我們發現他和創建自定義函數的語法結構很相似,最大的不同就是參數部分,DEFINER是創建者,如果省略掉DEFINER這句,,默認就是當前用戶,即當前登錄到mysql客戶端的用戶,sp_name指的是存儲過程的名字,這里面它可以有0或多個參數,但是從參數的寫法我們可以發現,他前面可以帶有3個選項,分別IN、OUT、INOUT,他們分別代表什么意思呢?

  IN :表示該參數的值必須在調用存儲過程時指定

在存儲過程中這個值是不能返回的,就是說只能進,不能出。

  OUT :表示該參數的值可以被存儲過程改變,並且可以返回

out指的是輸出。

  INOUT :表示該參數在調用時指定,並且可以被改變和返回

就是說可以被存儲過程的過程體改變並返回給調用者。

 

 

 

2、過程體

  (1)過程體由合法的SQL語句構成

  (2)過程體可以是“任意”的SQL語句

當然這個任意是加引號的,我們不可能通過存儲過程來創建數據表,也不可能通過存儲過程來創建數據庫,那么這個所謂的任意主要指的是對記錄的增刪改查以及多表連接這幾個操作。

  (3)過程體如果為復合結構則使用BEGIN...END語句

也就是說當超過1個語句時,我們就要用BEGIN..END將這些語句包含在其中。

  (4)復合結構可以包含聲明、循環、控制結構

比如if語句、when語句,while循環等等。

 

 

3、下面我們就來創建一個簡單的沒有參數的存儲過程,假設我們叫它sp1,它可以獲取當前mysql版本的這個功能。我們輸入CREATE PROCEDURE sp1( ) SELECT VERSION( );

  OK,命令執行成功,這個存儲過程我們就創建成功。

  那么既然我們的存儲過程創建成功了,那么我們現在就可以來調用我們的存儲過程,那么怎么調用呢?

 

 

 

四、如何調用存儲過程?

存儲過程的調用一共有兩種結構

CALL sp_name([parameter[,...]])

CALL sp_name[( )]

  我們發現他們都是通過關鍵字CALL來實現,我們發現后邊可以帶有參數,也可以不帶有參數。這里大家可以看一下,當沒有參數的時候,我們存儲過程名稱的后面可以不帶有小括號,如果帶有參數,我們在調用時就必須加上這個小括號。 下面我們就來調用一下剛才那個沒有參數的存儲過程,我們輸入

CALL sp1;

  OK,我們就可以得到我們當期mysql的版本信息。當然我們也可以加上小括號,我們輸入CALL sp1( );

  OK,同樣可以得到mysql的版本信息,這是我們定義的沒有參數的存儲過程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM