日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL存储过程实例

發(fā)布時(shí)間:2023/12/14 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL存储过程实例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

(作者:陳玓玏)

定義

存儲(chǔ)過程在我的理解里,類似函數(shù)的定義,設(shè)定好了函數(shù)的輸入、輸出參數(shù)、類型,寫好了流程,存在數(shù)據(jù)庫里,想用的時(shí)候隨時(shí)可以調(diào)用,不需要重新寫sql語句,效率很高。而且一般的sql語句間沒有邏輯控制,利用存儲(chǔ)過程卻可以完成很復(fù)雜的邏輯控制,加上優(yōu)化的sql算法,靈活性和功能性都大大提高。

存儲(chǔ)過程的結(jié)構(gòu)

  • 語法:CREATE PROCEDURE 過程名([[IN|OUT|INOUT] 參數(shù)名 數(shù)據(jù)類型[,[IN|OUT|INOUT] 參數(shù)名 數(shù)據(jù)類型…]]) [特性 …] 過程體

  • 參數(shù)
    存儲(chǔ)過程根據(jù)需要可能會(huì)有輸入、輸出、輸入輸出參數(shù),如果有多個(gè)參數(shù)用”,”分割開。MySQL存儲(chǔ)過程的參數(shù)用在存儲(chǔ)過程的定義,共有三種參數(shù)類型,IN,OUT,INOUT:
    IN參數(shù)的值必須在調(diào)用存儲(chǔ)過程時(shí)指定,在存儲(chǔ)過程中修改該參數(shù)的值不能被返回,為默認(rèn)值
    OUT:該值可在存儲(chǔ)過程內(nèi)部被改變,并可返回
    INOUT:調(diào)用時(shí)指定,并且可被改變和返回

  • 在哪里定義?在哪里執(zhí)行?
    我用的是MySQL-Front,在數(shù)據(jù)庫名上點(diǎn)擊右鍵,新建過程就可以創(chuàng)建存儲(chǔ)過程,在數(shù)字1標(biāo)記的地方點(diǎn)擊右鍵,新建過程,創(chuàng)建存儲(chǔ)過程,在數(shù)字2標(biāo)記的地方調(diào)用存儲(chǔ)過程,當(dāng)然,也可以通過python連接數(shù)據(jù)庫來調(diào)用,在數(shù)字3標(biāo)記的地方查看運(yùn)行結(jié)果。
  • 有例子嗎?
  • -- 輸入?yún)?shù)例子 CREATE PROCEDURE in_param(IN p_in int) #創(chuàng)建一個(gè)存儲(chǔ)過程,只定義了輸入?yún)?shù)BEGINSELECT p_in;SET p_in=2;SELECT p_in;END;

    分別調(diào)用以下三句話:

    SET @p_in=1; CALL in_param(@p_in); SELECT @p_in;

    輸出結(jié)果分別是:1,2,1

    -- 輸出參數(shù)例子CREATE PROCEDURE out_param(OUT p_out int)BEGINSELECT p_out;SET p_out=2;SELECT p_out;END;

    分別調(diào)用以下命令:

    SET @p_out=1; CALL out_param(@p_out); SELECT @p_out;

    輸出結(jié)果分別是:
    空,2,2

    -- INOUT參數(shù)例子: CREATE PROCEDURE inout_param(INOUT p_inout int)BEGINSELECT p_inout;SET p_inout=2;SELECT p_inout;END;

    分別調(diào)用以下命令:

    SET @p_inout=1; CALL inout_param(@p_inout) ; SELECT @p_inout;

    輸出結(jié)果分別是:
    1,2,2

    五、有沒有更完整的例子?
    帶if else語句的存儲(chǔ)過程:

    CREATE DEFINER=`root`@`localhost` PROCEDURE `proc3`(IN parameter int) BEGINDECLARE var int;SET var=parameter+1;IF var=0 THENINSERT INTO mysql_study.score VALUES (17);END IF ;IF parameter=0 THENUPDATE mysql_study.score SET degree=degree+1;ELSEUPDATE mysql_study.score SET degree=degree+2;END IF ;END;

    調(diào)用

    SET @parameter=1; CALL proc3(@parameter);

    結(jié)果:
    由于設(shè)置的輸入?yún)?shù)為1,則表mysql_study.score中所有的degree值加2。

    帶循環(huán)語句的存儲(chǔ)過程:(MySQL沒有for循環(huán),只有WHILE-DO…END-WHILE、REPEAT…END REPEAT和LOOP…END LOOP)

    CREATE DEFINER=`root`@`localhost` PROCEDURE `proc7`(In v INT) BEGINDECLARE v INT;SET v=0;LOOP_LABLE:LOOP-- INSERT INTO mysql_study.score (degree) VALUES (v);select degree from mysql_study.score where degree>90-v ;SET v=v+1;IF v >=5 THENLEAVE LOOP_LABLE;END IF;END LOOP;END;

    調(diào)用

    SET @v=4; CALL proc7(@v); SELECT @v;

    輸出結(jié)果:有五次輸出,分別是輸出>85、86、87、88、89的所有分?jǐn)?shù)列表。

    六、輸入?yún)?shù)為可以為list變量嗎?
    可是可以,但是貌似有點(diǎn)麻煩。
    參考地址:https://segmentfault.com/q/1010000003003758,我自己沒試過,但是看別人是這么回答的,下次有時(shí)間試一下。上面的代碼都是可用的,我自己修改、測(cè)試通過了的。

    create procedure sp_split_string ( @string NVARCHAR(4000) ) AS BEGIN DECLARE @object_id nvarchar(500) DECLARE @i INT DECLARE @len INT print @string IF (@string IS NULL) OR (LTRIM(@string) = '') RETURNWHILE CHARINDEX(',',@string) > 0BEGINSET @len = LEN(@string)SET @i = CHARINDEX(',', @string)SET @object_id = LEFT(@string, @i-1)INSERT INTO a (id) VALUES (@object_id)--少做修改,改成需要的sql語句即可SET @string = RIGHT(@string, @len - @i)END SET @object_id = @string INSERT INTO a (id) VALUES (@object_id)--少做修改,改成需要的sql語句即可 END go

    –測(cè)試

    -- select * from a -- exec sp_split_string '102,103,105,106,107,108,200,500,306,408' -- select * from a

    Oracle的,也沒測(cè)試過:
    https://blog.csdn.net/weeknd/article/details/78412668,https://blog.csdn.net/weeknd/article/details/78412668

    -- 創(chuàng)建數(shù)組對(duì)象 create or replace type tables_array as varray(100) of varchar2(32); /-- 測(cè)試用存儲(chǔ)過程 create or replace procedure test_in_list( --參數(shù)區(qū)域objlist in tables_array,message out varchar2 ) is --變量區(qū)域 begin --執(zhí)行區(qū)域for i in objlist.first .. objlist.last loopmessage:=message||objlist(i)||',';end loop;commit; end test_in_list;

    如果有同學(xué)知道在存儲(chǔ)過程中傳入list參數(shù)的簡(jiǎn)單方法,也可以留言分享,不過也許直接通過python或者java來調(diào)用單次操作的存儲(chǔ)過程是最簡(jiǎn)單的吧。

    參考文章:https://www.cnblogs.com/mark-chan/p/5384139.html,https://www.cnblogs.com/mark-chan/p/5384139.html

    總結(jié)

    以上是生活随笔為你收集整理的MySQL存储过程实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。