成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL存儲過程詳解

存儲 存儲軟件
經常有小伙伴問我這個存儲過程該如何寫?作為過來人我剛開始也有這樣的苦惱,今天就給大家說說這個存儲過程該如何創建和使用。

[[354197]]

 本文轉載自微信公眾號「SQL數據庫開發」,作者丶平凡世界。轉載本文請聯系SQL數據庫開發公眾號。  

經常有小伙伴問我這個存儲過程該如何寫?作為過來人我剛開始也有這樣的苦惱,今天就給大家說說這個存儲過程該如何創建和使用。

什么是存儲過程

存儲過程是一組可編程的函數,是為了完成特定功能的SQL語句集,經編譯創建并保存在數據庫中,用戶可通過指定存儲過程的名字并給定參數(需要時)來調用執行。

關鍵詞:可編程,特定功能,調用

創建存儲過程

我們以表customers為例,通過傳遞客戶ID的值來查詢客戶的具體信息:

表customers

 

示例:

  1. CREATE PROCEDURE sp_customers(IN cusid INT
  2. BEGIN  
  3.   SELECT * FROM customers WHERE `客戶ID`=cusid; 
  4. END

上面這是一個比較簡單的存儲過程,主要的功能就是用來查詢客戶信息。這里我們先簡單解釋一下:CREATE PROCEDURE:這是創建存儲過程的關鍵字,屬固定語法。sp_customers:這是存儲過程名稱,當我們執行了該存儲過程后,系統就會出現一個該名稱的存儲過程,可以自定義。IN:這是輸入參數的意思,當然也有輸出參數關鍵字OUT,同時也可以不定義參數,直接讓參數為空。cusid INT:這是定義參數名和類型,這里我們定義了一個名為cusid,類型為INT的參數名。BEGIN ... END :這是存儲過程過程體的固定語法,你需要執行的SQL功能就寫在這中間。

調用存儲過程

上面我們創建好了存儲過程以后,就可以調用了。調用存儲過程的語法很簡單:

  1. CALL  sp_name([參數]) 

下面我們來調用上面的存儲過程sp_customers

  1. CALL sp_customers(1); 

解釋:

上面的代碼的意思就是將客戶ID為1的數據,傳遞給存儲過程sp_customers,通過CALL來調用該存儲過程來執行。

結果為

 

細心的小伙伴可能已經發現了,這不就是一個簡單的WHERE查詢語句嗎?是的,剛開始使用存儲過程時,其實不必把它神秘化,你越覺得它神秘越會覺得難以熟練使用。復雜的東西先簡單化,方可更進一步掌握。

過程體

  • 過程體即我們在調用時必須執行的SQL語句,上面的SELECT查詢即為一個簡單的過程體。
  • 過程體包含DML、DDL語句,if-then-else和while-do語句、聲明變量的declare語句等
  • 過程體的格式上面也已經演示過,以BEGIN開始,以END結尾(可以嵌套)。

例如:

  1. BEGIN 
  2.   BEGIN 
  3.     BEGIN 
  4.       -- SQL代碼; 
  5.     END 
  6.   END 
  7. END 

注意:每個嵌套塊及其中的每條SQL語句,必須以分號(;)結束。表示過程體結束的BEGIN-END塊(又叫做復合語句compound statement),即END后面,則不需要分號。

標簽

標簽通常是與BEGIN-END一起使用,用來增強代碼的可讀性。語法為:

  1. [label_name:] BEGIN 
  2.     [statement_list]  
  3. END [label_name] 

例如:

  1. label1: BEGIN 
  2.   label2: BEGIN 
  3.     label3: BEGIN 
  4.       --SQL代碼;  
  5.     END label3 ; 
  6.   END label2; 
  7. END label1 

該功能不常用,了解即可。

存儲過程的參數

上面我們大致的說了一下存儲過程參數定義,下面我們再詳細給大家講述參數該如何使用。參數類型

  • IN輸入參數:表示調用者向過程傳入值(傳入值可以是字面量或變量)
  • OUT輸出參數:表示過程向調用者傳出值(可以返回多個值)(傳出值只能是變量)
  • INOUT輸入輸出參數:既表示調用者向過程傳入值,又表示過程向調用者傳出值(值只能是變量)

IN輸入參數

上面的示例就是一個輸入參數的示例,這里不贅述。

OUT輸出參數

  1. CREATE PROCEDURE sp_customers_out(OUT cusname VARCHAR(20)) 
  2. BEGIN 
  3.   SELECT cusname; 
  4.   SELECT `姓名` INTO cusname FROM customers WHERE `客戶ID`=1; 
  5.   SELECT cusname; 
  6. END 

調用上面的存儲過程:

  1. CALL sp_customers_out(@cusname); 

結果為:

結果1


 

結果2

上面我們定義了一個輸出參數為cusname的參數(這里參數類型如果有長度必須給定長度)。

 

然后在過程體里面,我們輸出了兩次參數的結果,結果1為NULL,是因為我們的輸出參數cusname還沒有接收任何值,所以為NULL;結果2里面有了客戶姓名,是因為我們將客戶ID為1的客戶姓名傳遞給了輸出參數cusname。

INOUT輸入輸出參數

這個不常見,但是也有使用,即同一個參數既為輸入參數,也為輸出參數,我們把上面的存儲過程稍微修改一下就可以看出區別了。

  1. CREATE PROCEDURE sp_customers_inout(INOUT cusname VARCHAR(20)) 
  2. BEGIN 
  3.   SELECT cusname; 
  4.   SELECT `姓名` INTO cusname FROM customers WHERE `客戶ID`=2; 
  5.   SELECT cusname; 
  6. END 

調用上述存儲過程之前我們先給定一個輸入參數:張三

  1. SET @cusname='張三'
  2. CALL sp_customers_inout(@cusname); 

結果為:


 

結果1

結果2

 

上面我們定義了一個輸入輸出參數為cusname的參數。然后在過程體里面,我們輸出了兩次參數的結果:第一次我們將先定義好的“張三”(SET @cusname='張三')傳遞給參數cusname,此時它為輸入參數。進入過程體后首先輸出結果1為“張三”,此時參數cusname為輸出參數;然后通過查詢將客戶ID為2的客戶姓名再次傳遞給cusname,來改變它的值,此時它同樣為輸出參數,只是輸出結果發生了改變。

以上就是三個參數的用法,建議:

 

  • 需要輸入值時使用IN參數;
  • 需要返回值時使用OUT參數;
  • INOUT參數盡量少用。

 

 

責任編輯:武曉燕 來源: SQL數據庫開發
相關推薦

2021-10-15 06:43:11

數據庫存儲過程

2009-09-09 10:54:52

Linq存儲過程返回

2009-07-08 17:17:16

JDBC調用存儲過程

2018-09-28 14:28:28

MySQL存儲過程

2010-10-09 17:08:15

MySQL存儲過程

2020-11-02 13:24:49

MySQL數據庫存儲

2012-05-10 11:17:23

JavaSQL Server

2009-07-21 17:06:35

iBATIS.NET執

2010-06-01 15:09:55

MySQL 存儲過程

2019-01-02 13:03:53

MySQL存儲權限

2010-05-19 14:03:41

MySQL 存儲過程

2010-10-08 16:55:44

MySql存儲過程

2023-02-28 11:29:09

存儲函數MySQL

2018-04-18 09:18:44

數據庫MySQL存儲過程

2010-10-12 10:48:02

mysql存儲過程

2010-10-09 16:26:59

mysql存儲過程

2011-09-01 15:24:22

SQL Server 存儲過程調試

2009-07-21 14:57:41

iBatis中調用存儲iBatis

2012-03-08 10:18:33

JavaOracle

2016-08-31 14:01:31

MySQL存儲數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜成人免费视频 | 丝袜天堂 | 国产精品久久国产精品 | 国产亚洲精品精品国产亚洲综合 | 日韩在线免费视频 | 狠狠操狠狠干 | 色呦呦在线| 国产精品视频在线播放 | 国产九九精品视频 | a级黄色片视频 | 久久成人综合 | 久久久91精品国产一区二区三区 | 欧美成人视屏 | 欧美国产日韩一区 | 国产精品日韩欧美一区二区三区 | 91精品国产综合久久精品 | 国产精品毛片一区二区三区 | 国产在线精品一区二区三区 | 91色综合| 亚洲电影中文字幕 | 国产极品粉嫩美女呻吟在线看人 | 久久久久久毛片免费观看 | 久久看片| 国产成年人视频 | 久久aⅴ乱码一区二区三区 亚洲欧美综合精品另类天天更新 | 久久久久久国产精品免费免费男同 | 欧美成人手机在线 | 人人色视频 | 精品免费国产一区二区三区四区介绍 | 欧美性久久 | 欧美不卡一区二区三区 | 欧美伦理一区 | 天堂在线中文字幕 | 精品视频久久久久久 | 日韩av一区二区在线 | 免费黄色片在线观看 | 国产一区二区三区日韩 | 国产自产21区| 久久精品亚洲 | 国产精品亚洲综合 | 亚洲日日 |