MySQL學習21:初始預存程序

來源:互聯網
上載者:User

標籤:

       一預存程序簡介

       在學習預存程序之前我們先來看看MySQL資料庫中的命令執行流程:


       (1)預存程序

       預存程序是SQL語句和控制語句的先行編譯集合,以一個名稱儲存並作為一個單元處理。

       (2)預存程序的優點

       1)增強SQL語句的功能和靈活性。

       2)實現較快的執行速度。

       3)減少網路流量。

       (3)預存程序文法結構解析       MySQL資料庫建立預存程序的文法結構為:

       CREATE [DEFINER = { user | CURRENT_USER} ] PROCEDURE sp_name ([proc_parameter[,...]]) 

[characteristic ...] routine_body;

       proc_parameter代表的含義:

       [ IN | OUT | INOUT ] param_name type

       參數含義:

       1)IN,表示該參數的值必須在調用預存程序時指定。

       2)OUT,表示該參數的值可以被預存程序改變,並且可以返回。

       3)INOUT,表示該參數的值在調用時指定,並且可以被改變和返回。

       (4)預存程序特性

       COMMENT ‘string‘

       | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA} 
       | SQL SECURITY { DEFINER | INVOKER }

       特性釋義:

       1)COMMENT:注釋。

       2)CONTAINS SQL:包含SQL語句,但不包含讀或寫資料的語句。

       3)NO SQL:不包含SQL語句。

       4)READS SQL DATA :包含讀資料的語句。

       5)MODIFIES SQL DATA:包含寫資料的語句。

       6)SQL SECURITY { DEFINER | INVOKER }:指明誰有許可權來執行。
       (5)過程體

       1)過程體由合法的SQL語句構成。

       2)過程體可以是任意SQL語句。

       3)過程體如果為複合結構則使用BEGIN...AND語句。

       4)複合結構也可以包含聲明、迴圈和控制結構。

       (6)調用預存程序

       MySQL資料庫調用預存程序的文法為:

       1)調用有參數的預存程序

       CALL sp_name([parameter[,...]]);

       2)調用無參數的預存程序

       CALL sp_name[()];

       二建立預存程序       (1)建立不帶參數的預存程序

       建立查詢MySQL資料庫版本號碼的預存程序

       CREATE PROCEDURE sp1() SELECT VERSION();

       調用預存程序

       CALL sp1;

       CALL sp1();


       (2)建立帶有IN型別參數的預存程序

       DESC users3;

       SELECT * FROM users3;


       建立一個刪除資料表中全部記錄的預存程序

       修改MySQL句的結束符:

       DELIMITER //

       CREATE PROCEDURE removeUserByID(IN id INT UNSIGNED) BEGIN DELETE FROM users3WHERE

 id=id; END//

       DELIMITER ;

       調用預存程序

       CALL removeUserByID(3);

       SELECT * FROM users3;


       修改預存程序的文法結構:

       ALTER PROCEDURE sp_name [chatacteristic ...] COMMENT ‘string‘ | { CONTAINS SQL | NO SQL | READS 

SQL DATA | MODIFIES SQL DATA} | SQL SECURITY { DEFINER | INVOKER };

       刪除預存程序的文法結構:       DROP PROCEDURE [IF EXISTS] sp_name;

       刪除預存程序例子:

       DROP PROCEDURE removeUserByID;

       重新向users3資料表中插入記錄

       INSERT users3 VALUES(NULL,‘Tom‘,‘123‘,25,1);

       INSERT users3 VALUES(NULL,‘John‘,‘223‘,DEFAULT,0);

       INSERT users3 VALUES(DEFAULT,‘Rose‘,‘323‘,25,1);

       INSERT users3 VALUES(DEFAULT,‘Paul‘,‘123‘,23,1);

       INSERT users3 VALUES(DEFAULT,‘Jord‘,‘123‘,23,1);

       INSERT users3 VALUES(DEFAULT,‘Lee‘,‘123‘,23,1);

       INSERT users3 VALUES(DEFAULT,‘Jams‘,‘123‘,23,1);

       INSERT users3 VALUES(NULL,‘Dave‘,‘456‘,23,0);

       INSERT users3 VALUES(NULL,‘Jack‘,‘456‘,24,1);


       建立一個刪除資料表中一條記錄的預存程序        DELIMITER //

        CREATE PROCEDURE removeUserByID(IN p_id INT UNSIGNED) BEGIN DELETE FROM users3WHERE 

id=p_id; END//

       DELIMITER ;

       SELECT * FROM users3;


       調用預存程序

       CALL removeUserByID(12);

       SELECT * FROM users3;


       (3)建立帶有IN和OUT型別參數的預存程序       建立一個刪除一條記錄並且返回剩餘記錄總數的預存程序

       DELIMITER //

       CREATE PROCEDURE removeUserAndReturnUserNums(IN p_id INT UNSIGNED,OUT userNums INT 

UNSIGNED) BEGIN DELETE FROM users3 WHERE id=p_id; SELECT count(id) FROM users3 INTO userNums;

 END//

       DELIMITER ;

       SELECT count(id) FROM users3;


       調用預存程序

       CALL removeUserAndReturnUserNums(14,@nums);

       SELECT @nums;


       以@符號開頭的字元序列是指使用者變數,也就是使用者在MySQL用戶端定義的變數,一般用在BEGIN AND塊中,

對預存程序傳入的參數進行聲明、定義等。

       (3)建立帶有多個OUT型別參數的預存程序

       得到被影響的行數的命令是:SELECT ROW_COUNT():

       建立通過age欄位刪除記錄並且返回刪除的記錄數和剩餘記錄數的預存程序

       DELIMITER //

       CREATE PROCEDURE removeUserByAgeAndReturnInfos(IN p_age INT UNSIGNED,OUT deleteUsers 

SMALLINT UNSIGNED,OUT userCounts SMALLINT UNSIGNED) BEGIN DELETE FROM users3 WHERE

 age=p_age; SELECT ROW_COUNT()  INTO deleteUsers; SELECT COUNT(id) FROM users3 INTO userCounts;

 END//

       DELIMITER ;


       SELECT * FROM users3;

       SELECT COUNT(id) FROM users3 WHERE age=23;


       調用預存程序(刪除age=23的記錄)

       CALL removeUserByAgeAndReturnInfos(23,@a,@b);

       SELECT @a;

       SELECT @b;


       SELECT * FROM users3;

       SELECT @a,@b;


       三預存程序與自訂函數的區別        預存程序和自訂函數的區別:

       1)預存程序實現的功能要複雜一些;而函數的針對性更強。

       2)預存程序可以返回多個值;函數只能有一個返回值。

       3)預存程序一般獨立的來執行;而函數可以作為其他SQL語句的組成部分來出現。
       使用預存程序注意事項

       1)建立預存程序或者自訂函數時需要通過DELIMITER語句修改定界符。

       2)如果函數體或過程體有多個語句,需要包含在BEIGIN...AND語句塊中。

       3)預存程序通過CALL關鍵字來調用。



MySQL學習21:初始預存程序

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.