1. 程式人生 > >Mysql中的儲存過程

Mysql中的儲存過程

什麼是儲存過程

簡單的說,就是一組SQL語句集,功能強大,可以實現一些比較複雜的邏輯功能,類似於JAVA語言中的方法;

ps:儲存過程跟觸發器有點類似,都是一組SQL集,但是儲存過程是主動呼叫的,且功能比觸發器更加強大,觸發器是某件事觸發後自動呼叫;

有哪些特性

有輸入輸出引數,可以宣告變數,有if/else, case,while等控制語句,通過編寫儲存過程,可以實現複雜的邏輯功能;

函式的普遍特性:模組化,封裝,程式碼複用;

速度快,只有首次執行需經過編譯和優化步驟,後續被呼叫可以直接執行,省去以上步驟;

建立一個簡單的儲存過程

儲存過程proc_adder功能很簡單,兩個整型輸入引數a和b,一個整型輸出引數sum,功能就是計算輸入引數a和b的結果,賦值給輸出引數sum;

幾點說明:

DELIMITER ;;:之前說過了,把預設的輸入的結束符;替換成;;。

DEFINER:建立者;

複製程式碼
-- ----------------------------
-- Procedure structure for `proc_adder`
-- ----------------------------
DROP PROCEDURE IF EXISTS `proc_adder`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_adder`(IN a int, IN b int, OUT sum int)
BEGIN
    #Routine body goes here...

    DECLARE c int;
    if a is null then set a = 0; 
    end if;
  
    if b is null then set b = 0;
    end if;
set sum = a + b; END ;; DELIMITER ;
複製程式碼

執行以上儲存結果,驗證是否正確,如下圖,結果OK:

set @b=5;
call proc_adder(2,@b,@s);
select @s as sum;

儲存過程中的控制語句

IF語句:

複製程式碼
-- ----------------------------
-- Procedure structure for `proc_if`
-- ----------------------------
DROP PROCEDURE IF EXISTS `proc_if`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_if`(IN type int)
BEGIN
    #Routine body goes here...
    DECLARE c varchar(500);
    IF type = 0 THEN
        set c = 'param is 0';
    ELSEIF type = 1 THEN
        set c = 'param is 1';
    ELSE
        set c = 'param is others, not 0 or 1';
    END IF;
    select c;
END
;;
DELIMITER ;
複製程式碼

CASE語句:

複製程式碼
-- ----------------------------
-- Procedure structure for `proc_case`
-- ----------------------------
DROP PROCEDURE IF EXISTS `proc_case`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_case`(IN type int)
BEGIN
    #Routine body goes here...
    DECLARE c varchar(500);
    CASE type
    WHEN 0 THEN
        set c = 'param is 0';
    WHEN 1 THEN
        set c = 'param is 1';
    ELSE
        set c = 'param is others, not 0 or 1';
    END CASE;
    select c;
END
;;
DELIMITER ;
複製程式碼

迴圈while語句:

複製程式碼
-- ----------------------------
-- Procedure structure for `proc_while`
-- ----------------------------
DROP PROCEDURE IF EXISTS `proc_while`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_while`(IN n int)
BEGIN
    #Routine body goes here...
    DECLARE i int;
    DECLARE s int;
    SET i = 0;
    SET s = 0;
    WHILE i <= n DO
        set s = s + i;
        set i = i + 1;
    END WHILE;
    SELECT s;
END
;;
DELIMITER ;
複製程式碼

其它:略~

儲存過程弊端

不同資料庫,語法差別很大,移植困難,換了資料庫,需要重新編寫;

不好管理,把過多業務邏輯寫在儲存過程不好維護,不利於分層管理,容易混亂,一般儲存過程適用於個別對效能要求較高的業務,其它的必要性不是很大;

原文 http://www.cnblogs.com/chenpi/p/5136483.html

相關推薦

Mysql儲存過程與自定義函式的區別

