自定義函數、存儲過程(解釋in、out和inout)和mysql中的定義變量

自定義函數

函數:是一系列sql語句的集合,他的注重點主要是返回值,可以作爲查詢語句的一個部分來調用,針對性強
優點:提供sql語句的重用性,共享性,可移植性,執行速度快
缺點:只能返回一個值,功能複雜,寫起來更復雜,查看起來也困難

語法:

create function 函數名([參數列表]) returns 數據類型      #注意returns 要加s
begin
 sql語句;    #也可以寫邏輯語句
 return;
end;

直接演示帶參函數

mysql> delimiter $
mysql> create function stu_fun(name varchar(20)) returns int
    -> begin
    -> declare id int;      #定義變量,局部變量
    -> select id from stu where name=name into id;   #可以說用select into賦值變量,或者set c=1,或者set @c=1 一般set不用做select查詢賦值設
    -> return id;
    -> end;
    -> $

函數調用

mysql> select stu_fun('lyf');
+----------------+
| stu_fun('lyf') |
+----------------+
|              1 |
+----------------+
mysql> select * from stu where id=stu_fun("lyf");
+----+------+------+------+
| id | name | age  | sex  |
+----+------+------+------+
|  1 | lyf  |   18 ||
+----+------+------+------+

查看函數

mysql> show create function stu_fun(函數名);

查看所有函數

mysql> show function status;  #這裏會顯示所有函數包含系統的一般配合like做模糊查詢

刪除函數

mysql> drop function stu_fun(函數名);

注意:函數只返回一個值,如果查詢到多條值賦給id就會報錯
ERROR 1172 (42000): Result consisted of more than one row

存儲過程

存儲過程:一系列sql語句的集合,與函數不同的是他沒有返回值。可以作爲一個獨立的部分來執行, 他比函數更強大,他可以修改一系列表。能批量操作
優點:可重用性,對開發者透明,減少sql冗餘,也可以安全封裝,只顯示應該顯示的
缺點:開發、維護、調試是困難,複雜業務難以構造,過多的存儲過程會加大內存

語法;

create procedure 存儲過程名([參數列表])     #參數中in表示輸入、out表示輸出、inout表示可以輸入可以輸出
begin 
    sql語句或者邏輯語句
end;  

例子,一次性舉例三種參數傳遞

mysql> create procedure stu_proce(in name varchar(20),out ages int,inout sex varchar(2))
    -> begin
    -> select * from stu where name=name and sex=sex;
    -> select age into ages from stu where name=name and sex=sex;
    -> end;
    -> $
Query OK, 0 rows affected (0.00 sec)

使用存儲過程並設置參數:

mysql> delimiter ;
mysql> set @sex='男';      #一個@表示用戶變量,兩個@表示系統會話變量(最後會說明),inout需要先設置值之後在傳參
Query OK, 0 rows affected (0.00 sec)

#out輸出變量也需要用用戶變量傳出來
mysql> call stu_proce('lyf',@ages,@sex);
+----+------+------+------+
| id | name | age  | sex  |
+----+------+------+------+
|  1 | lyf  |   18 ||
+----+------+------+------+
1 row in set (0.00 sec)
Query OK, 1 row affected (0.01 sec)
#這裏輸出了那條select查詢語句


mysql> select @ages,@sex;
+------+------+
| @ages| @sex |
+------+------+
|  18  ||
+------+------+
1 row in set (0.00 sec)     
#注意這裏要用ages不能age是因爲如果用age就會同名,輸出結果會是Null,
#多個賦值可以用select age,name into ages,names from stu where id=1;       

查看存儲過程

mysql> show create procedure stu_proce(存儲過程名);

查看所有存儲過程

mysql> show procedure status;  #這裏會顯示所有函數包含系統的一般配合like做模糊查詢

刪除存儲過程

mysql> drop procedure stu_proce;

對於in、out、inout作用範圍:

mysql> delimiter $
mysql> create procedure proce(in p_in int,out p_out int,inout p_inout int)
    -> begin
    -> select p_in,p_out,p_inout;
    -> set p_in=2,p_out=2,p_inout=2;
    -> select p_in,p_out,p_inout;
    -> end;
    -> $
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> set @p_in=1,@p_out=1,@p_inout=1;
Query OK, 0 rows affected (0.00 sec)

mysql> call proce(@p_in,@p_out,@p_inout);
+------+-------+---------+
| p_in | p_out | p_inout |
+------+-------+---------+
|    1 |  NULL |       1 |
+------+-------+---------+
1 row in set (0.00 sec)

+------+-------+---------+
| p_in | p_out | p_inout |
+------+-------+---------+
|    2 |     2 |       2 |
+------+-------+---------+
1 row in set (0.01 sec)

Query OK, 0 rows affected (0.01 sec)

mysql> select @p_in,@p_out,@p_inout;
+-------+-------+----------+
| @p_in | @p_out| @p_inout |
+-------+-------+----------+
|     1 |     2 |        2 |
+-------+-------+----------+
1 row in set (0.00 sec)

p_in 在存儲過程中被修改,但並不影響 @p_id 的值
p_out爲null因爲out是向調用者輸出參數,不接收輸入的參數。調用後,輸出參數,改變了p_out變量的值
p_inout,在調用了存儲過程後,接受了輸入的參數,也輸出參數,改變了變量
這一部分開始我也不懂,我看了下w3的文檔然後實踐操作了一下

mysql中的變量定義

    用戶自定義變量:
            declare id int default 局部變量定義在begin ... end中
            set @id=1  用戶變量  只要寫上@id(寫id不算)他在這個窗口都有效,都可以使用(包括在函數、觸發器中)
    系統變量:用於改變系統參數的
            set @@id=1 會話變量             #這個修改只會改變這個窗口,其他窗口會改變
            set globe @@id=1 全局變量   #這個則只改變這次服務的開啓,重啓服務後又會重置
            永久改變系統參數配置,需要修改配置文件
   查詢全局變量:show global variables;
   查詢會話變量:show session variables;或show variables;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章