MySQL:存儲函數和存儲過程

系列文章目錄

1.MySQL編程基礎

2.程序控制流語句

3.存儲過程

4.游標

5.嵌入式SQL


文章目錄

  • 系列文章目錄
  • 前言
  • 一、程序控制流語句:
  • 二、存儲函數:
    • 1.存儲函數的特點:
    • 2.存儲函數的定義:
    • 3.調用存儲函數
  • 三、存儲過程:
    • 1.存儲過程的特點:
    • 2.存儲過程的定義:
    • 3. 調用存儲過程:
  • 四、兩者區別:
  • 總結


前言

? ? ? 前面我們簡單學習了一些SQL的基本語句,增刪改查等一些常用的知識,現在我們要稍微學習一點數據庫編程的內容,在一些復雜的程序中我們就需要一些語句來增強這個程序的可讀性和邏輯性,下面我們先講講存儲函數和存儲過程:


一、程序控制流語句:

? ? 與所有的程序設計語言一樣,MySQL提供了用于編寫過程化代碼的語法結構,可進行順序,分支,循環,存儲過程,存儲函數,觸發器等程序設計,編寫結構化的模塊代碼,并放置到數據庫服務器上。

? ?語句塊,注釋和重置命令結束標記:

? ? ? ? 1.語句塊:

?BEGIN···END用于定義SQL語句塊,其語法格式如下:

? ? ? ?

BEGINSQL語句|SQL語句塊
END

? ? ? ? 說明:

? ?(1)BEGIN····END語句塊包含了該程序塊的所有處理操作,允許語句塊嵌套。

? ?(2)在MySQL中單獨使用BEGIN···END語句塊沒有任何意義,只有將其封裝到存儲過程,存儲函數,觸發器等存儲程序內部才有意義。

? ? ? ?2.注釋

? ? ?在源代碼中加入注釋便于用戶對程序的更好理解,有兩種聲明注釋的方式,即單行注釋和多行注釋。

? ?(1)單行注釋:

使用##符號作為單行語句的注釋符,寫在需要注釋的行或語句的后面。

? ?(2)多行注釋:

使用/*和*/括起來可以連續書寫多行注釋語句。

? ? ? ?3.重置命令結束標記

?在MySQL中,服務器處理的語句式以分號為結束標記的。但在創建存儲函數,存儲過程時,在函數體或存儲過程體中可以包含多個SQL語句,每個SQL語句都是以分號結尾,而服務器處理程序時遇到第一個分號則結束程序的執行,這時就需要使用DELIMITER語句將MySQL語句的結束標記修改為其他符號。

? 語句格式:

?

DELIMITER 符號

?示例:

DELIMITER @@
SELECT *FROM emp@@DELIMITER ;
SELECT * FROM emp;

? ? ?恢復使用分號作為結束標記,執行“DELIMITER;”即可。

二、存儲函數:

? ? ? ?用戶在編寫程序的過程中,不僅可以調用系統函數,也可以根據應用程序的需要創建存儲函數。

? ? ? ?存儲函數是類似于存儲過程的一種程序單元,但它的返回值必須是一個單一的值,通常用于計算和返回某些值。存儲函數可以用在 SQL 語句中,作為一個表達式。

存儲函數的特點:
  • 必須返回一個值:存儲函數必須有一個?RETURN?語句來返回一個值。
  • 可以作為表達式使用:存儲函數可以嵌入到 SQL 語句中,例如在?SELECT?語句中作為計算的一部分。
  • 不能執行多個 SQL 語句:與存儲過程不同,存儲函數通常只能執行單一的操作,并返回一個結果,不能像存儲過程一樣返回多個結果集。

?

存儲函數的定義:

創建存儲函數使用 CREATE FUNCTION 語句,語法如下:

DELIMITER $$CREATE FUNCTION function_name (param1 datatype, param2 datatype)
RETURNS return_datatype
DETERMINISTIC
BEGIN-- 計算過程RETURN result;
END $$DELIMITER ;
  • return_datatype?是函數的返回類型。
  • DETERMINISTIC?表示該函數對于相同的輸入參數返回相同的結果。如果函數結果依賴于外部因素(如隨機數、時間等),則應使用?NOT DETERMINISTIC
  • RETURN result?用于返回結果。
調用存儲函數:

存儲函數的調用方式可以像普通的表達式一樣使用,通常是查詢中的一部分。例如:

SELECT function_name(param1_value, param2_value);

示例:

DELIMITER $$CREATE FUNCTION CalculateTax(price DECIMAL(10,2)) 
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGINDECLARE tax DECIMAL(10,2);SET tax = price * 0.1;RETURN tax;
END $$DELIMITER ;

刪除存儲函數:

DROP FUNCTION NAME_FN;

函數名后面不要加括號

三、存儲過程:

??

存儲過程是由一組 SQL 語句組成的預編譯程序,可以根據需要在數據庫中被多次執行。存儲過程可以接受參數,也可以返回多個結果集。通常用于執行復雜的業務邏輯,封裝一組 SQL 操作或事務。

存儲過程的特點:
  • 沒有返回值:存儲過程不能返回值,但可以使用?OUT?參數來返回值。
  • 支持多個結果集:存儲過程可以返回多個查詢結果集,可以通過?SELECT?語句來返回數據。
  • 執行方式:存儲過程在數據庫中創建后,可以通過?CALL?語句執行。
  • 封裝復雜邏輯:存儲過程非常適合封裝一些復雜的查詢或事務操作。

? ??

存儲過程的定義:

創建存儲過程使用 CREATE PROCEDURE 語句,語法如下:

??

DELIMITER $$CREATE PROCEDURE procedure_name (param1 datatype, param2 datatype)
BEGIN-- SQL語句SELECT * FROM table_name;
END $$DELIMITER ;
  • DELIMITER $$?是用來修改命令結束符的,通常 MySQL 的默認命令結束符是?;,但是存儲過程體內部也會使用?;?來分隔 SQL 語句,因此需要使用?DELIMITER?來改變結束符。
  • procedure_name?是存儲過程的名字。
  • param1param2?等是存儲過程的輸入參數,可以指定類型,如?INTVARCHAR?等。

? ? ?

調用存儲過程:

創建好存儲過程后,可以使用 CALL 來調用存儲過程:

CALL procedure_name(param1_value, param2_value);

示例:

DELIMITER $$CREATE PROCEDURE GetEmployeeInfo(IN emp_id INT)
BEGINSELECT name, position FROM employees WHERE id = emp_id;
END $$DELIMITER ;

調用:

CALL GetEmployeeInfo(101);

四、兩者區別:

存儲過程與存儲函數的主要區別

特性存儲過程(Stored Procedure)存儲函數(Stored Function)
返回值沒有返回值,通常通過?OUT?參數返回結果。必須有返回值,使用?RETURN?語句返回一個值。
執行的操作可以執行?SELECTINSERTUPDATEDELETE?等操作。只能執行?SELECT?查詢,不能修改數據。
調用方式使用?CALL?語句調用存儲過程。直接在 SQL 語句中調用,如?SELECT function_name();
使用場景用于需要執行一系列操作的場景,例如批量插入、更新等。用于需要返回單個計算值的場景,例如計算某個值的統計信息。
是否可以嵌套使用可以調用存儲過程、存儲函數或其他 SQL 語句。可以在 SQL 查詢中嵌套調用,但不能直接修改數據。

總結

以上就是我們今天要講的內容,我簡單講了存儲函數和存儲過程以及他們的區別,下面我會持續更新數據庫的內容的,希望大家多多關注。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77036.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77036.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77036.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基礎貪心算法集合2(10題)

目錄 1.單調遞增的數字 2.壞了的計算器 3.合并區間 4.無重疊區間 5. 用最少數量的箭引爆氣球 6.整數替換 解法1:模擬記憶化搜索 解法2位運算貪心 7.俄羅斯套娃信封問題 補充.堆箱子 8.可被3整除的最大和 9.距離相等的條形碼 10.重構字符串 1.單調遞增的數字…

RaabitMQ 快速入門

🎉歡迎大家觀看AUGENSTERN_dc的文章(o゜▽゜)o☆?? 🎉感謝各位讀者在百忙之中抽出時間來垂閱我的文章,我會盡我所能向的大家分享我的知識和經驗📖 🎉希望我們在一篇篇的文章中能夠共同進步!!&…

語音識別——根據聲波能量、VAD 和 頻譜分析實時輸出文字

SenseVoiceSmall網絡結構圖 ASR(語音識別)是將音頻信息轉化為文字的技術。在實時語音識別中,一個關鍵問題是:如何決定將采集的音頻數據輸入大模型的最佳時機?固定時間間隔顯然不夠靈活,太短可能導致頻繁調用模型,太長則會延遲文字輸出。有沒有更智能的方式?答案是肯定…

AI大模型如何重塑科研范式:從“假說驅動”到“數據涌現”

??個人主頁??:慌ZHANG-CSDN博客 ????期待您的關注 ???? 一、引言:科研進入“模型共研”時代 傳統科研范式通常以“假設→實驗→驗證→理論”的方式推進,這一經典路徑建立在人類的認知能力與邏輯推理基礎上。然而,隨著數據規模的爆炸式增長與知識系統的高度復雜…

使用Python寫入JSON、XML和YAML數據到Excel文件

在當今數據驅動的技術生態中,JSON、XML和YAML作為主流結構化數據格式,因其層次化表達能力和跨平臺兼容性,已成為系統間數據交換的通用載體。然而,當需要將這類半結構化數據轉化為具備直觀可視化、動態計算和協作共享特性的載體時&…

面試題:Eureka和Nocas的區別

Eureka 與 Nacos 核心區別對比 一、功能定位與核心能力 ?維度??Eureka??Nacos??核心功能?專注服務注冊與發現,無配置管理功能?:ml-citation{ref“1,3” data“citationList”}集成服務注冊、發現、配置管理、動態DNS等?:ml-citation{ref“1,3” data“c…

2025年4月15日 百度一面 面經

目錄 1. 代理相關 從靜態代理到動態代理 2. cglib可以代理被final修飾的類嗎,為什么 3. JVM 體系結構 4. 垃圾回收算法 5. 什么是注解 如何使用 底層原理 6. synchronized和reentrantlock 7. 講一下你項目中 redis的分布式鎖 與java自帶的鎖有啥區別 8. post 請求和 ge…

AI改變生活

AI改變生活 人工智能(AI)在我們生活中的應用越來越廣泛,深刻地改變了我們的工作和生活方式。以下是一些AI實際應用的實例,以及它們如何影響我們的日常生活。 1. 智能助手 智能助手如Siri、Alexa和Google Assistant等&#xff0…

信奧賽之c++基礎(取模運算與數位分離)

?? 數字拆解大冒險——取模運算與數位分離魔法課 ?? 第一章:糖果分裝術——取模運算 ?? 分糖果游戲 7顆糖每人分3顆: 每人得到:7 / 3 = 2顆剩余糖果:7 % 3 = 1顆(%就是取模符號) 就像把糖果裝袋后剩下的零散糖粒!?? 取模運算說明書 算式比喻結果10 % 310顆糖分…

揭秘大數據 | 21、軟件定義計算

老夫先將這個小系列的前兩篇內容鏈接奉上,方便感興趣的朋友一氣讀之。 揭秘大數據 | 19、軟件定義的世界-CSDN博客 揭秘大數據 | 20、軟件定義數據中心-CSDN博客 今天,書接上文,開聊軟件定義計算的那些事兒! 虛擬化是軟件定義…

FPGA-DDS技術的波形發生器

1.實驗目的 1.1掌握直接數字頻率合成(DDS)的基本原理及其實現方法。 1.2在DE2-115 FPGA開發板上設計一個可調頻率的正弦波和方波發生器,頻率范圍10Hz~5MHz,最小分辨率小于1kHz。 1.3使用Quartus II進行仿真,并通過S…

LeetCode[541]反轉字符串Ⅱ

思路: 題目給我們加了幾個規則,剩余長度小于2k,大于等于k就反轉k個,小于k就全部反轉,我們按照這個邏輯來就行。 第一就是大于等于k就反轉k個,我們for循環肯定是i2k了,接下來就是判斷是否大于等于…

實現定長的內存池

池化技術 所謂的池化技術,就是程序預先向系統申請過量的資源,然后自己管理起來,以備不時之需。這個操作的價值就是,如果申請與釋放資源的開銷較大,提前申請資源并在使用后并不釋放而是重復利用,能夠提高程序…

路由器原理與配置技術詳解

一、路由基礎原理 1.1 路由器的核心功能 網絡層設備:工作在OSI參考模型第三層,實現不同網絡間的互聯互通智能路徑選擇:基于路由表為數據包選擇最優傳輸路徑協議轉換:處理不同網絡接口間的協議差異(如以太網與PPP&…

Leetcode 3518. Smallest Palindromic Rearrangement II

Leetcode 3518. Smallest Palindromic Rearrangement II 1. 解題思路2. 代碼實現 題目鏈接:Leetcode 3518. Smallest Palindromic Rearrangement II 1. 解題思路 這一題是題目Leetcode 3517. Smallest Palindromic Rearrangement I的升級版本,其主要的…

大模型——Crawl4AI 中的數據提取策略

大模型——Crawl4AI 中的數據提取策略 在本章中,將詳細介紹在 Crawl4AI 中可用的數據提取策略。這些策略包括: LLMExtractionStrategy:用于詳細內容提取。JsonCssExtractionStrategy:使用 CSS 選擇器進行結構化數據檢索。CosineStrategy:基于余弦相似性進行有效的語義分段…

職坐標解碼互聯網行業轉型發展新動能

當前,互聯網行業正以前所未有的速度重塑全球產業格局。工信部最新數據顯示,我國互聯網企業營收連續三年保持雙位數增長,其中百強企業在人工智能、物聯網等領域的投入強度同比提升40%,展現出強勁的技術引領力。與此同時&#xff0c…

linux多線(進)程編程——(4)進程間的傳音術(命名管道)

前言(前情回顧) 進程君(父進程)在開發出匿名管道這門傳音術后,解決了和自己孩子(子進程)間的溝通問題,父子關系趨于融洽。和孩子溝通后,進程君發現,自己脫離…

在IDEA里面建立maven項目(便于java web使用)

具體步驟: 第一次有的電腦你再創建項目的時候右下角會提醒你彈窗:讓你下載沒有的東西 一定要下載!!可能會很慢 運行結果: 因為他是默認的8080端口所以在運行的時候輸入的url如下圖: 新建了一個controller代…

【13】數據結構之樹結構篇章

目錄標題 樹Tree樹的定義樹的基本概念樹的存儲結構雙親表示法孩子表示法孩子兄弟表示法 二叉樹二叉樹與度不超過2的普通樹的不同之處二叉樹的基本形態二叉樹的分類二叉樹的性質 二叉樹的順序存儲二叉樹的鏈式存儲二叉樹的鏈式存儲的結點結構樹的遍歷先序遍歷中序遍歷…