調用存儲過程
call 存儲過程名();
以上我們創建了一個簡單的存儲過程,當然我們的應用程序不可能使用這麼簡單的存儲過程,我們需要的是能給存儲過程傳遞參數,以返回給我們所需要的結果數據。下面就了解下存儲過程的參數。
存儲過程的參數
通常存儲過程接受用戶的參數,返回結果給調用用戶。
mysql規定對於存儲過程的參數要求其每個參數都必須聲明其參數名,數據類型以及該參數是輸入參數還是用於返回信息還是兩者兼有,對於存儲函數php只支持輸入參數。
聲明參數時規定要使用關鍵字IN,OUT,INOUT。
其中:
IN:用於輸入參數
OUT:用於返回參數
INOUT:用於向存儲過程傳遞參數值,如果該值改變則返回
另外規定對於聲名為OUT,INOUT的參數當我們調用存儲過程時需要在參數名前加@,以確保參數在過程外調用,下面我們修改上面的存儲過程以傳遞信息編號給存儲過程select_news,返回對應的信息標題給我們查看。
drop procedure if exists select_news;
create procedure select_news(IN id int,OUT title varchar(200))
select db_news.title from db_news where db_news.id=id;
與存儲過程返回參數不同的是存儲函數在定義時沒用直接聲明哪個變數是返回參數,而只是使用了returns聲明了返回參數所屬的數據類型,返回參數是在函數體中使用return返回要返回的數據變數的形式來表示的。這就需要注意的是:
存儲函數只支持輸入參數,並且輸入參數前沒有IN或INOUT.
返回上面的存儲函數,我們來解釋下代碼含義:
drop function if exists count_news;
如果存在存儲函數count_news則刪除該存儲函數,與存儲過程一樣我們可以使用下面的語句刪除存儲過程或函數
drop procedure|function [if exists] 存儲過程名|存儲函數名;
delimiter //
使用delimiter更改mysql默認使用分號(;)使用新的結束符號來結束當前語句,使用delimiter後原先默認的分號(;)結束語句符號不再起作用,直到重新恢復聲明結束符後。
create function count_news(hits int) returns int
注意存儲函數的參數只有輸入參數並且前不再聲明IN或INOUT,返回只需聲明要返回的數據類型
comment '根據傳入的點擊次數統計超過此點擊數的信息數目'
使用comment 來描述該存儲過程或存儲函數的功能信息。使用格式為 comment '描述字元串 '
begin
使用begin限定一個處理模塊
declare total_news int;
聲明變數 格式 declare 變數名 數據類型 [default 默認值]
declare hits_num int default 0;
聲明變數 格式 declare 變數名 數據類型 [default 默認值]
if hits>=0 then
set hits_num=hits;
使用set 給變數賦值
select count(id) into total_news from db_news where db_news.hits>hits_num;
sql語句可以使用into給變數賦值
else
set total_news=0;
end if;
上面是一個判斷語句,注意格式為if-else-end if 或者 if –else if-else-end if
注意分號(;)
return total_news;
使用return 返回存儲函數要返回的值,注意該值只能是一個值。
end;
//
delimiter ;
綜合一下我們上面的概念知識:
1. 存儲函數的參數與存儲過程有何不同。
2. 在存儲常式中如何更改mysql的默認結束符號。
3. 在存儲常式中如何描述功能信息。
4. 聲明、設置變數。
5. begin-end語句塊。
一.創建存儲過程
create procedure sp_name()
begin
.........
end
二.調用存儲過程
1.基本語法:call sp_name()
注意:存儲過程名稱後面必須加括弧,哪怕該存儲過程沒有參數傳遞
三.刪除存儲過程
1.基本語法:
drop procedure sp_name//
2.注意事項
(1)不能在一個存儲過程中刪除另一個存儲過程,只能調用另一個存儲過程
四.其他常用命令
1.show procedure status
顯示資料庫中所有存儲的存儲過程基本信息,包括所屬資料庫,存儲過程名稱,創建時間等
2.show create procedure sp_name
顯示某一個mysql存儲過程的詳細信息
mysql存儲過程的參數用在存儲過程的定義,共有三種參數類型,IN,OUT,INOUTCreate procedure|function([[IN |OUT |INOUT ] 參數名 數據類形...])
IN 輸入參數
表示該參數的值必須在調用存儲過程時指定,在存儲過程中修改該參數的值不能被返回,為默認值
OUT 輸出參數
該值可在存儲過程內部被改變,並可返回
INOUT 輸入輸出參數
調用時指定,並且可被改變和返回
IN參數例子:
CREATE PROCEDURE sp_demo_in_parameter(IN p_in INT)
BEGIN
SELECT p_in; --查詢輸入參數
SET p_in=2; --修改
select p_in;--查看修改後的值
END;
執行結果:
mysql> set @p_in=1
mysql> call sp_demo_in_parameter(@p_in)
略
mysql> select @p_in;
略
以上可以看出,p_in雖然在存儲過程中被修改,但並不影響@p_id的值
OUT參數例子
創建:
mysql> CREATE PROCEDURE sp_demo_out_parameter(OUT p_out INT)
BEGIN
SELECT p_out;/*查看輸出參數*/
SET p_out=2;/*修改參數值*/
SELECT p_out;/*看看有否變化*/
END;
執行結果:
mysql> SET @p_out=1
mysql> CALL sp_demo_out_parameter(@p_out)
略
mysql> SELECT @p_out;
略
INOUT參數例子:
mysql> CREATE PROCEDURE sp_demo_inout_parameter(INOUT p_inout INT)
BEGIN
SELECT p_inout;
SET p_inout=2;
SELECT p_inout;
END;
執行結果:
set @p_inout=1
call sp_demo_inout_parameter(@p_inout) //
略
select @p_inout;
略
附:函數庫
mysql存儲過程基本函數包括:字元串類型,數值類型,日期類型
一、字元串類
CHARSET(str) //返回字串字符集
CONCAT (string2 [,… ]) //連接字串
INSTR (string ,substring ) //返回substring首次在string中出現的位置,不存在返回0
LCASE (string2 ) //轉換成小寫
LEFT (string2 ,length ) //從string2中的左邊起取length個字元
LENGTH (string ) //string長度
LOAD_FILE (file_name ) //從文件讀取內容
LOCATE (substring , string [,start_position ] ) 同INSTR,但可指定開始位置
LPAD (string2 ,length ,pad ) //重複用pad加在string開頭,直到字串長度為length
LTRIM (string2 ) //去除前端空格
REPEAT (string2 ,count ) //重複count次
REPLACE (str ,search_str ,replace_str ) //在str中用replace_str替換search_str
RPAD (string2 ,length ,pad) //在str後用pad補充,直到長度為length
RTRIM (string2 ) //去除後端空格
STRCMP (string1 ,string2 ) //逐字元比較兩字串大小,
SUBSTRING (str , position [,length ]) //從str的position開始,取length個字元,
註:mysql中處理字元串時,默認第一個字元下標為1,即參數position必須大於等於1
mysql> select substring(』abcd』,0,2);
+———————–+
| substring(』abcd』,0,2) |
+———————–+
| |
+———————–+
1 row in set (0.00 sec)
mysql> select substring(』abcd』,1,2);
+———————–+
| substring(』abcd』,1,2) |
+———————–+
| ab |
+———————–+
1 row in set (0.02 sec)
TRIM([[BOTH|LEADING|TRAILING] [padding] FROM]string2) //去除指定位置的指定字元
UCASE (string2 ) //轉換成大寫
RIGHT(string2,length) //取string2最後length個字元
SPACE(count) //生成count個空格