建立儲存過程: CREATE [definer = {user|current_user}] PROCEDURE sp_name ([ proc_parameter [,proc_parameter ...]]) [ characteristi

MySQL 儲存過程 中文亂碼問號???

mysql 中文亂碼一直是一個老大難的問題,接下來一一解決!!!! 資料庫儲存資料亂碼 儲存過程中資料亂碼 001 資料庫儲存資料亂碼 相信大家遇到最多就是資料庫中儲存資料,操作完之後,資料庫中中文亂碼,變為????問號。

mysql儲存過程 解決引數作為表名

1.用變數做表名:  簡單的用set或者declare語句定義變數,然後直接作為sql的表名是不行的,mysql會把變數名當作表名。在其他的sql資料庫中也是如此,mssql的解決方法是將整條sql語句作為變數,其中穿插變數作為表名,然後用sp_executesql呼叫該語句。 這在mysql5.0之前是不

MySQL儲存過程的3種迴圈,儲存過程的基本語法,ORACLE與MYSQL儲存過程/函式的使用區別,退出儲存過程方法

  學無止境 部落格園   首頁   新隨筆   聯絡   訂閱  管理 隨筆-1968  評論-103  文章-4&

MySQL使用儲存過程為資料庫全部的表增加備用欄位

需求描述 要為資料庫裡的所有的表統一加上十六個備用欄位,前提是備用欄位名取表名前三位,拼接上備用1-16 , 16個欄位中,其中8個varchar, 4個int, 4個datetime 1.建立一個簡單的表 DROP TABLE customer_detail_info; C

mysql儲存過程將一個表的資料跟新到另一個表

這兩天學習mysql遊標的使用 就做了一個小練習題目 很簡單但是可以鍛鍊一下mysql遊標的使用方法 將friend1表中的資料更新到user-fri friend1 需要更新的表 user_fri 儲存過程如下 BEGIN DECLARE userid int;

如何在MySQL儲存過程書寫批量的使用者許可權/授權語句

網上單獨關於MySQL使用者許可權或者儲存過程的文章有不少,但是關於在儲存過程中如何書寫使用者授權語句,尤其是批量授權的資料卻很少。 為什麼筆者會遇到在儲存過程中書寫批量使用者授權語句的需求,是因為筆者在日常開發中承擔了一部分簡單的運維職責(筆者還是很贊同開發兼運維的思想)

mysql使用儲存過程將一個表的資料匯入另一個表

儲存過程 本人也是第一次使用儲存過程,中間遇到了很多坑,在此記錄一下,希望能幫助使用的人少踩點坑。。 先說一下我使用儲存過程的需要,其實需求很簡單就是把一個表中的資料匯入一個新的表中,並且刪除原有表中的資料,說白了就是一個數據的備份 我是使用navicat

mysql儲存過程字串轉換數字

公司的需求,需要根據使用者的設定的百分比去查詢資料。當時純真的以為可以 -- set @a_value=`CONVERT`(@a_value,DOUBLE); 但是會出現錯誤,百度了一下,原來convert不支援轉化為double 只能轉換以下型別 二進位制,同帶binar

mysql儲存過程從結果集給多個引數賦值的辦法

DECLARE var1 DATETIME; DECLARE var2 DATETIME; SELECT    t.f1, t.f2  into var1,var2 FROM    tableName t ; SELECT     class_id1,     atten

創建MYSQL儲存過程

創建mysql的儲存過程 創建不帶參數的儲存過程CREATE PROCEDURE 過程名() 過程體 SELECT VERSION(); 調用儲存過程第一種CALL 過程名(); (帶有參數時使用)第二種CALL 過程名; (不帶參數時使用)

SQL server 2012 儲存過程除錯

1、儲存過程無法直接除錯 選中要除錯的儲存過程,右擊“執行儲存過程”,根據是否需要輸入引數,若需要則可以先隨便輸入,跳轉到Exec 頁面後,輸入正確合理的引數進行,F10,開始除錯,F11,進入到被呼叫的儲存過程中。 結論:無法很好的與C#客戶端程式聯合起

MySQL優化---儲存過程儲存函式-1-轉自部落格園

轉自網際網路.mysql優化   當一個大型系統在建立時,會發現,很多的SQL操作是有重疊的,個別計算是相同的,比如:業務系統中,計算一張工單的計算方式。當遇到這些情況時,我們運用儲存過程就是一個非常棒的優化啦。那麼,什麼是儲存 過程和儲存函式呢? 一、MYSQL儲存過程簡介(技術

SqlServer儲存過程中將Exec的執行結果賦值給變數輸出

背景: 遇到這樣一種情況:動態向儲存過程中傳入表名和表的某些屬性(這裡用到的是主鍵ID),然後利用這兩個變數查出一條資料的某些欄位值,然後再利用這些值進行邏輯運算(自己的邏輯),最後將結果輸出。話不多說,直接上圖,看是否是你想要的結果: 說明:【區域1為要用來測試的表】【 區域2 為表中資料】【區域3

關於MySQL資料庫儲存過程的感想

以下只是學習路上的淺薄感想,如理解有所偏差,還請有識之士指正! 一、儲存過程意義理解     關於儲存過程,我的理解是對資料庫語言進行程式設計呼叫,就像Java程式碼類程式設計寫一個具有某種特定功能的方法去進行呼叫一樣。資料庫的儲存過程是一組相關聯的sql語句或函式,通過進行組合形成模

mysql建立儲存過程,模擬插入200萬用戶

公司需要建立模擬使用者測試大資料,百度建立儲存過程模擬插入資料下面是sql程式碼 CREATE PROCEDURE test()  begin  declare var int; declare a int; declare mobile bigint; SET var

Sql Server 2008儲存過程傳入表值引數

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

(十二)MySQL基礎——儲存過程和函式

儲存過程和函式:類似於java中的方法 好處:1、提高程式碼的重用性;2、簡化操作   儲存過程: 1、含義:一組預先編譯好的sql語句的集合,可以理解成批處理語句 2、優點:(1)提高程式碼的重用性(2)簡化操作(3)減少了編譯次數並且減少了和資料庫伺服器的連線次

MySQL儲存過程和函式入門 第一篇

最近開發中用到儲存過程和函式,就順便學習一下了。 1.什麼是儲存過程和函式?   儲存過程和函式是事先經過編譯並存儲在資料庫的一段SQL語句集合,呼叫儲存過程和函式可以減少資料庫和應用伺服器之間的傳輸,對於提高資料處理的效率是有好處的。 2.儲存過程和函式的區別 函式

Oracle與Mysql建立儲存過程

<1>Oracle如下: create or replace procedure aa //建立無參儲存過程 is begin for i in 1…100000 loop //定義迴圈 insert into jz(jz_object_id,cid,customer_id,co