MySql的存儲進程進修小結 附pdf文檔下載。本站提示廣大學習愛好者:(MySql的存儲進程進修小結 附pdf文檔下載)文章只能為提供參考,不一定能成為您想要的結果。以下是MySql的存儲進程進修小結 附pdf文檔下載正文
存儲進程是一種存儲在數據庫庫中的法式(就像正軌說話裡的子法式一樣),精確的來講,MySql支撐的“routine(例程)”有兩種:一是我們說的存儲進程,二是在其它sql語句中可以前往值的函數(應用起來和mysql預裝載的函數一樣,如pi())。
一個存儲進程包含名字,參數列表,和可以包含許多sql語句的sql語句集。在這裡對部分變量,異常處置,輪回掌握和if前提語句有新的語法界說。
上面是一個包含存儲進程的實例聲明:
CREATE PROCEDURE procedurel /*name 存儲進程名*/
(IN parameter1 INTEGER) /*parameters 參數*/
BEGIN /*start of blokc 語句塊頭*/
DECLARE variable1 CHAR(10); /*variables變量聲明*/
IF parameter1 = 17 THEN /*start of IF IF前提開端*/
SET variable1 = 'birds'; /*assignment賦值*/
END IF; /*end of IF IF停止*/
INSERT INTO table1 VALUES (variable1);/*statement SQL語句*/
END /*end of block 語句塊停止*/
MySQL 版本:5.0.45 phpMyAdmin版本:2.11.3
起首看MySQL 5.0參考手冊中關於創立存儲進程的語法解釋:
CREATE
[DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
proc_parameter:
[ IN | OUT | INOUT ] param_name type
type:
Any valid MySQL data type
characteristic:
LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'
routine_body:
Valid SQL procedure statement
假如你對MySQL還不太熟習的話,單單看這個語法構造固然缺乏以停止MySQL存儲進程編程。我之前根本都是應用MS SQL SERVER,所以以下記載我熟習MySQL存儲進程的進程,也是重點引見MS SQL SERVER與MySQL差別較年夜的處所。
第一步,固然是寫個Hello Word的存儲進程,以下:
CREATE PROCEDURE phelloword()
BEGIN
SELECT 'Hello Word!' AS F;
END;
將下面創立phelloword存儲進程的語句拷到phpMyAdmin中履行,報以下毛病:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3
在這個成績上我糾纏了良久,在MySQL的敕令行對象中履行異樣不勝利,然則依據提醒信息可以曉得履行在 SELECT 'Hello Word!' AS F;處停止,前面的END;沒有履行,這明顯會招致毛病。
這裡須要選擇以個分隔符,語法以下:DELIMITER //
分隔符是告訴MySQL客戶端曾經輸出完成的符號。一向都是用“;”,然則在存儲進程中不可,由於存儲進程中許多語句都須要用到分號。
是以下面的存儲進程改成:
CREATE PROCEDURE ptest()
BEGIN
SELECT 'Hello Word!' AS F;
END //
別的在phpMyAdmin中履行時,在Delimiter文本框中填寫 //,此次存儲進程便可創立勝利。
第二步,寫一個包含參數,變量,變量賦值,前提斷定,UPDATE語句,SELECT前往成果集的完全的一個存儲進程,以下:
CREATE PROCEDURE plogin
(
p_username char(15),
p_password char(32),
p_ip char(18),
p_logintime datetime
)
LABEL_PROC:
BEGIN
DECLARE v_uid mediumint(8);
DECLARE v_realpassword char(32);
DECLARE v_nickname varchar(30);
DECLARE v_oltime smallint(6);
SELECT u.uid, u.password, f.nickname, u.oltime INTO v_uid, v_realpassword, v_nickname, v_oltime
FROM cdb_members u INNER JOIN cdb_memberfields f ON f.uid = u.uid WHERE u.username = p_username;
IF (v_uid IS NULL) THEN
SELECT 2 AS ErrorCode;
LEAVE LABEL_PROC;
END IF;
IF (p_password <> v_realpassword) THEN
SELECT 3 AS ErrorCode;
LEAVE LABEL_PROC;
END IF;
UPDATE ipsp_userexpands SET lastloginip = p_ip, lastlogintime = p_logintime WHERE uid = v_uid;
SELECT 0 AS ErrorCode, v_uid AS uid, v_nickname AS nickname, v_oltime AS oltime;
END LABEL_PROC //
起首要說的是給變量賦值的語法,MySQL中應用SELECT u.uid, u.password, f.nickname, u.oltime INTO v_uid, v_realpassword, v_nickname, v_oltime FROM cdb_members u INNER JOIN cdb_memberfields f ON f.uid = u.uid WHERE u.username = p_username;這類方法給變量賦值。
其次是前提斷定的語法構造,以下所示:
IF ... THEN
...;
ELSE
IF ... THEN
...;
ELSEIF
...;
ELSE
...;
END IF;
END IF;
最初說說LEAVE 語法的應用。當知足某種前提,不持續履行上面的SQL時,在MS SQL SERVER中應用RETURN語法,在MySQL中我沒有找到對應的症結字,然則這裡可以應用LEAVE語法來知足請求,在存儲進程的BEGIN前界說一個標簽,如:“LABEL_PROC:” 然後再須要用到RETURN中止履行的處所履行“LEAVE LABEL_PROC;”便可。
第三步,創立一個履行靜態SQL的存儲進程。
CREATE PROCEDURE ipsp_getresourcedir
(
p_hashcode char(40)
)
LABEL_PROC:
BEGIN
DECLARE v_sql varchar(200);
SET v_sql = CONCAT('SELECT filedir FROM ipsp_resources WHERE hashcode =\'', p_hashcode, '\' LIMIT 0, 1');
SET @sql = v_sql;
PREPARE sl FROM @sql;
EXECUTE sl;
DEALLOCATE PREPARE sl;
END LABEL_PROC //
這裡提一下 “\”是本義字符,拼接成的SQL相似 SELECT filedir FROM ipsp_resources WHERE hashcode ='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' LIMIT 0, 1
別的@sql這個屬於用戶變量,詳細用法請查詢MySQL參考手冊。
假如有在MS SQL SERVER上編寫存儲進程的經歷的話,看完這些,我想根本的MySQL存儲進程編程應當可以敷衍了吧!
想懂得更多的內容可查詢MySQL參考手冊或許相干書本!
mysql 5.0存儲進程進修總結(更具體)
一.創立存儲進程
1.根本語法:
create procedure sp_name()
begin
………
end
2.參數傳遞
二.挪用存儲進程
1.根本語法:call sp_name()
留意:存儲進程稱號前面必需加括號,哪怕該存儲進程沒有參數傳遞
三.刪除存儲進程
1.根本語法:
drop procedure sp_name//
2.留意事項
(1)不克不及在一個存儲進程中刪除另外一個存儲進程,只能挪用另外一個存儲進程
四.區塊,前提,輪回
1.區塊界說,經常使用
begin
……
end;
也能夠給區塊起別號,如:
lable:begin
………..
end lable;
可以用leave lable;跳出區塊,履行區塊今後的代碼
2.前提語句
if 前提 then
statement
else
statement
end if;
3.輪回語句
(1).while輪回
[label:] WHILE expression DO
statements
END WHILE [label] ;
(2).loop輪回
[label:] LOOP
statements
END LOOP [label];
(3).repeat until輪回
[label:] REPEAT
statements
UNTIL expression
END REPEAT [label] ;
五.其他經常使用敕令
1.show procedure status
顯示數據庫中一切存儲的存儲進程根本信息,包含所屬數據庫,存儲進程稱號,創立時光等
2.show create procedure sp_name
顯示某一個存儲進程的具體信息
mysql存儲進程中要用到的運算符
mysql存儲進程進修總結-操作符
算術運算符
+ 加 SET var1=2+2; 4
- 減 SET var2=3-2; 1
* 乘 SET var3=3*2; 6
/ 除 SET var4=10/3; 3.3333
DIV 整除 SET var5=10 DIV 3; 3
% 取模 SET var6=10%3 ; 1
比擬運算符
> 年夜於 1>2 False
< 小於 2<1 False
<= 小於等於 2<=2 True
>= 年夜於等於 3>=2 True
BETWEEN 在兩值之間 5 BETWEEN 1 AND 10 True
NOT BETWEEN 不在兩值之間 5 NOT BETWEEN 1 AND 10 False
IN 在聚集中 5 IN (1,2,3,4) False
NOT IN 不在聚集中 5 NOT IN (1,2,3,4) True
= 等於 2=3 False
<>, != 不等於 2<>3 False
<=> 嚴厲比擬兩個NULL值能否相等 NULL<=>NULL True
LIKE 簡略形式婚配 "Guy Harrison" LIKE "Guy%" True
REGEXP 正則式婚配 "Guy Harrison" REGEXP "[Gg]reg" False
IS NULL 為空 0 IS NULL False
IS NOT NULL 不為空 0 IS NOT NULL True
邏輯運算符
與(AND)
AND |
TRUE |
FALSE |
NULL |
TRUE
TRUE
FALSE
NULL
FALSE
FALSE
FALSE
NULL
NULL
NULL
NULL
NULL
或(OR)
OR |
TRUE |
FALSE |
NULL |
TRUE
TRUE
TRUE
TRUE
FALSE
TRUE
FALSE
NULL
NULL
TRUE
NULL
NULL
異或(XOR)
XOR |
TRUE |
FALSE |
NULL |
TRUE
FALSE
TRUE
NULL
FALSE
TRUE
FALSE
NULL
NULL
NULL
NULL
NULL
位運算符
| 位或
& 位與
<< 左移位
>> 右移位
~ 位非(單目運算,按位取反)
mysq存儲進程中經常使用的函數,字符串類型操作,數學類,日期時光類。
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個空格
二.數學類
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為小數位數]
注:前往類型並不是均為整數,如:
(1)默許變成整形值
mysql> select round(1.23);
+————-+
| round(1.23) |
+————-+
| 1 |
+————-+
1 row in set (0.00 sec)
mysql> select round(1.56);
+————-+
| round(1.56) |
+————-+
| 2 |
+————-+
1 row in set (0.00 sec)
(2)可以設定小數位數,前往浮點型數據
mysql> select round(1.567,2);
+—————-+
| round(1.567,2) |
+—————-+
| 1.57 |
+—————-+
1 row in set (0.00 sec)
SIGN (number2 ) //前往符號,正負或0
SQRT(number2) //開平方
三.日期時光類
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) //分
附:可用在INTERVAL中的類型
DAY ,DAY_HOUR ,DAY_MINUTE ,DAY_SECOND ,HOUR ,HOUR_MINUTE ,HOUR_SECOND ,