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

歡迎訪問 生活随笔!

生活随笔

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

数据库

MySQL 存储过程的基本用法

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

http://database.51cto.com/art/201006/203159.htm

我們大家都知道MySQL 存儲(chǔ)過程是從 MySQL 5.0 開始逐漸增加新的功能。存儲(chǔ)過程在實(shí)際應(yīng)用中也是優(yōu)點(diǎn)大于缺點(diǎn)。不過最主要的還是執(zhí)行效率和SQL 代碼封裝。特別是 SQL 代碼封裝功能,如果沒有存儲(chǔ)過程。

在外部程序訪問數(shù)據(jù)庫時(shí)(例如 PHP),要組織很多 SQL 語句。

特別是業(yè)務(wù)邏輯復(fù)雜的時(shí)候,一大堆的 SQL 和條件夾雜在 PHP 代碼中,讓人不寒而栗。現(xiàn)在有了 MySQL 存儲(chǔ)過程,業(yè)務(wù)邏輯可以封裝存儲(chǔ)過程中,這樣不僅容易維護(hù),而且執(zhí)行效率也高。

一、MySQL 創(chuàng)建存儲(chǔ)過程

“pr_add” 是個(gè)簡單的 MySQL 存儲(chǔ)過程,這個(gè)MySQL 存儲(chǔ)過程有兩個(gè) int 類型的輸入?yún)?shù) “a”、“b”,返回這兩個(gè)參數(shù)的和。

  • drop?procedure?if?exists?pr_add;??
  • 計(jì)算兩個(gè)數(shù)之和

  • create?procedure?pr_add? ?
  • (? ?
  • a?int,? ?
  • b?int? ?
  • )? ?
  • begin? ?
  • declare?c?int;? ?
  • if?a?is?null?then? ?
  • set?a?=?0;? ?
  • end?if;? ?
  • if?b?is?null?then? ?
  • set?b?=?0;? ?
  • end?if;? ?
  • set?c?=?a?+?b;? ?
  • select?c?as?sum;? ?
  • /*? ?
  • return?c;??
  • 不能在 MySQL 存儲(chǔ)過程中使用。return 只能出現(xiàn)在函數(shù)中。

  • */? ?
  • end;??
  • 二、調(diào)用 MySQL 存儲(chǔ)過程

  • call?pr_add(10,?20);??
  • 執(zhí)行 MySQL 存儲(chǔ)過程,存儲(chǔ)過程參數(shù)為 MySQL 用戶變量。

  • set?@a?=?10;? ?
  • set?@b?=?20;? ?
  • call?pr_add(@a,?@b);??
  • 三、MySQL 存儲(chǔ)過程特點(diǎn)

    創(chuàng)建 MySQL 存儲(chǔ)過程的簡單語法為:

  • create?procedure?存儲(chǔ)過程名字()? ?
  • (? ?
  • [in|out|inout]?參數(shù)?datatype? ?
  • )? ?
  • begin? ?
  • MySQL?語句;? ?
  • end;??
  • MySQL 存儲(chǔ)過程參數(shù)如果不顯式指定“in”、“out”、“inout”,則默認(rèn)為“in”。習(xí)慣上,對(duì)于是“in” 的參數(shù),我們都不會(huì)顯式指定。

    1. MySQL 存儲(chǔ)過程名字后面的“()”是必須的,即使沒有一個(gè)參數(shù),也需要“()”

    2. MySQL 存儲(chǔ)過程參數(shù),不能在參數(shù)名稱前加“@”,如:“@a int”。下面的創(chuàng)建存儲(chǔ)過程語法在 MySQL 中是錯(cuò)誤的(在 SQL Server 中是正確的)。 MySQL 存儲(chǔ)過程中的變量,不需要在變量名字前加“@”,雖然 MySQL 客戶端用戶變量要加個(gè)“@”。

  • create?procedure?pr_add? ?
  • (? ?
  • @a?int,?--?錯(cuò)誤? ?
  • b?int?--?正確? ?
  • )??
  • 3. MySQL 存儲(chǔ)過程的參數(shù)不能指定默認(rèn)值。

    4. MySQL 存儲(chǔ)過程不需要在 procedure body 前面加 “as”。而 SQL Server 存儲(chǔ)過程必須加 “as” 關(guān)鍵字。

  • create?procedure?pr_add? ?
  • (? ?
  • a?int,? ?
  • b?int? ?
  • )? ?
  • as?--?錯(cuò)誤,MySQL?不需要?“as”? ?
  • begin? ?
  • mysql?statement?...;? ?
  • end;??
  • 5. 如果 MySQL 存儲(chǔ)過程中包含多條 MySQL 語句,則需要 begin end 關(guān)鍵字。

  • create?procedure?pr_add? ?
  • (? ?
  • a?int,? ?
  • b?int? ?
  • )? ?
  • begin? ?
  • mysql?statement?1?...;? ?
  • mysql?statement?2?...;? ?
  • end;??
  • 6. MySQL 存儲(chǔ)過程中的每條語句的末尾,都要加上分號(hào) “;”

  • ...? ?
  • declare?c?int;? ?
  • if?a?is?null?then? ?
  • set?a?=?0;? ?
  • end?if;? ?
  • ...? ?
  • end;??
  • 7. MySQL 存儲(chǔ)過程中的注釋。

  • /*? ?
  • 這是個(gè)? ?
  • 多行?MySQL?注釋。? ?
  • */? ?
  • declare?c?int;?--?這是單行?MySQL?注釋?(注意?--?后至少要有一個(gè)空格)? ?
  • if?a?is?null?then?#?這也是個(gè)單行?MySQL?注釋? ?
  • set?a?=?0;? ?
  • end?if;? ?
  • ...? ?
  • end;??
  • 8. 不能在 MySQL 存儲(chǔ)過程中使用 “return” 關(guān)鍵字。

  • set?c?=?a?+?b;? ?
  • select?c?as?sum;? ?
  • /*? ?
  • return?c;?--?不能在?MySQL?存儲(chǔ)過程中使用。return?只能出現(xiàn)在函數(shù)中。? ?
  • */? ?
  • end;??
  • 9. 調(diào)用 MySQL 存儲(chǔ)過程時(shí)候,需要在過程名字后面加“()”,即使沒有一個(gè)參數(shù),也需要“()”

  • call?pr_no_param();??
  • 10. 因?yàn)?MySQL 存儲(chǔ)過程參數(shù)沒有默認(rèn)值,所以在調(diào)用 MySQL 存儲(chǔ)過程時(shí)候,不能省略參數(shù)。可以用 null 來替代。


    http://www.cnblogs.com/andydao/archive/2013/03/13/2958115.html

    息:

    show function status;

    >創(chuàng)建自定義函數(shù)的過程如下demo1:

    drop function if exists fn_binary_table;
    delimiter //
    create function fn_binary_table(
    param_1?? varchar(50)
    )returns int
    begin
    declare total? int default 0;
    select count(*) into total from binary_table where file_type like param_1;
    return total;
    end;
    //
    delimiter ;

    定義一個(gè)輸出三個(gè)數(shù)中最大的數(shù)函數(shù):demo2如下:

    drop function if exists fn_three_max;
    delimiter //
    create function fn_three_max(
    param_1? double,
    param_2? double,
    param_3? double
    )returns double
    begin
    ?declare max_val double;
    ?if param_1 > param_2 then
    ??SET max_val = param_1;
    ?else
    ??SET max_val = param_2;
    ?end if;
    ?IF param_3>max_val THEN
    ??SET max_val = param_3;
    ?END IF;
    ?return max_val;?
    end;
    //

    調(diào)用此函數(shù)如下:

    select fn_three_max(3,100,90);

    簡單說明:

    mysql中:

    declare用戶定義一個(gè)局部變量

    set? 用戶給變量賦值。


    總結(jié)

    以上是生活随笔為你收集整理的MySQL 存储过程的基本用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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