mysql存儲過程


一.存儲過程基本語法

  

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是否可以執行了。 

默認情況下,delimiter是分號";"。在命令行客戶端中,如果有一行命令以分號結束, 那么回車后,mysql將會執行該命令。如輸入下面的語句 
mysql> select * from stu; 

然后回車,那么MySQL將立即執行該語句。但有時候,不希望MySQL這么做。因為可能輸入較多的語句,且語句中包含有分號。 默認情況下,不可能等到用戶把這些語句全部輸入完之后,再執行整段語句。因為mysql一遇到分號,它就要自動執行。 即,在語句之后為";"時,mysql解釋器就要執行了。 這種情況下,就需要事先把delimiter換成其它符號,如//或$$等其他符號。 這樣只有當$$出現之后,mysql解釋器才會執行這段語句 。記得最后一個要將結束符修改回";"。

2、刪除存儲過程
語法:
DROP PROCEDURE  IF  EXISTS  存儲過程名;

eg:

DROP PROCEDURE IF EXISTS proc_employee;

這個語句被用來移除一個存儲程序。不能在一個存儲過程中刪除另一個存儲過程,只能調用另一個存儲過程。

3、調用存儲過程

語法:

CALL 存儲過程名(參數列表);

注:
(1)CALL語句是用來調用一個先前用CREATE PROCEDURE創建的存儲過程。
(2)CALL語句可以用聲明為OUT或INOUT參數的參數給它的調用者傳回值。
(3)存儲過程名稱后面必須加括號,哪怕該存儲過程沒有參數傳遞。

 
二.個人測試
 
1.創建測試數據庫db1
 
  create database db1;
 
2.創建測試表employee_tbl
  

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 ; 

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM