存儲過程探秘:數據庫編程的藝術

文章目錄

  • 存儲過程
    • 語法格式
    • BEGIN...END語句塊
    • DECLARE(聲明局部變量)
    • 流控制語句
    • if函數
    • 批處理操作
      • 測試2
      • 測試3
    • 存儲過程與函數的關系

存儲過程

MYSQL的存儲過程是一組預處理的SQL語句,可以像函數一樣在數據庫中進行存儲和調用。

它們允許在數據庫中定義一系列的操作,然后通過簡單的調用來執行這些操作。而不必每次重寫相同的SQL語句。

存儲過程通常用于實現復雜的業務邏輯,或執行繁雜的數據庫操作。

語法格式

BEGIN…END語句塊

存儲過程可以使用begin… end… 復合語句來包含多個語句,Statement_list 代表一個或者多個語句的列表,

Statement_list 之間每個語句都必須用分號(;)來結束

存儲過程的調用要Call procedure_name().

示例:

select * from user;-- 創建一個存儲過程
-- 將語句分隔符改為// 使用完后要再改回;
DELIMITER //
CREATE PROCEDURE GetUser(IN user_id INT)
BEGINselect * from user where id = user_id;
END	//-- 將語句分隔符再修改回;
DELIMITER;-- 刪除一個存儲過程
DROP PROCEDURE GetUser;-- 調用一個存儲過程
CALL GetUser(1);

DECLARE(聲明局部變量)

DECLARE var_name[,...] type [DEFAULT value]不再需要@符號
這個語句被用來聲明局部變量
要給變量提供一個默認值,要包含一個default 語句
值可以被指定為一個表達式,不需要為一個常數
如果沒有default子句,初始值為NULL
局部變量的作用范圍在他被聲明的begin ... end語句塊內。給局部變量更新值,可以使用SET。
-- 在存儲過程內部可以定義局部變量
DELIMITER //
CREATE PROCEDURE test1() -- procedure
BEGIN DECLARE x INT;	-- declare 聲明DECLARE y INT;set x = 1;set y = 2;SELECT x+y;
END	//DELIMITER ;DROP PROCEDURE test1;call test1();mysql> DELIMITER //
mysql> CREATE PROCEDURE test1() -- procedure-> BEGIN -> DECLARE x INT;-- declare 聲明-> DECLARE y INT;-> set x = 1;-> set y = 2;-> SELECT x+y;-> END//
Query OK, 0 rows affected (0.00 sec)mysql> DELIMITER ;
mysql> call test1();
+------+
| x+y  |
+------+
|    3 |
+------+
1 row in set (0.01 sec)Query OK, 0 rows affected (0.01 sec)

流控制語句

在MySQL中,流控制語句用于控制程序的執行流程,包括條件判斷、循環和跳轉。主要的流控制語句包括:

IF-THEN-ELSE語句:用于基于條件執行不同的代碼塊。

CASE語句:用于基于多個條件執行不同的代碼塊。

WHILE循環:當指定條件為真時,重復執行一組語句。

REPEAT循環:先執行一組語句,然后重復執行,直到指定條件為真。

LOOP循環:無限循環,直到遇到LEAVE語句跳出。

LEAVE語句:用于從循環中跳出。

if函數

IF函數是一個MySQL內置函數,它在條件為真時返回一個值,否則返回另一個值。其基本語法如下:

在這里插入圖片描述

-- 測試if函數
SELECT if(1 < 5, 'ABC', 'abc');mysql> SELECT if(1 < 5, 'ABC', 'abc');
+-------------------------+
| if(1 < 5, 'ABC', 'abc') |
+-------------------------+
| ABC                     |
+-------------------------+
1 row in set (0.00 sec)-- 測試concat 字符串的拼接函數
SET @i:=10;
select concat(10, 'ABC', '4564');mysql> SET @i:=10;
Query OK, 0 rows affected (0.00 sec)mysql> select concat(10, 'ABC', '4564');
+---------------------------+
| concat(10, 'ABC', '4564') |
+---------------------------+
| 10ABC4564                 |
+---------------------------+
1 row in set (0.00 sec)

批處理操作

DELIMITER //
CREATE PROCEDURE BathInsert(IN num INT)
BEGINDECLARE x INT;set x = 0;while x < num doinsert into user(name, passward) values(concat('name', x), concat('passwd', x));set x = x+1;end while;
END //
DELIMITER ;CAll BathINsert(10);mysql> DELIMITER //
mysql> CREATE PROCEDURE BathInsert(IN num INT)-> BEGIN-> DECLARE x INT;-> set x = 0;-> while x < num do-> 
Display all 779 possibilities? (y or n) -> insert into user(name, passward) values(concat('name', x), concat('passwd', x));-> 
Display all 779 possibilities? (y or n) -> set x = x+1;-> end while;-> END //
Query OK, 0 rows affected (0.01 sec)mysql> DELIMITER ;
mysql> select * from user;
+----+------+----------+
| id | name | passward |
+----+------+----------+
|  1 | tom  | 12345    |
|  2 | bob  | 123456   |
|  3 | jack | 8888     |
+----+------+----------+
3 rows in set (0.00 sec)mysql> CAll BathINsert(10);
Query OK, 1 row affected (0.05 sec)mysql> select * from user;
+----+-------+----------+
| id | name  | passward |
+----+-------+----------+
|  1 | tom   | 12345    |
|  2 | bob   | 123456   |
|  3 | jack  | 8888     |
|  4 | name0 | passwd0  |
|  5 | name1 | passwd1  |
|  6 | name2 | passwd2  |
|  7 | name3 | passwd3  |
|  8 | name4 | passwd4  |
|  9 | name5 | passwd5  |
| 10 | name6 | passwd6  |
| 11 | name7 | passwd7  |
| 12 | name8 | passwd8  |
| 13 | name9 | passwd9  |
+----+-------+----------+
13 rows in set (0.00 sec)

