mysql 高級語句--存儲過程(PROCEDURE)

mysql 高級語句

一、存儲過程

1.什么是存儲過程:

就是一組SQL語句集,功能強大,可以實現一些比較復雜的邏輯功能。

ps:存儲過程跟觸發器有點類似,都是一組SQL集,但是存儲過程是主動調用的,且功能比觸發器更加強大,觸發器是某件事觸發后自動調用;

2.優勢

有輸入輸出參數,可以聲明變量,有if/else, case,while等控制語句,通過編寫存儲過程,可以實現復雜的邏輯功能;

函數的普遍特性:模塊化,封裝,代碼復用;

速度快,只有首次執行需經過編譯和優化步驟,后續被調用可以直接執行,省去以上步驟;

3.樣式

MySQL存儲過程創建的格式:CREATE PROCEDURE過程名([過程參數[,...]])

[特性...]過程體

IN輸入參數:表示該參數的值必須在調用存儲過程時指定,在存儲過程中修改該參數的值不能被返回,為默認值

OUT輸出參數:該值可在存儲過程內部被改變,并可返回

INOUT輸入輸出參數:調用時指定,并且可被改變和返回

4.創建存儲過程

3.1簡單案例:

#創建簡單的存儲過程

DROP PROCEDURE IF EXISTS `proc_adder`;

DELIMITER //? ? #定界符

CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_adder`(IN a int, IN b int, OUT sum int) #傳參數a,b輸出sum

BEGIN

#Routine body goes here...

DECLARE c int;? #定義常量

if a is null then set a = 0;

end if;

if b is null then set b = 0;

end if;

set sum? = a + b;

END

//

DELIMITER ;

set @b=5;

call proc_adder(2,@b,@s); #調用函數

select @s as sum;

if 語句

DROP PROCEDURE IF EXISTS `proc_if`;

DELIMITER //

CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_if`(IN type int)

BEGIN

#Routine body goes here...

DECLARE c varchar(500);

IF type = 0 THEN

set c = 'param is 0';

ELSEIF type = 1 THEN

set c = 'param is 1';

ELSE

set c = 'param is others, not 0 or 1';

END IF;

select c;

END

//

DELIMITER ;

set @type=1;

call proc_if(@type);

2.case 語句

set @type=1;

call proc_if(@type);

DROP PROCEDURE IF EXISTS `proc_case`;

DELIMITER //

CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_case`(IN type int)

BEGIN

#Routine body goes here...

DECLARE c varchar(500);

CASE type

WHEN 0 THEN

set c = 'param is 0';

WHEN 1 THEN

set c = 'param is 1';

ELSE

set c = 'param is others, not 0 or 1';

END CASE;

select c;

END

//

DELIMITER ;

set @type=1;

call proc_if(@type);

3.while 語句

DROP PROCEDURE IF EXISTS `proc_while`;

DELIMITER //

CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_while`(IN n int)

BEGIN

#Routine body goes here...

DECLARE i int;

DECLARE s int;

SET i = 0;

SET s = 0;

WHILE i <= n DO

set s = s + i;

set i = i + 1;

END WHILE;

SELECT s;

END

//

DELIMITER ;

set @type=1;

call proc_if(@type);

二,存儲過程操作

-- 查看所有的存儲過程

show PROCEDURE status;

-- 查看特定數據庫存儲過程

show PROCEDURE status where db='test';

-- 用指定的登錄名查看該用戶創建的存儲過程

show PROCEDURE status where definer='root@localhost';? -- @localhost為用戶登錄位置(本地登錄)

-- 查看指定時間段創建存儲過程

show PROCEDURE status where created between '2017-02-17 00:00:00'

and '2017-02-17 23:59:59';

用系統表mysql.proc來查看:

-- 查看所有的存儲過程信息

select * from mysql.proc;

-- 查看特定數據庫里的存儲過程

select * from mysql.proc where db='test';

-- 查看某個用戶定義的存儲過程

select * from mysql.proc where definer='root@localhost';

-- 查看某時間段創建的存儲過程

select * from mysql.proc where created between '2017-02-17 00:00:00'

and '2017-02-17 23:59:59';

5.存儲過程刪除

