最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL存儲過程實踐(in、out、inout)

 更新時間:2025年11月13日 11:05:59   作者:愛吃丶辣包  
文章介紹了數據庫中的存儲過程,包括其定義、優(yōu)缺點、性能調校與撰寫,以及創(chuàng)建和調用方法,還詳細說明了存儲過程的參數類型,包括IN、OUT和INOUT,并提供了示例代碼,最后,文章還解決了存儲過程名已存在的報錯問題

簡述存儲過程

存儲過程就是數據庫中的函數,增強數據庫的安全性

MySQL 5.0 版本開始支持存儲過程。

存儲過程的優(yōu)缺點

優(yōu)點

  1. 存儲過程執(zhí)行一次后,生成的二進制代碼就駐留在緩沖區(qū)
  2. 存儲過程是SQL語句加上控制語句的集合
  3. 存儲過程存儲在服務器端,客戶端調用時,直接在服務器端執(zhí)行,客戶端只是傳輸的調用語句,從而可以降低網絡負載
  4. 存儲過程被創(chuàng)建后,可以多次重復調用

缺點

  1. 存儲過程,往往定制化于特定的數據庫上,因為支持的編程語言不同。當切換到其他廠商的數據庫系統(tǒng)時,需要重寫原有的存儲過程。
  2. 存儲過程的性能調校與撰寫,受限于各種數據庫系統(tǒng)。

存儲過程的創(chuàng)建和調用

  • 存儲過程就是具有名字的一段代碼,用來完成一個特定的功能。
  • 創(chuàng)建的存儲過程保存在數據庫的數據字典中。

MySQL 存儲過程中的關鍵語法

聲明語句結束符,可以自定義:

DELIMITER $$
或
DELIMITER //

聲明存儲過程:

create procedure 存儲過程名(參數)

存儲過程體:

create function 存儲函數名(參數)

存儲過程開始和結束符號:

BEGIN .... END

變量賦值:

SET @p_in=1

查看數據庫中存在哪些存儲過程:

show procedure status 

案例

mysql> delimiter $$
mysql> create procedure qqq() 
    -> begin
    -> select * from info;
    -> end 
    -> $$

mysql> delimiter ;
mysql> call qqq();
+----+---------+-------+-------+------+
| id | name    | score | hobby | addr |
+----+---------+-------+-------+------+
|  1 | zhansan | 66.00 |     1 | nj   |
|  2 | lisi    | 68.00 |     2 | nj   |
|  3 | wangwu  | 74.00 |     3 | nj   |
|  4 | zhaoliu | 54.00 |     4 | NULL |
|  5 | xiaoqi  | 99.00 |     2 | nj   |
| 10 | T1      | 58.00 |     2 |      |
| 11 | owooo   | 55.00 |     1 |      |
| 12 | owo     | 55.00 |     1 |      |
| 13 | yowooo  | 58.00 |     1 |      |
| 14 | yowo    | 65.00 |     1 |      |
+----+---------+-------+-------+------+

存儲過程的參數

MySQL存儲過程的參數用在存儲過程的定義,共有三種參數類型,IN,OUT,INOUT,形式如:
CREATEPROCEDURE 存儲過程名([[IN |OUT |INOUT ] 參數名 數據類形…])

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

1、 in 輸入參數

mysql> delimiter $$
mysql> create procedure in_A(in a int) 
    -> begin
    -> select a;
    -> set a=1;
    -> select a;
    -> end
    -> $$

mysql> delimiter ;
mysql> call in_A(2);
+------+
| a    |
+------+
|    2 |
+------+
+------+
| a    |
+------+
|    1 |
+------+

以上可以看出,a 在存儲過程中被修改,但并不影響 a 的值,因為前者為局部變量、后者為全局變量。

2、out輸出參數

mysql> delimiter $$
mysql> create procedure out_b(out b int) 
    -> begin
    -> select b;
    -> set b=2;
    -> select b;
    -> end
    -> $$

mysql> delimiter ;
mysql> set @b=1;

mysql> call out_b(@b);
+------+
| b    |
+------+
| NULL |
+------+
+------+
| b    |
+------+
|    2 |
+------+

因為out是向調用者輸出參數,不接收輸入的參數,所以存儲過程里的b為null

mysql> select @b;
+------+
| @b   |
+------+
|    2 |
+------+

調用了out_b存儲過程,輸出參數,改變了b變量的值

3、inout輸入參數

mysql> delimiter $$
mysql> create procedure inout_a(inout a int)
    -> begin
    -> select a;
    -> set a=2;
    -> select a;
    -> end
    -> $$

