Mysql 5.7存儲過程的學習

来源:https://www.cnblogs.com/huangrenhui/archive/2019/07/31/11278538.html
-Advertisement-
Play Games

存儲過程:對sql的封裝和重用,經編譯創建並保存在資料庫中,通過指定存儲過程的名字並給定參數(需要時)來調用執行。 優缺點: (1) 優點: 執行速度快 存儲過程只在創建時進行編譯,以後每次執行存儲過程都不需要重新編譯,而一般SQL語句沒執行一次就需編譯一次,所以使用存儲過程可提高資料庫的執行速度; ...


  1. 存儲過程:對sql的封裝和重用,經編譯創建並保存在資料庫中,通過指定存儲過程的名字並給定參數(需要時)來調用執行。

  2. 優缺點:

    (1) 優點:

    • 執行速度快------存儲過程只在創建時進行編譯,以後每次執行存儲過程都不需要重新編譯,而一般SQL語句沒執行一次就需編譯一次,所以使用存儲過程可提高資料庫的執行速度;
    • 減少網路通信量------當對資料庫進行複雜操作時,(如對多個表進行insert、update、select、delete時)可將這些複雜操作用存儲過程封裝起來與資料庫提供的事務處理結合一起使用。這些操作,如果用程式完成就是多條SQL語句,可能要多次連接資料庫,而換成存儲過程只需一次連接。
    • 更強的適應性與復用性------存儲過程可以重覆使用,提高了可重用性,減少資料庫開發人員的工作量。

    • 可維護性高------更新存儲過程通常比更改、測試以及重新部署程式集需要較少的時間和精力。

    • 安全性高,可設定只有某用戶才能對指定存儲過程的使用權,且存儲過程比多條sql穩定,只要資料庫不出現問題,基本上是不會出現什麼問題的,同時可以防止 SQL註入。

    (2) 缺點:

    • 開發調試差:無良好的IDE開發工具,存儲過程的調試比一般SQL要複雜的多。

    • 可移植性差:由於存儲過程將應用程式綁定到資料庫上,因此使用存儲過程封裝業務邏輯將限制應用程式的可移植性,如果應用程式進行數據源的切換(Mysql-->Orcle),需重新編寫存儲過程。

    • 不支持群集:資料庫伺服器無法水平擴展,或者資料庫的切割(水平或垂直切割)。資料庫切割之後,存儲過程並不清楚數據存儲在哪個資料庫中。
  3. 存儲過程的創建:

    • create procedure 存儲過程名 ([參數列表])  begin   sql 語句  end;
      • 參數列表的格式:[類型限定 變數名 數據類型] (5.7的發現參數數據類型長度必須聲明,不然sql編譯不過)
        • 參數列表有自己的類型限定,這個類型限定與數據類型不同,它是限定參數的作用範圍
          • in:限定這個參數是傳值給存儲過程,既然是傳值,所以可以是變數或常量數據【in修飾的參數一般是傳入存儲過程中作為某些條件的,不會被存儲過程修改
          • out:限定這個參數是存儲過程傳出的一個值,因為有值的返回,所以這個參數必須是一個變數【存儲過程中會給out修飾的變數賦值,使得過程外部可以獲取這個更改的值】
          • inout:inout是上面兩者的疊加,既可以被存儲過程內部使用,又可以修改後被外部使用,因為有值的返回,所以這個參數必須是一個變數
    • 理論上,對於希望簡潔代碼的地方都可以使用存儲過程來處理,比如希望快速使用多條select,又比如希望從數據中取出多個值賦值給變數;所以下麵只給出用法,應用場景就不講述了。
      • 1:不傳入參數,只執行某些特定代碼
      • 2.傳入參數,並利用參數作為條件執行代碼
      • 3.傳入參數,並利用參數作為條件執行代碼,同時利用變數獲取結果。
  4. 存儲過程的使用:

    • 調用存儲過程:call 存儲過程名();
    • 帶參數的調用存儲過程:call 存儲過程名(參數);
    • 對於in類型的,參數可以是數值,可以是變數
      • 對於out\inout類型的,參數必須是變數
      • 所有MySQL變數都必須以 @ 開始
      • 示例:call myselect("lilei",@變數名);示例:call myselect(@變數名,@變數名)
  5. 實例:

-- 無參創建
CREATE PROCEDURE demo1()
BEGIN 
    SELECT * from cli_txinfo LIMIT 1;
end;
-- 調用,輸出查詢結果
call demo1();


-- 2.有參創建,格式為:in 參數名 類型(長度)....
-- 單參demo2(in tableName varchar(20))
-- 多參demo2(in tableName varchar(20),name varchar(40))
create procedure demo2(in tableName varchar(20),name varchar(40))
BEGIN
    SELECT * from cli_txinfo where txname = name LIMIT 1;
end;
-- 調用,輸出查詢結果
call demo2("abc001","專屬顧問綁定申請列表查詢");


--3.有參創建,值返回格式為:out 參數名 類型(長度)
create procedure demo3(in tx varchar(20),out otx varchar(20))
begin 
    SELECT txname from cli_txinfo where txcode = tx into otx;
