MySQL存儲過程詳解

2020-11-26 尚學堂java學院

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

什麼是存儲過程

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

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

創建存儲過程

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

表customers

示例:

CREATE PROCEDURE sp_customers(IN cusid INT) BEGIN    SELECT * FROM customers WHERE `客戶ID`=cusid; END; 

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

調用存儲過程

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

CALL  sp_name([參數]) 

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

CALL sp_customers(1); 

解釋:

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

結果為

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

過程體

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

例如:

BEGIN   BEGIN     BEGIN       -- SQL代碼;     END   END END 

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

標籤

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

[label_name:] BEGIN     [statement_list]  END [label_name] 

例如:

label1: BEGIN   label2: BEGIN     label3: BEGIN       --SQL代碼;      END label3 ;   END label2; END label1 

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

存儲過程的參數

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

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

IN輸入參數

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

OUT輸出參數

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

調用上面的存儲過程:

CALL sp_customers_out(@cusname); 

結果為:

結果1


結果2

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

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

INOUT輸入輸出參數

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

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

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

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

結果為:


結果1

結果2

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

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

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

本文轉載自微信公眾號「SQL資料庫開發」,作者平凡世界。

相關焦點

  • 淺析mysql存儲過程
    很多同學自然就想到了set+prepare的預處理語句,但是這裡規定了不能夠同時輸入set和prepaere,又被堵死了,但是mysql還有一個可以讓語句分開執行且達到等同於一起執行的效果,這裡介紹一下正解,mysql的存儲過程。
  • MySql基礎,MySql視圖&索引&存儲過程&觸發器
    MySQL索引類型詳解索引的類型和存儲引擎有關,每種存儲引擎所支持的索引類型不一定完全相同。MySQL 索引可以從存儲方式、邏輯角度和實際使用的角度來進行分類。存儲過程是一組為了完成特定功能的 SQL 語句集合。使用存儲過程的目的是將常用或複雜的工作預先用 SQL 語句寫好並用一個指定名稱存儲起來,這個過程經編譯和優化後存儲在資料庫伺服器中,因此稱為存儲過程。當以後需要資料庫提供與已定義好的存儲過程的功能相同的服務時,只需調用「CALL存儲過程名字」即可自動完成。
  • MySQL創建存儲過程
    存儲過程是資料庫管理中常用的技術之一,可以很方便的做些類似數據統計、數據分析等工作,市場上的SQL SERVER、ORACLE、MySQL都支持存儲過程,但不同的資料庫環境語法結構有點區別,本案例給大家講解下MySQL創建存儲過程的方法使用常規的創建存儲過程方法,發現各種報錯,無法執行
  • mysql存儲過程詳解,跟老韓一起學習吧
    那就跟著老韓學習mysql存儲過程把,學完了之後這個問題迎刃而解,Let's go。一、概念;存儲過程(Stored Procedure)是在大型資料庫系統中,一組為了完成特定功能的SQL 語句集,它存儲在資料庫中,一次編譯後永久有效,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。存儲過程是資料庫中的一個重要對象。
  • MySQL存儲過程使用解析
    mysql存儲過程存儲過程(Stored Procedure)是一種在資料庫中存儲複雜程序,以便外部程序調用的一種資料庫對象。目的是為了完成特定功能的SQL語句集,經編譯創建並保存在資料庫中,用戶可通過指定存儲過程的名字並給定參數(需要時)來調用執行。說白了就是資料庫 SQL語言層面的代碼封裝與重用。創建的存儲過程通常保存在資料庫的數據字典中。
  • 關於mysql存儲過程和事務的概述
    存儲過程是sql語句和流程控制語句的預編譯集合,以一個名稱存儲並作為一個單元進行處理。基本語法:過程體:示例:存儲過程的參數:1.創建無參的存儲過程:2.創建帶有輸入參數和輸出參數的存儲過程:創建複合結構的存儲過程:1.使用條件判斷語句的存儲過程:2.使用循環語句的存儲過程
  • MySQL存儲過程批量插入百萬條數據
    最近在做一個項目,需要批量插入一批數據(ps:隨機的),試想了一下,就想用mysql的存儲過程試下,因為是在個人本機測試的,可能插入的過百秒現在說下批量創建100萬條數據第一步:創建存儲過程:delimiter $$create procedure
  • MySQL創建存儲過程-百家號 - 百度經驗
    存儲過程是資料庫管理中常用的技術之一,可以很方便的做些類似數據統計、數據分析等工作,市場上的SQL SERVER、ORACLE、MySQL都支持存儲過程,但不同的資料庫環境語法結構有點區別,本案例給大家講解下MySQL創建存儲過程的方法使用常規的創建存儲過程方法,發現各種報錯,無法執行
  • MySQL 高級 - 存儲過程和函數(上)
    1.1 存儲過程和函數概述存儲過程和函數是 事先經過編譯並存儲在資料庫中的一段 SQL 語句的集合,調用存儲過程和函數可以簡化應用開發人員的很多工作,減少數據在資料庫和應用伺服器之間的傳輸,對於提高數據處理的效率是有好處的。存儲過程和函數的區別在於函數必須有返回值,而存儲過程沒有。
  • 一鍵導出mysql視圖、函數、存儲過程、事件、觸發器的定義腳本
    所以就順便整了一鍵導出視圖、函數、存儲過程、事件、觸發器的定義腳本,下面一起來看看吧~一鍵導出腳本腳本明細如下: .function,procedure,event,trigger&34;$db_name&34;+%Y-%m-%d %H:%M:%S&34;&34;& 視圖if [[ $output_type == *&34;* ]]then echo &34; >> $save_file echo &34; >> $save_file echo &34; >> $save_file mysql
  • mysql的存儲過程的概念及創建語法詳解
    存儲過程存儲過程是一組為了完成特定功能的 SQL 語句集合使用存儲過程的目的是將常用或複雜 的工作,預先用 SQL語句寫好並用一個指定名稱存儲起來,這個過程經編譯和優化後存儲 在資料庫伺服器中,因此稱為存儲過程。以後需要資料庫提供與已定義好的存儲過程的功 能相同的服務時,只需用 CALL 語句來調用存儲過程名字,即可自動完成命令。
  • MySQL5.7升級到8.0過程詳解
    本篇文章主要介紹從5.7升級到8.0版本的過程及注意事項,有想做版本升級的小夥伴可以參考下。1.升級前準備及注意事項首先,我們要大概了解下MySQL5.7和8.0有哪些不同,參考官方文檔和其他網友文章,概括總結出MySQL8.0以下幾點新特性:默認字符集由latin1變為utf8mb4。
  • MySQL底層存儲結構
    2814:32 ibtmp1root@test:/var/lib/mysql#General Tablespace:一般表空間,就是平時我們用於存儲自己業務表中的數據用的表空間文件。如下圖所示,他們在物理上不一定是有序的,可能剛開始是有序的,但是隨著增刪改的操作可能就無序了,但是在邏輯上是有序的:一個page頁中的多行記錄,再結合多個page頁,就形成如下的存儲結構:頁與頁直接是雙向鍊表,頁內的行記錄直接是單向鍊表。如下所示:page頁中的每一個箭頭可以理解為一行數據。基於上面的圖,當我們要查詢某一行記錄的時候,是通過下面的過程來查找的。
  • MySQL主從延時這麼長,要怎麼優化?
    MySQL的常用存儲引擎及他們之間的區別?MySQL索引的實現機制是什麼,為什麼要使用B+樹?MySQL中的事務實現原理?MySQL有哪些常用的優化策略?兩天你將學到詳解mysql架構體系(連機器,分析器,優化器,執行器)詳解mysql的存儲引擎(mysql的數據組織形式)詳解mysql的日誌系統(binlog,redolog,undolog
  • MySQL當中的「My」是什麼意思?
    MySQL的常用存儲引擎及他們之間的區別?MySQL索引的實現機制是什麼,為什麼要使用B+樹?MySQL中的事務實現原理?MySQL有哪些常用的優化策略?這幾道題目你會幾道呢?長按掃碼即可添加微信僅限前200名遇到掃碼頻繁,請再次識別哦(內容的價值取決於您的行動,千萬莫做收藏家)兩天你將學到詳解
  • 花費三個月整理的MySQL系列文檔 誠意之作 看完不虧
    環境:mysql5.7.25,cmd命令中進行演示。在玩mysql的過程中,經常遇到有很多朋友在雲上面玩mysql的時候,說我創建了一個用戶為什麼不能 登錄?為什麼沒有權限?等等各種問題,本文看完之後,這些都不是問題了。本文主要內容1. 介紹Mysql權限工作原理2.
  • MySQL8.0.12的安裝教程詳解(windows 64位)
    這篇文章主要介紹了MySQL 8.0.12的安裝教程,非常不錯,具有一定的參考借鑑價值,需要的朋友可以參考下:MySQL 8.0.12的安裝步驟:1、到MySQL官網下載安裝包:https://dev.mysql.com/downloads/mysql/2、將下載好的安裝包mysql-8.0.12-winx64 .zip解壓到相應路徑下
  • 終於有人把MySQL微服務JvmNetty多線程給講明白了
    MySQL學習路線詳解mysql架構體系(連機器,分析器,優化器,執行器)詳解mysql的存儲引擎( mysql的數據組織形式)詳解mysql的日誌系統( binlog,redolog,undolog)詳解mysql索引系統的架構設計詳解mysql索引系統的數據結構選擇詳解mysql索引B+樹的層數詳解索引的欄位選擇
  • MySQL基於MHA的FailOver過程
    本文介紹MySQL基於MHA的FailOver過程。MHA FailOver過程詳解什麼是FailOver故障轉移主庫宕機,一直到業務恢復正常的處理過程如何處理FailOver1.快速監控到主庫宕機2.選擇新主節點,選擇策略mysqladmin ping檢查資料庫狀態,主機狀態,埠等,判斷從庫節點讀取的master_log_file
  • 阿里Mysql三位封神專家總結800頁性能優化的千金良方
    「基礎篇」從理論基礎和基本原理層面介紹了MySQL的安裝與配置、升級和體系結構,information_schema、sys_schema、performance_schema和mysql_schema,MySQL複製,MySQL事務,SQL語句優化及架構設計基礎知識。