刪除一個存儲過程比較簡單,和刪除表一樣:

DROP PROCEDURE

三, MySQL存儲過程的基本函數

(1).字符串類

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

UCASE (string2 ) //轉換成大寫

RIGHT(string2,length) //取string2最后length個字符

SPACE(count) //生成count個空格

(2).數學類

ABS (number2 ) //絕對值

BIN (decimal_number ) //十進制轉二進制

CEILING (number2 ) //向上取整

CONV(number2,from_base,to_base) //進制轉換

FLOOR (number2 ) //向下取整

FORMAT (number,decimal_places ) //保留小數位數

HEX (DecimalNumber ) //轉十六進制

注:HEX()中可傳入字符串,則返回其ASC-11碼,如HEX('DEF')返回4142143也可以傳入十進制整數,返回其十六進制編碼,如HEX(25)返回19

LEAST (number , number2 [,..]) //求最小值

MOD (numerator ,denominator ) //求余

POWER (number ,power ) //求指數

RAND([seed]) //隨機數

ROUND (number [,decimals ]) //四舍五入,decimals為小數位數]

(3).日期時間類

ADDTIME (date2 ,time_interval ) //將time_interval加到date2

CONVERT_TZ (datetime2 ,fromTZ ,toTZ ) //轉換時區

CURRENT_DATE ( ) //當前日期

CURRENT_TIME ( ) //當前時間

CURRENT_TIMESTAMP ( ) //當前時間戳

DATE (datetime ) //返回datetime的日期部分

DATE_ADD (date2 , INTERVAL d_value d_type ) //在date2中加上日期或時間

DATE_FORMAT (datetime ,FormatCodes ) //使用formatcodes格式顯示datetime

DATE_SUB (date2 , INTERVAL d_value d_type ) //在date2上減去一個時間

DATEDIFF (date1 ,date2 ) //兩個日期差

DAY (date ) //返回日期的天

DAYNAME (date ) //英文星期

DAYOFWEEK (date ) //星期(1-7) ,1為星期天

DAYOFYEAR (date ) //一年中的第幾天

EXTRACT (interval_name FROM date ) //從date中提取日期的指定部分

MAKEDATE (year ,day ) //給出年及年中的第幾天,生成日期串

MAKETIME (hour ,minute ,second ) //生成時間串

MONTHNAME (date ) //英文月份名

NOW ( ) //當前時間

SEC_TO_TIME (seconds ) //秒數轉成時間

STR_TO_DATE (string ,format ) //字串轉成時間,以format格式顯示

TIMEDIFF (datetime1 ,datetime2 ) //兩個時間差

TIME_TO_SEC (time ) //時間轉秒數]

WEEK (date_time [,start_of_week ]) //第幾周

YEAR (datetime ) //年份

DAYOFMONTH(datetime) //月的第幾天

HOUR(datetime) //小時

LAST_DAY(date) //date的月的最后日期

MICROSECOND(datetime) //微秒

MONTH(datetime) //月

MINUTE(datetime) //分返回符號,正負或0

SQRT(number2) //開平方

四,PHP對存儲過程的調用

實例一:無參的存儲過程

$conn = mysql_connect('localhost','root','root') or die ("數據連接錯誤!!!");

mysql_select_db('test',$conn);

$sql = "

create procedure myproce()

begin

INSERT INTO user (id, username, sex) VALUES (NULL, 's', '0');

end;

";

mysql_query($sql);//創建一個myproce的存儲過程

$sql = "call test.myproce();";

mysql_query($sql);//調用myproce的存儲過程,則數據庫中將增加一條新記錄。


實例二:使用變量的存儲過程

$sql = "

create procedure myproce5(in a int,in b int)

begin

declare s int default 0;

set s=a+b;

select s;

end;

";

mysql_query($sql);//創建一個myproce5的存儲過程

$sql = "call test.myproce5(4,6);";

mysql_query($sql);//調用myproce5的存儲過程,在cmd下面看效果





轉自:http://blog.csdn.net/u011871037/article/details/51546605的博客。

一,mysql光標 儲存

1.declare ? 聲明光標

2.open ?打開光標

3.fetch 獲取光標記錄,并賦值

4.close 關閉光標

例子:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容