4.函數(存儲函數)
函數,也稱存儲函數,必須返回一個數據(值)。
注意事項:1.在函數內,可以有各種變量和流程控制的使用
2.在函數內,可以有各種增刪改語句
3.在函數內,不可以用select或其他“返回結果集”的語句
定義形式:
Createfunction 函數名(形參1 類型1,形參2 類型2,…)
Returns返回類型
Begin
//函數體
Return XX;
End
調用形式:跟調用內部函數一致
比如:
Selectnow(),8+3 as f2,func();//now是內部函數,func自定義函數
或在語句中使用:Set @v1=func();
舉例:
Create functiongetMaxValue(p1 float,p2 float,p3 float)
Returns float
Begin
Declare result float;
If(p1>=p2 and p1>=p3) then
Begin
Set result=p1;
End;
Else if(p2>=p1 and p2>=p1) then
Begin
Set result=p2;
End;
Else
Begin
Set result=p3;
end
End if;
Return result ;
End
//在cmd執行該代碼,需要更換“語句結束符”: delimiter ///
調用:select now(),getMaxValue(1.2,2.3,3.4);
刪除函數:drop function 函數名;
5.存儲過程procedure:其本質還是函數,但其規定不能有返回值;
定義形式:
Createprocedure 存儲過程名(【in/out/inout】形參1 類型1,【in/out/inout】形參2 類型2,…)
Begin
//函數體
End
說明:(1)in默認可省略,用於設定該變量是用來“接受實參數據”的,即傳入
(2)out,用於設定該變量是用來“存儲過程中的數據”的,即傳出,函數中必須對他賦值
(3)inout,是in和out的結合,具有雙向作用
(4)對於out和inout設定,對應的實參必須是一個變量,因爲該變量用於接收傳出的數據。
例如:
Create procedure insert_getData(p1 int ,p2tinyint, p3 bigint)
Begin
Insert intotab_int(f1,f2,f3)values(p1,p2,p3);
Select * fromtab_int order by f1 desc limit 0,3;
End;
調用存儲過程
Call 存儲過程名 (實參1,實參2,…)
應該是自在非編程環境中的調用,如call insert_getdata(21,31,41);
例如:
Create procedure pro1(in p1 int ,out p2tinyint, inout p3 bigint)
Begin
Set p2=p1*2;
Set p3=p3+p1*3;
Insert into tab_int(f1,f2,f3)values(p1,p2,p3);
End;
調用函數:
Set @s3=3;
Call pro1(1,@s2,@s3);
Select @s2,@s3;
刪除存儲過程名
Drop procedure 存儲過程名;
Php中使用存儲函數和存儲過程
<?php
//調用存儲函數
$v1=$_POST[‘a’];
$v2=$_POST[‘b’];
$sql=”insert into tab1(id,f2,f3) values (null,now(),func($v1,$v2))”;
$result=mysql_query($sql);
//調用存儲過程
$v1=$_POST[‘a’];
$v2=$_POST[‘b’];
$v3=$_POST[‘c’];
$sql=”call insert_user($v1,$v2,$v3);”;//insert_user()是一個存儲過程,帶3個參數,會將3個參數數據寫入某個表中
$result=mysql_query($sql);
//使用存儲過程返回結果集
$v1=$_GET[‘id’];
$sql=”call Get_User_Info($v1);”;
$result=mysql_query($sql); //得到的結果集
?>