mysql> delimiter ;
mysql> set @a=1;

mysql> call inout_a(@a);
+------+
| a    |
+------+
|    1 |
+------+
+------+
| a    |
+------+
|    2 |
+------+

mysql> select @a;
+------+
| @a   |
+------+
|    2 |
+------+

調用了inout_a存儲過程,接受了輸入的參數,也輸出參數,改變了變量

建議:

  • 輸入值使用in參數。
  • 返回值使用out參數。
  • inout參數就盡量的少用。

兩個橫桿–:這是用于單行注釋。

報錯

問題:

ERROR 1304 (42000): PROCEDURE test already exists

解決方法: test 存儲過程名已存在,換個存儲過程名可以了

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • MYSQL索引無效和索引有效的詳細介紹

    MYSQL索引無效和索引有效的詳細介紹

    MYSQL索引無效和索引有效的詳細介紹,需要的朋友可以參考一下
    2013-05-05
  • MySQL如何生成自增的流水號

    MySQL如何生成自增的流水號

    這篇文章主要介紹了MySQL如何生成自增的流水號問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 使用mysql查詢當天、近一周、近一個月及近一年的數據

    使用mysql查詢當天、近一周、近一個月及近一年的數據

    不論你是一名數據庫管理員或SQL開發(fā)者,還是一名簡單的MySQL用戶,掌握查詢特定日期數據的方法都是必不可少的,下面這篇文章主要給大家介紹了關于如何使用mysql查詢當天、近一周、近一個月及近一年的數據,需要的朋友可以參考下
    2023-06-06
  • MYSQL updatexml()函數報錯注入解析

    MYSQL updatexml()函數報錯注入解析

    這篇文章主要介紹了MYSQL updatexml()函數報錯注入解析,并且簡單介紹了updatexml函數,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • Mysql數據庫性能優(yōu)化二

    Mysql數據庫性能優(yōu)化二

    這篇文章主要介紹了Mysql數據庫性能優(yōu)化二 的相關資料,需要的朋友可以參考下
    2016-04-04
  • MySQL 數據恢復的多種方法匯總

    MySQL 數據恢復的多種方法匯總

    日常工作中,總會有因手抖、寫錯條件、寫錯表名、錯連生產庫造成的誤刪庫表和數據的事情發(fā)生。但是,如果每次刪庫都跑路的話,怕是再也不好找工作了吧!所以,刪庫跑路不是上上策
    2021-06-06
  • Mysql存儲過程學習筆記--建立簡單的存儲過程

    Mysql存儲過程學習筆記--建立簡單的存儲過程

    我們常用的操作數據庫語言SQL語句在執(zhí)行的時候需要要先編譯,然后執(zhí)行,而存儲過程(Stored Procedure)是一組為了完成特定功能的SQL語句集,經編譯后存儲在數據庫中,用戶通過指定存儲過程的名字并給定參數(如果該存儲過程帶有參數)來調用執(zhí)行它。
    2014-08-08
  • MySQL高性能實現Canal數據同步神器

    MySQL高性能實現Canal數據同步神器

    本文主要介紹了MySQL高性能實現Canal數據同步神器,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • MySql 5.5.29綠色安裝教程詳解

    MySql 5.5.29綠色安裝教程詳解

    本文給大家介紹mysql5.5.29綠色安裝教程,本文給大家介紹的非常詳細,具有參考借鑒價值,需要的朋友參考下
    2017-01-01
  • Mysql之DELETE操作對應的undo日志方式

    Mysql之DELETE操作對應的undo日志方式

    InnoDB通過正常記錄鏈表和垃圾鏈表管理數據頁,刪除記錄先標記為deletemark,后由purge線程移入垃圾鏈表回收空間,PAGE_FREE指向垃圾鏈表頭,PAGE_GARBAGE記錄可重用空間大小,Undo日志保存trx_id和roll_pointer,用于版本控制和回滾
    2025-08-08

最新評論

芷江| 惠来县| 嘉峪关市| 平陆县| 安图县| 霍城县| 永川市| 宜宾市| 巴彦县| 霍城县| 滕州市| 绥化市| 楚雄市| 登封市| 望奎县| 普格县| 酉阳| 渑池县| 林芝县| 科技| 讷河市| 新安县| 德令哈市| 宜川县| 永春县| 长阳| 铁力市| 安阳市| 芜湖市| 信阳市| 万载县| 资兴市| 宁波市| 密云县| 杨浦区| 库车县| 万全县| 措美县| 余姚市| 陇川县| 铁岭县|