測試2

? 設置用戶變量的rownum為0,從score表中,顯示 s_id,s_score,rownum(如果@c_id 等于 c_id, @row_num = @row_num+1,否則 等于 1,因為 c_id沒有定義數值,所以第一次不會相同會賦值為1)別名為 rrank ,@c_id = c_id 別名為 c_id

測試3

存儲過程與函數的關系

在這里插入圖片描述

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

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

相關文章

非阻塞寫入核心:asyncio.StreamWriter 的流量控制與數據推送之道

在 asyncio 的異步編程框架中&#xff0c;如果說 asyncio.StreamReader 是你異步應用的數據輸入管道&#xff0c;那么 asyncio.StreamWriter 就是你異步應用的數據輸出管道。它是一個至關重要的組件&#xff0c;讓你能夠方便、高效且非阻塞地向連接的另一端&#xff08;如 TCP …

控制臺打開mysql服務報錯解決辦法

控制臺打開mysql服務報錯解決辦法這個MySQL錯誤表示訪問被拒絕&#xff0c;通常是因為沒有提供正確的用戶名和密碼。以下是幾種解決方法&#xff1a; 方法1&#xff1a;指定用戶名和密碼連接 mysql -u root -p然后輸入root用戶的密碼。 方法2&#xff1a;如果忘記了root密碼&am…

Unsloth 實戰:DeepSeek-R1 模型高效微調指南(下篇)

食用指南 本系列因篇幅原因拆分為上下兩篇&#xff1a; 上篇以基礎環境搭建為主&#xff0c;介紹了 Unsloth 框架、基座模型下載、導入基座模型、數據集下載/加載/清洗、SwanLab 平臺賬號注冊。 下篇&#xff08;本文&#xff09;以實戰微調為主&#xff0c;介紹預訓練、全量…

Ubuntu安裝Jenkins

Ubuntu安裝Jenkins方法1&#xff1a;使用官方的Jenkins倉庫1. 添加Jenkins倉庫2. 更新軟件包列表3. 安裝Jenkins4. 啟動Jenkins服務5. 設置Jenkins開機啟動6. 查找初始管理員密碼7. 訪問Jenkins方法2&#xff1a;使用Snap包&#xff08;適用于較新的Ubuntu版本&#xff09;1. 安…

ubuntu22.04下配置qt5.15.17開發環境

自從qt5.15版本開始&#xff0c;不再提供免費的離線安裝包&#xff0c;只能通過源碼自行編譯。剛好最近需要在ubuntu22.04下配置qt開發環境&#xff0c;于是寫篇文章記錄配置的過程。 其實一開始是想配置qt5.15.2的&#xff0c;但是在編譯配置參數這一步驟中出現如下報錯 em…

S7-1200 與 S7-300 CPS7-400 CP UDP 通信 Step7 項目編程

S7-1200 CPU 與S7-300 CP STEP7 UDP通信S7-1200 與 S7-300 CP 之間的以太網通信可以通過 UDP 協議來實現&#xff0c;使用的通信指令是在S7-1200 CPU 側調用通信-開放式用戶通信TSEND_C&#xff0c;TRCV_C指令或TCON&#xff0c;TDISCON&#xff0c;TUSEND&#xff0c;TURCV 指…

基于YOLOv11的無人機目標檢測實戰(Windows環境)

1. 環境搭建 1.1 硬件與操作系統 操作系統&#xff1a;Windows 11 CPU&#xff1a;Intel i7-9700 GPU&#xff1a;NVIDIA RTX 2080&#xff08;8GB顯存&#xff09; 1.2 安裝CUDA和cuDNN 由于YOLOv11依賴PyTorch的GPU加速&#xff0c;需要安裝CUDA和cuDNN&#xff1a; 安…

Spring Cloud分布式配置中心:架構設計與技術實踐

從單體到微服務&#xff1a;Spring Cloud 開篇與微服務設計 Spring Cloud服務注冊與發現&#xff1a;架構設計與技術實踐深度分析 在以往分享中&#xff0c;碼友們已經掌握了微服務的設計和注冊中心的設計&#xff0c;部分聰明的碼友已經察覺了&#xff0c;已經到了需要設計一個…

