程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySql的存儲進程進修小結 附pdf文檔下載

MySql的存儲進程進修小結 附pdf文檔下載

編輯:MySQL綜合教程

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 ,
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved