主頁 > 資料庫 > 存盤程序

存盤程序

2023-05-09 08:24:59 資料庫

存盤程序

介紹

存盤程序是事先經過編譯并存盤在資料庫中的一段SQL陳述句的集合,呼叫存盤程序可以簡化應用開發人員的很多作業,減少資料在資料庫和應用服務器之間的傳輸,對于提高資料處理的效率是有好處的,

存盤程序思想上很簡單,就是資料庫SQL語言層面的代碼封裝與重用,類似于函式或者說API,封裝了系列操作,暴露介面給你進行操作,

  • 特點
    封裝,復用
    可以接收引數,也可以回傳資料
    減少網路互動,效率提升

基本語法

  • 創建
    CREATE PROCEDURE 存盤程序名稱([引數串列])
    BEGIN
        -- SQL陳述句
    END;
    
  • 呼叫
    CALL 名稱([引數]);
    
  • 查看
    -- 查詢指定資料庫的存盤程序及狀態資訊
    SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = '資料庫名稱';
    -- 查詢某個存盤程序的定義
    SHOW CREATE PROCEDURE 存盤程序名稱;
    
  • 洗掉
    DROP PROCEDURE [IF EXISTS] 存盤程序名稱;\
    

注意:在命令列中,執行創建存盤程序的SQL陳述句時,需要通過關鍵字 delimiter 指定SQL陳述句的結束符,

代碼演示:

-- 存盤程序基本語法

-- 創建
CREATE PROCEDURE p1()
BEGIN
	SELECT COUNT(*) FROM emp;
END;

-- 如果在命令列執行的話,上面陳述句會出錯,因為遇到第一個分號就結束了,
-- 所以需要用到 delimiter
-- delimiter $$ --表示指定 $$ 為結束符(記得之后再使用delimiter改回來)

-- CREATE PROCEDURE p1()
-- BEGIN
-- 	SELECT COUNT(*) FROM emp;
-- END;$$
-- 這樣就可以解決

-- 呼叫
CALL p1();

-- 查看
SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = 'hsp_db02';
SHOW CREATE PROCEDURE p1;

-- 洗掉
DROP PROCEDURE IF EXISTS p1;

變數

  • 系統變數
    系統變數是MySQL服務器提供,不是用戶定義的,屬于服務器層面,分為全域變數(GLOBAL)、會話變數(SESSION),

    • 查看系統變數

      -- 查看所有系統變數
      SHOW [SESSION|GLOBAL] VARIABLES;
      -- 可以通過LIKE模糊匹配方式查找變數、
      SHOW [SESSION|GLOBAL] VARIABLES LIKE '......';
      -- 查看指定變數的值
      SELECT @@[SESSION|GLOBAL] 系統變數名;
      
    • 設定系統變數

      SET [SESSION|GLOBAL] 系統變數名 = 值;
      SET @@[SESSION|GLOBAL]系統變數名 = 值;
      

    注意:

    1. 如果沒有指定是session或global,則默認是session,會話變數,
    2. mysql服務重新啟動后,所設定的全域引數會失效,要想不失效,可以在/etc/my.cnf中配置

    代碼演示:

    -- 變數:系統變數
    -- 查看系統變數
    show variables; -- 所有系統變數
    show session variables; -- 會話變數
    show global variables; -- 全域變數
    
    show session variables like 'auto%';
    show global variables like 'auto%';
    
    select @@global.autocommit;
    select @@session.autocommit;
    
    -- 設定系統變數
    set session autocommit = 0; -- 設定為0,代表關閉了當前會話的事務的自動提交
    set global autocommit = 0; -- 當服務器重啟后,這個引數又會初始化為默認值,想要不失效,需要在etc/my.cnf中配置
    
  • 用戶定義變數
    用戶定義變數 是用戶根據需要自己定義的變數,用戶不用提前宣告,在用的時候直接用 "@變數名"使用就可以,其作用域為當前連接(會話),

    • 賦值

      SET @var_name = expr[,@var_name = expr]...;
      SET @var_name := expr[,@var_name := expr]...;
      
      SELECT @var_name := expr[,@var_name := expr]...;
      SELECT 欄位名 INTO @var_name FROM 表名;
      
    • 使用

      SELECT @var_name;
      

    注意:用戶定義的變數是無需對其進行宣告或初始化的,只不過獲取到的值為NULL,
    代碼演示:

    -- 變數:用戶變數
    -- 賦值
    SET @myname = 'itcast';
    SET @myage := 10; -- 推薦
    set @mygender := '男', @myhobby := 'java';
    
    SELECT @mycolor := 'red';
    SELECT COUNT(*) into @mycount FROM demo;
    
    -- 使用
    SELECT @myname, @myage, @mygender, @myhobby;
    SELECT @mycolor, @mycount;
    
    SELECT @abc; -- NULL
    
  • 區域變數
    區域變數是根據需要定義在區域生效的變數,訪問之前,需要DECLARE宣告,可以用作存盤程序內的區域變數和輸入引數,區域變數的范圍是在其內宣告的BEGIN ... END塊中,

    • 宣告

      DECLARE 變數名 變數型別[DEFAULT ...];
      

      變數型別就是資料庫欄位型別:INT、BiGINT、CHAR、VARCHAR、DATE、TIME等,

    • 賦值

      SET 變數名 = 值;
      SET 變數名 := 值;
      SELECT 欄位名 INTO 變數名 FROM 表名...;
      

    代碼演示:

    -- 變數:區域變數
    -- 宣告 declare
    -- 賦值
    CREATE PROCEDURE p2()
    BEGIN
        DECLARE stu_count INT DEFAULT 0;
        set stu_count := 100;
        SELECT COUNT(*) into stu_count FROM demo;
        SELECT stu_count;
    END;
    
    CALL p2();
    

if判斷

語法

IF 條件1 THEN
	......
ELSEIF 條件2 THEN         -- 可選
	......
ELSE                     -- 可選
	......
END IF;

代碼演示:

CREATE PROCEDURE p1()
BEGIN
	DECLARE score INT DEFAULT 58;
    DECLARE `result` VARCHAR(10);
    
    IF score >= 85 THEN
    	SET `result` := '優秀';
    ELSEIF score >= 60 THEN
    	SET `result` := '及格';
    ELSE
    	SET `result` := '不及格';
    END IF;
    
    SELECT `result`;
END;

CALL p1();

引數

型別 含義 備注
IN 因為該類引數作為輸入,也就是需要呼叫時傳入值 默認
OUT 因為該類引數作為輸出,也就是該類引數可以作為作為回傳值
INOUT 既可以作為輸入引數,也可以作為輸出引數

用法:

CREATE PROCEDURE 存盤程序名稱([IN/OUT/INOUT 引數名 引數型別])
BEGIN
  -- SQL陳述句
END;

代碼演示:

CREATE PROCEDURE p2(IN score INT, OUT `result` VARCHAR(10))
BEGIN
    IF score >= 85 THEN
    	SET `result` := '優秀';
    ELSEIF score >= 60 THEN
    	SET `result` := '及格';
    ELSE
    	SET `result` := '不及格';
    END IF;
END;

CALL p2(68, @result);
SELECT @result;


CREATE PROCEDURE p3(INOUT score INT)
BEGIN
	set score := score / 2;
END;

SET @score := 120;
CALL p3(@score);

SELECT @score;

case

  • 語法一

    CASE case_value
       WHEN when_value1 THEN statement_list1
       [WHEN when_value2 THEN statement_list2]...
       [ELSE statement_list]
    END CASE;
    
  • 語法二

    CASE
    	WHEN search_condition1 THEN statement_list1
    	[WHEN search_condition2 THEN statement_list2]
    	[ELSE statement_list]
    END CASE;
    

代碼演示:

CREATE PROCEDURE p4(in month int)
BEGIN
	declare result varchar(10);
    case
    	when month >= 1 and month <= 3 THEN
        	set result := '第一季度';
        when month >= 4 and month <= 6 THEN
        	set result := '第二季度';
        when month >= 7 and month <= 9 THEN
        	set result := '第三季度';
        when month >= 10 and month <= 12 THEN
        	set result := '第四季度';
        else
        	SET result := '非法引數';
        END case;

	SELECT concat('您輸入的月份為:', month, ' 所屬的季度為:', result);
END;

CALL p4(4);

回圈

  • 回圈-while
    while回圈是有條件的回圈控制陳述句,滿足條件后在執行回圈體內的SQL陳述句,具體語法如下:

    #先判定條件,如果條件為true,則執行邏輯,否則不執行邏輯
    WHILE 條件 DO
        -- SQL邏輯
    END WHILE;
    

    代碼演示:

    #計算1到n的累加值
    CREATE procedure p5(in n int)
    BEGIN
        DECLARE total int DEFAULT 0;
        WHILE n > 0 do
            set total := total + n;
            set n := n - 1;
    END WHILE;
    SELECT total;
    END;
    
    call p5(10);
    
  • 回圈-repeat
    repeat是有條件的回圈控制陳述句,直到滿足條件的時候退出回圈,具體語法如下:

    #先執行一次邏輯,然后判定是否滿足條件,如果滿足則退出,不滿足,繼續進行下一次回圈
    REPEAT
        -- SQL邏輯
        -- UNTIL 條件
    END REPEAT;
    

    代碼演示:

    #計算1到n的累加值
    CREATE procedure p6(in n int)
    BEGIN
        DECLARE total int DEFAULT 0;
        repeat
             set total := total + n;
             set n := n - 1;
         UNTIL n <= 0
         end REPEAT;
    SELECT total;
    END;
    
    call p6(10);
    
  • 回圈-loop
    LOOP實作簡單的回圈,如果不在SQL邏輯中增加退出回圈的條件,可以用其來實作簡單的死回圈,LOOP可以配合以下兩個陳述句使用:

    • LEAVE:配合回圈使用,退出回圈,
    • ITERATE:必須用在回圈中,作用是跳過當前回圈剩下的陳述句,直接進入下一次回圈,
    [begin_label:] LOOP
        -- SQL邏輯
    END LOOP [end_label];
    
    LEAVE label; -- 退出指定標記的回圈體
    ITERATE label; -- 直接進入下一次回圈
    

    代碼演示:

    #計算1到n的累加值
    CREATE procedure p7(in n int)
    BEGIN
        DECLARE total int DEFAULT 0;
    
        `sum`:LOOP
    	    if n <= 0 THEN
        	    Leave `sum`;
            END if;
            set total := total + n;
            set n := n - 1;
        end LOOP sum;
    
        SELECT total;
    END;
    
    call p7(10);
    
    
    #計算1到n中的偶數的累加值
    CREATE procedure p8(in n int)
    BEGIN
        DECLARE total int DEFAULT 0;
        `sum`:LOOP
    	    if n <= 0 THEN
        	    Leave `sum`;
            END if;
    
            IF n % 2 = 1 THEN
        	    set n := n - 1;
        	    iterate `sum`;
            end if;
    
            set total := total + n;
            set n := n - 1;
        end LOOP sum;
    
        SELECT total;
    END;
    
    call p8(10);
    

游標

游標(CURSOR)是用來存盤查詢結果集的資料型別,在存盤程序和函式中可以使用游標對結果集進行回圈的處理,游標的使用包括游標的宣告、OPEN、FETCH 和 CLOSE,其語法分別如下:

  • 宣告游標
    DECLARE 游標名稱 CURSOR FOR 查詢陳述句;
  • 打開游標
    OPEN 游標名稱;
  • 獲取游標記錄
    FETCH 游標名稱 INTO 變數[,變數];
  • 關閉游標
    CLOSE 游標名稱