15.2 Common Criteria合規

目錄1. Common Criteria簡介1.1 CC評估要素1.2 CC與TF-A的關系2. TF-A的CC合規要求2.1 安全功能需求2.2 開發過程要求3. TF-A的CC合規實現3.1 關鍵安全機制3.2 開發流程控制4. CC認證實踐指南4.1 認證準備步驟4.2 典型挑戰與解決方案4.3 已認證案例參考5. 持續合規建議1. Commo…

【前端:Typst】--let關鍵字的用法

在 Typst 中&#xff0c;#let 命令是用于定義變量和函數的核心指令&#xff0c;其用法非常靈活。以下是詳細的用法說明和示例。 目錄 1.基礎變量定義 2.函數定義 3.默認參數 4.內容塊參數&#xff08;Content Blocks&#xff09; 5.遞歸函數 1.基礎變量定義 // 定義簡單…

Qt輪廓分析設計+算法+避坑

輪廓分析擬合方面我現在只考慮矩形擬合和圓形擬合細分的話&#xff0c;橢圓擬合&#xff0c;矩形擬合&#xff0c;最小外接矩形&#xff0c;最小外接圓。對于一張圖像可能有不同的圖形&#xff0c;不同的圓&#xff0c;不同的矩形&#xff0c;我需要對其進行篩選&#xff0c;也…

C++中STL六大組件List的簡單介紹

一、前言C非常重視效率&#xff0c;對效率有損失的代碼常常是能省則省。使用list要包含的頭文件是<list>&#xff0c;要包含頭文件就是#iinclude <list>&#xff0c;List肯定是一種鏈表&#xff0c;我們不妨回憶一下那種鏈表插入刪除效率最快也就是最簡單&#xff…

第十五節:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入門 - vue前端 生產部署

Vben Admin vben5 系列文章目錄 ?? 基礎篇 ? 第一節:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入門 ? 第二節:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入門 - Python Flask 后端開發詳解(附源碼) ? 第三節:Vben Admin 最新 v5.0 (vben5) + Python …

背包初步(0-1背包、完全背包)

當月光灑在我的臉上 我想我就快變了模樣 有一種叫做撕心裂肺的湯 喝了它有神奇的力量 動態規劃初步&#xff08;完全背包&#xff09; 目錄動態規劃初步&#xff08;完全背包&#xff09;0-1背包簡介完全背包檢查數組是否存在有效劃分&#xff08;前綴劃分DP&#xff09;單詞拆…

Linux驅動06 --- UDP

目錄 一、UDP 1.1 介紹 1.2 UDP 的通信方式 1.3 單播 發送函數 接收函數 1.4 廣播 1.5 組播/多播 一、UDP 1.1 介紹 傳輸層的另外一個協議 面向無連接&#xff0c;不穩定&#xff0c;速度快&#xff0c;可以一對多 UDP&#xff08;User Datagram Protocol&…

AJAX 投票:技術解析與應用場景

AJAX 投票:技術解析與應用場景 引言 隨著互聯網技術的不斷發展,Web應用的用戶體驗越來越受到重視。AJAX(Asynchronous JavaScript and XML)作為一種重要的技術,在實現異步數據交互方面發揮著關鍵作用。本文將深入探討AJAX投票系統的技術原理、應用場景以及優化策略。 A…

【字節跳動】數據挖掘面試題0017:推薦算法:雙塔模型,怎么把內容精準地推送給用戶

文章大綱 雙塔模型:推薦算法中的“高效匹配引擎一、雙塔模型的核心思想:“分而治之” 的匹配邏輯二、雙塔模型的結構:從特征輸入到相似度輸出1. 輸入層:特征的 “原材料處理”2. 塔網絡層:用戶與物品的“個性化編碼”3. 交互層:向量相似度的“偏好打分”三、雙塔模型的優…

7月14日日記

數學類今天考完最后一科英語放假回家了。有點羨慕他們。今天英語成績出來了&#xff0c;我是89分&#xff0c;一開始有點失望&#xff0c;感覺沒有上90&#xff0c;這是一個很好的沖擊4.0 的機會。但是后來一想好像也沒什么可惜的&#xff0c;這個分數還是很高的。舍友小林是90…

js的局部變量和全局變量

全局變量常常定義在函數外&#xff0c;具有全局定義域&#xff0c;在整個js代碼的任何地方都可以使用&#xff0c;這個就叫全局變量局部變量定義在函數內部&#xff0c;只在當前函數的定義域可以被使用&#xff0c;而且不同的函數可以定義相同的局部變量&#xff0c;他們之間相…

C++ 多態詳解:從概念到實現原理----《Hello C++ Wrold!》(14)--(C/C++)

文章目錄前言多態的概念多態的定義和實現虛函數虛函數的重寫(覆蓋)多態的構成條件override 和 final&#xff08;C11提出&#xff09;finaloverride重載、覆蓋(重寫)、隱藏(重定義)的對比抽象類接口繼承和實現繼承多態的原理虛函數表(也叫做虛表)引申:虛表的打印多態的原理靜態…