一.存儲過程基本語法
1、創建存儲過程
MySQL中,創建存儲過程的基本形式如下:
CREATE PROCEDURE 存儲過程名 (參數列表) BEGIN SQL語句代碼塊 END
其中參數列表的形式如下:
[IN|OUT|INOUT] param_name type
多個參數之間用逗號“,”隔開,其中in表示輸入參數,out表示輸出參數,inout表示既可以輸入也可以輸出;param_name表示參數名稱;type表示參數的類型,該類型可以是MYSQL數據庫中的任意類型。
例子:下面的語句創建一個查詢tb_user表全部數據的存儲過程
DROP PROCEDURE IF EXISTS sp_test; DELIMITER // CREATE PROCEDURE sp_test() BEGIN SELECT * FROM tb_user; END // DELIMITER ;
注意:
(1)由括號包圍的參數列必須總是存在。如果沒有參數,也該使用一個空參數列()。每個參數默認都是一個IN參數。要指定為其它參數,可在參數名之前使用關鍵詞 OUT或INOUT
(2)"DELIMITER //" 語句的作用是將MYSQL的結束符設置為//,因為MYSQL默認的語句結束符為分號; ,存儲過程中的SQL語句需要分號來結束,為了避免與存儲過程中SQL語句結束符相沖突,需要使用DELIMITER 改變存儲過程的結束符,並以"END //"結束存儲過程。存儲過程定義完畢之后再使用DELIMITER ;恢復默認結束符。DELIMITER 也可以指定其他符號為結束符。注意:當使用DELIMITER命令時,應該避免使用反斜杠(\)字符,因為反斜杠是MYSQL的轉義字符!!!
DELIMITER 是分割符的意思,其實就是定義了一個語句執行的結束符,類似函數or存儲過程這樣的create語句由於其中包含了很多的";",而默認MySQL的結束符就是";",那么當我們創建的時候就會報錯,有了DELIMITER 就可以告訴mysql解釋器,該段命令是否已經結束了,mysql是否可以執行了。
mysql> select * from stu;
然后回車,那么MySQL將立即執行該語句。但有時候,不希望MySQL這么做。因為可能輸入較多的語句,且語句中包含有分號。 默認情況下,不可能等到用戶把這些語句全部輸入完之后,再執行整段語句。因為mysql一遇到分號,它就要自動執行。 即,在語句之后為";"時,mysql解釋器就要執行了。 這種情況下,就需要事先把delimiter換成其它符號,如//或$$等其他符號。 這樣只有當$$出現之后,mysql解釋器才會執行這段語句 。記得最后一個要將結束符修改回";"。
DROP PROCEDURE IF EXISTS 存儲過程名;
eg:
DROP PROCEDURE IF EXISTS proc_employee;
這個語句被用來移除一個存儲程序。不能在一個存儲過程中刪除另一個存儲過程,只能調用另一個存儲過程。
3、調用存儲過程
語法:
CALL 存儲過程名(參數列表);
注:
(1)CALL語句是用來調用一個先前用CREATE PROCEDURE創建的存儲過程。
(2)CALL語句可以用聲明為OUT或INOUT參數的參數給它的調用者傳回值。
(3)存儲過程名稱后面必須加括號,哪怕該存儲過程沒有參數傳遞。
CREATE TABLE `employee_tbl` (
`id` int(11) NOT NULL,
`NAME` varchar(255) DEFAULT NULL,
`date` datetime NOT NULL,
`signin` tinyint(4) NOT NULL DEFAULT '0' COMMENT '登錄次數',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
3.插入測試數據:
4.編寫並編譯存儲過程,根據id查詢對應的signin:
DELIMITER //
CREATE PROCEDURE myproc(
in o_id int,
out o_signin int
)
BEGIN
select signin into o_signin from employee_tbl where id = o_id;
END //
DELIMITER ;
5.定義變量o_id,o_signin:
set @o_id = 1;
set @o_signin= 1;
6.調用存儲過程:
call myproc(@o_id,@o_total);
7.查詢執行結果:
select @o_signin;
存儲過程入參也可以不用傳遞變量,可以直接傳遞字面值,比如call myproc(1,@o_total);也是可以的,同時在存儲過程外部用@定義的變量為用戶變量,在整個會話都有效,會話斷開失效;也可以在存儲過程中定義局部變量,局部變量請看下文
三.定義存儲過程局部變量
在存儲過程和函數中,可以定義和使用變量。用戶可以使用DECLARE關鍵字來定義變量。然后可以為變量賦值。這些變量的作用范圍是BEGIN…END程序段中。
MySQL中可以使用DECLARE關鍵字來定義變量。定義變量的基本語法如下:
DECLARE var_name[,...] type [DEFAULT value]
其中, DECLARE關鍵字是用來聲明變量的;var_name參數是變量的名稱,這里可以同時定義多個變量;type參數用來指定變量的類型;DEFAULT value子句將變量默認值設置為value,沒有使用DEFAULT子句時,默認值為NULL。
【示例】 下面定義變量my_sql,數據類型為INT型,默認值為10。代碼如下:
DECLARE my_sql INT DEFAULT 10 ;
局部變量只能在存儲過程體的begin…end語句塊中聲明。
局部變量必須在存儲過程體的開頭處聲明。
局部變量的作用范圍僅限於聲明它的begin..end語句塊,其他語句塊中的語句不可以使用它。
局部變量不同於用戶變量,兩者區別:局部變量聲明時,在其前面沒有使用@符號,並且它只能在begin..end語句塊中使用;而用戶變量在聲明時,會在其名稱前面使用@符號,同時已聲明的用戶變量存在於整個會話之中。
(2)為變量賦值
MySQL中可以使用SET關鍵字來為變量賦值。SET語句的基本語法如下:
SET var_name = expr [, var_name = expr] ...
其中,SET關鍵字是用來為變量賦值的;var_name參數是變量的名稱;expr參數是賦值表達式。一個SET語句可以同時為多個變量賦值,各個變量的賦值語句之間用逗號隔開。
【示例】下面為變量my_sql賦值為30。代碼如下:
SET my_sql = 30 ;
MySQL中還可以使用SELECT…INTO語句為變量賦值。其基本語法如下:
SELECT col_name[,…] INTO var_name[,…] FROM table_name WEHRE condition
其中,col_name參數表示查詢的字段名稱;var_name參數是變量的名稱;table_name參數指表的名稱;condition參數指查詢條件。
【示例】 下面從employee表中查詢id為2的記錄,將該記錄的d_id值賦給變量my_sql。代碼如下:
SELECT d_id INTO my_sql FROM employee WEHRE id=2 ;