CREATE procedure p1(in uage int)
BEGIN
	DECLARE u_name varchar(32);
    DECLARE u_profession varchar(32);
    DECLARE u_cursor CURSOR for SELECT name, profession FROM `user` where age <= uage;
    -- DECLARE exit handler for sqlstate '02000' CLOSE u_cursor;
    DECLARE exit handler for Not FOUND CLOSE u_cursor;
    
    DROP TABLE if exists user_pro;
    
    CREATE TABLE user_pro(
    	id int PRIMARY key AUTO_INCREMENT,
      	name varchar(32),
      	profession varchar(32)
    );
    
    OPEN u_cursor;
    
    WHILE true do
    	FETCH u_cursor INTO u_name, u_profession;
        INSERT into user_pro VALUES(null, u_name, u_profession);
    end WHILE;
end;

CALL p1(25);

SELECT * from user_pro;

user表:

id name age profession
1 孫悟空 20 java
2 豬八戒 21 php
3 沙和尚 22 C
4 唐僧 19 C++
5 觀音 24 C#
6 佛祖 30 js
7 玉皇大帝 31 ts
8 西王母 29 python
9 哪吒 15 go

user_pro表:

id name profession
1 孫悟空 java
2 豬八戒 php
3 沙和尚 C
4 唐僧 C++
5 觀音 C#
6 哪吒 go

條件處理程式-handler

條件處理程式(Handler)可以用來定義在流程控制結構執行程序中遇到問題時相應的處理步驟,具體語法如下:

DECLARE handler_action HANDLER FOR condition_value[,condition_value]... statement;
  • handler_action:
    • CONTINUE:繼續執行當前程式
    • EXIT:終止執行當前程式
  • condition_value:
    • SQLSTATE sqlstate_value:狀態碼,如02000;
    • SQLWARNING:所有以01開頭的SQLSTATE代碼的簡寫;
    • NOT FOUND:所有以02開頭的SQLSTATE代碼的簡寫;
    • SQLEXCEPTION:所有沒有被SQLWARNING或NOT FOUND捕獲的SQLSTATE代碼的簡寫

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/551970.html

標籤:MySQL

上一篇:hadoop前期環境搭建

下一篇:返回列表