end;
-- 調用,輸出結果存儲到@tx中,只顯示sql的執行情況,沒有輸出操作結果,變數命名必須以@開頭
-- call demo3("abd002",tx);  ---->>編譯錯誤
call demo3("abd002",@tx);
-- 變數傳參,格式為 set @變數名 = 值
-- set @a = "abd002";
-- call demo3(@a,@tx);
-- 查詢輸出結果變數名的值
SELECT @tx;


-- 存儲過程的複雜sql語句
create procedure demo4()
begin 
  SELECT * from cli_txinfo limit 1;
  select * from cli_role limit 1;
END;
demo
call demo4;

-- 動態傳入表名(案例以兩個資料庫進行表的同步)
-- 使用CONCAT進行sql的拼接,拼接處必須留有空格,比如 concat('insert into '),不然拼接無法識別參數
-- prepare預處理,execute 執行,DEALLOCATE PREPARE釋放資源 
create procedure demo5(in syncTable varchar(20))
BEGIN
    set @deleteSql = CONCAT('truncate table keyun.',syncTable);
        set @insertSql = CONCAT('insert into keyun.',syncTable,' SELECT distinct * ','from keyun_sync.',syncTable);
    prepare delstmt from @deleteSql;
    prepare insstmt from @insertSql;
    execute delstmt;
    execute insstmt;
   DEALLOCATE PREPARE delstmt;
   DEALLOCATE PREPARE insstmt;
end;
-- 調用,輸出查詢結果
call demo5("third_binding");

 

  6.查看存儲過程:

    • 查看存儲過程的創建語句:show create procedure 存儲過程名;
    • 查看存儲過程狀態:show procedure status;【顯示的內容包括創建時間、註釋、定義的用戶、安全類型等等】

       7.修改存儲過程:

    • 修改存儲過程只能修改那些選項,並不能修改傳入傳出參數或者sql語句。
    • alter procedure 存儲過程名 選項;

      8.刪除存儲過程:

    • 語法:drop procedure 存儲過程名;
    • 示例:
      • drop procedure demo1;

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.自動尋找中國源 2.添加 Archlinux 中文社區倉庫(在/etc/pacman.conf文件中添加下麵兩行) 3.之後安裝 archlinuxcn-keyring 包導入GPG key 4.同步 5.安裝輸入法 安裝完成後配置輸入法,將搜狗輸入法移到所有輸入法最下麵,然後註銷用戶,重新登錄 ...
  • 本篇內容: 本篇內容: 進程與線程(進程管理) 進程狀態切換 進程調度演算法 進程同步 進程通信 進程與線程(進程管理) 進程狀態切換 進程調度演算法 進程同步 進程通信 (一)進程管理 (一)進程管理 進程和線程的區別: 進程和線程的區別: 定義區別: 定義區別: 進程是資源分配的基本單位。進程式控制制塊 ...
  • 環境說明演示vip自動漂移 192.168.237.50 192.168.237.51 vip: 192.168.237.5 keepalived開源軟體實現 keepalived可以實現當vip掛的時候,自動漂移,基於vrrp虛擬路由冗餘協議 主備,vrrp去宣告 存在問題 主起來後又會接管vip ...
  • 本文首發於:微信公眾號「運維之美」,公眾號 ID:Hi Linux。 ​「運維之美」是一個有情懷、有態度,專註於 Linux 運維相關技術文章分享的公眾號。公眾號致力於為廣大運維工作者分享各類技術文章和發佈最前沿的科技信息。公眾號的核心理念是:分享,我們認為只有分享才能使我們的團體更強大。如果你想第 ...
  • SQL Server in Docker 還原資料庫 上一會演示瞭如果在Docker環境下安裝SQL Server,這次我們來演示下如何還原一個資料庫備份文件到資料庫實例上。 使用winscp上傳bak文件到linux伺服器 上一回我們啟動docker容器的時候使用了 v參數掛賬了本地目錄/hd2/ ...
  • 前言: 上篇文章我們介紹了入門MySQL的基本概念,看完上篇文章,相信你應該瞭解MySQL的前世今生了吧。本篇文章將帶你從架構體系來學習MySQL。我認為學習MySQL架構體系應該是入門階段必須的,雖然可能看不太明白,暫時也用不到,但是我們心中要有這些概念,瞭解結構體系對於後續的學習是很有幫助的。 ...
  • 我們都知道建立索引能夠提高查詢效率,那麼是不是任何情況下都能提高呢,當然不是的的,下麵我們就來列舉一些常見的索引失效的場景。借用上一篇文章的dm_person_info表在card_code列沒加索引的時,查詢時間如下,大概都在0.07秒。 我們來加上索引試試,加上後查詢效率高了許多。 在正確使用索 ...
  • 問題:第1天給丈母娘1分錢,第2天給2分錢,第3天給4分錢,以此類推,每天給前一天的2倍,給一個月(按30天)算就行。問:第30天給多少錢,總共給多少錢? 解決方案:1)while迴圈方法(不推薦)一般思維可能就會定義一些變數,然後通過while進行迴圈,腳本會比較繁瑣。這種方法大部分人都能想到,即 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...