標籤雲
其他(158685) Python(38123) JavaScript(25407) Java(18024) C(15222) 區塊鏈(8262) C#(7972) AI(7469) 爪哇(7425) MySQL(7172) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5336) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4567) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2432) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1965) Web開發(1951) HtmlCss(1932) python-3.x(1918) 弹簧靴(1913) C++(1912) xml(1889) PostgreSQL(1874) .NETCore(1857) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • 存盤程序

    存盤程序 介紹 存盤程序是事先經過編譯并存盤在資料庫中的一段SQL陳述句的集合,呼叫存盤程序可以簡化應用開發人員的很多作業,減少資料在資料庫和應用服務器之間的傳輸,對于提高資料處理的效率是有好處的。 存盤程序思想上很簡單,就是資料庫SQL語言層面的代碼封裝與重用,類似于函式或者說API,封裝了系列操作 ......

    uj5u.com 2023-05-09 08:24:59 more
  • hadoop前期環境搭建

    主機名 ip ssh免密登陸 #修改主機名 hostnamectl set-hostname node1 #修改ip地址 vim /etc/sysconfig/network-scripts/ifcfg-ens33 #node1 IPADDR="192.168.88.101" NETMASK="22 ......

    uj5u.com 2023-05-09 08:24:36 more
  • 作業中,我們經常用到哪些SQL陳述句呢?

    (Oracle常用SQL) 作業中我們基本上每天都要與資料庫打交道,資料庫的知識點呢也特別多,全部記住呢也是不可能的,也沒必要把所有的記住(有些陳述句命令可能我們一輩子都用不到)。 所以呢在作業之余,把作業中經常用到的一些陳述句整理出來,忘記的時候可以當做字典來查。 個人在作業中用Oracle資料庫比較 ......

    uj5u.com 2023-05-08 08:42:02 more
  • 作業中,我們經常用到哪些SQL陳述句呢?

    (Oracle常用SQL) 作業中我們基本上每天都要與資料庫打交道,資料庫的知識點呢也特別多,全部記住呢也是不可能的,也沒必要把所有的記住(有些陳述句命令可能我們一輩子都用不到)。 所以呢在作業之余,把作業中經常用到的一些陳述句整理出來,忘記的時候可以當做字典來查。 個人在作業中用Oracle資料庫比較 ......

    uj5u.com 2023-05-08 08:41:26 more
  • 讀SQL進階教程筆記15_SQL編程思維

    1. 還原論 1.1. 認為可以把高級現象還原為低級基本現象的學說 1.2. 將復雜的東西看成是由簡單單元組合而成的 1.2.1. 以賦值、條件分支、回圈等作為基本處理單元,并將系統整體分割成很多這樣的單元的思維方式 1.2.2. 檔案系統也是將大量的資料分割成記錄這樣的小單元進行處理的 2. 整體 ......

    uj5u.com 2023-05-08 08:29:10 more
  • shp資料插入sde連接的PostgreSQL庫(一)----基于 IntelliJ IDE的G

    前言 早就聽聞大名鼎鼎的GeoTools,因為自己不搞Java,所以之前沒用過, 背景 最近有個需求,一個白模系統,具體是資料是用SDE匯入到postgresql中,然后用arcgis server發布了矢量,最后用 arcgis api for js 4.x拉伸,得到有高度的白模。以前的資料都是通 ......

    uj5u.com 2023-05-08 08:23:31 more
  • 資料庫系統概論—安全、完整性

    資料庫系統概論—基礎篇(3) 三.資料庫安全性 1.資料庫安全性概述 資料庫的安全性指保護資料庫以防不合法使用所造成的資料泄露、更改或破壞 2.資料庫安全性控制 2.1用戶身份鑒別 靜態口令鑒別 動態口令鑒別 生物鑒別特征 智能卡鑒別 2.2存取控制 自主存取控制:給用戶限權(DAC,C1級) 強制 ......

    uj5u.com 2023-05-08 08:21:50 more
  • 2、etcd單機部署和集群部署

    上一章我們認識了etcd,簡單的介紹了 etcd 的基礎概念,但是理解起來還是比較抽象的。這一章我們就一起來部署下 etcd 。這樣可以讓我們對 etcd 有更加確切的認識。 1、etcd單實體部署 對于平常的學習,其實搭建一個單機節點是夠了的。接下來就講講怎么搭建單機節點。 本次部署是在 cent ......

    uj5u.com 2023-05-07 09:20:22 more
  • ☆常用的Sql陳述句匯總(DDL/DML)

    常用的sql陳述句匯總 1、獲取所有表名、表資訊 里面有表注釋 | 資料庫種類 | sql | 備注 | | | | | | mysql | -- 獲取所有表名、視圖名show tables-- 獲取 dev_test_data資料庫 所有表、視圖資訊select * from information ......

    uj5u.com 2023-05-07 09:20:02 more
  • Semi-Join Subquery優化策略

    Semi-Join Subquery優化策略 Semi-Join Subquery(半連接子查詢):對應IN或EXISTS子查詢,僅需要檢查"外表記錄"在"子查詢結果集"中是否存在匹配記錄,不需要計算"子查詢結果集"中記錄匹配次數,也不需要回傳"子查詢結果集"中匹配記錄內容 在MariaDB(MyS ......

    uj5u.com 2023-05-07 09:19:40 more