summary:mysql存储过程

存储过程的特性:a.存储过程是被认证的技术 b.由于存储过程降低了网络信息流量,可以是系统运行更快。如果你需要的是检查、循环、多语句但没有用户交互,存储过程将是不错的选择。c.存储过程是可以复用的组件。d.存储过程将被数据库保存。e.存储过程是可以移植的。

 

 

1.存储过程使用命令:show procedure status (查看数据库存储过程)    show create procedure proName(查看存储过程结构)

2.创建存储过程基本结构:create procedure proName(in inParameter integer, out outParameter integer)

                                    BEGIN

                                          ...

                                    

                                    END;

3.调用存储过程:call proName();

4.删除存储过程:drop procedure proName();

5.块、条件、循环:块   begin                                area_label:begin

                                      ......                                        .......

                                end                                    end area_label

 

                          条件    if  condition  then            if  condition  then

                                        ......                                    .......

                                    end                                 else

                                                                                  .......

                                                                           end  if

                                 

                         循环

                          [label]while expression do                repeat                                 loop_label:loop

 

                              .......                                                    .......                                   ........

                          end while[label]                                 until  expression                    if expression then

                                                                                    end repeat                                  leave loop_label;

                                                                                                                                   end if;

                                                                                                                                end loop;

 典型事例:

 

CREATE PROCEDURE p21 
(IN parameter_1 INT, OUT parameter_2 INT) 
LANGUAGE SQL DETERMINISTIC SQL SECURITY INVOKER 
BEGIN 
  DECLARE v INT; 
  label goto_label; start_label: LOOP 
    IF v = v THEN LEAVE start_label; 
    ELSE ITERATE start_label; 
    END IF; 
  END LOOP start_label; 
  REPEAT 
    WHILE 1 = 0 DO BEGIN END; 
    END WHILE; 
    UNTIL v = v END REPEAT; 
  GOTO goto_label; 
END;// 
 

6.异常处理:

申明异常的结构

DECLARE 
{ EXIT | CONTINUE } 
HANDLER FOR 
{ error-number | { SQLSTATE error-string } | condition } 
SQL statement 

 

例1:Sample Problem: Log Of Errors 
 
 CREATE PROCEDURE p22 (parameter1 INT) 
 BEGIN 
  DECLARE EXIT HANDLER FOR 1216 
    INSERT INTO error_log VALUES 
    (CONCAT('Time: ',current_date, 
     '. Foreign Key Reference Failure For 
 Value = ',parameter1)); 
   INSERT INTO t3 VALUES (parameter1); 
 END;//

 

 例2:DECLARE CONTINUE HANDLER example  CONTINUE
 
CREATE TABLE t4 (s1 int,primary key(s1));// 
CREATE PROCEDURE p23 () 
BEGIN 
 DECLARE CONTINUE HANDLER 
 FOR  SQLSTATE '23000' SET @x2 = 1; 
 SET @x = 1; 
 INSERT INTO t4 VALUES (1); 
 SET @x = 2; 
 INSERT INTO t4 VALUES (1); 
 SET @x = 3; 
 END;// 

 

例3:DECLARE CONDITION 
 
 CREATE PROCEDURE p24 () 
 BEGIN 
  DECLARE `Constraint Violation` 
   CONDITION FOR SQLSTATE '23000'; 
  DECLARE EXIT HANDLER FOR 
   `Constraint Violation` ROLLBACK; 
  START TRANSACTION; 
  INSERT INTO t2 VALUES (1); 
  INSERT INTO t2 VALUES (1); 
  COMMIT; 
  END; // 

例4:DECLARE CONDITION 
 
 mysql> CREATE PROCEDURE p9 () 
    -> BEGIN 
    ->   DECLARE EXIT HANDLER FOR NOT FOUND BEGIN END; 
    ->   DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN END; 
    ->   DECLARE EXIT HANDLER FOR SQLWARNING BEGIN END; 
    -> END;// 

 

7.游标:游标可以接受查询结果集,并且只可以逐步取出

 CREATE PROCEDURE p25 (OUT return_val INT) 
 BEGIN 
  DECLARE a,b INT; 
  DECLARE cur_1 CURSOR FOR SELECT s1 FROM t; 
  DECLARE CONTINUE HANDLER FOR NOT FOUND 
    SET b = 1; 
  OPEN cur_1; 
  REPEAT 
    FETCH cur_1 INTO a; 
    UNTIL b = 1 
  END REPEAT; 
  CLOSE cur_1; 
  SET return_val = a; 
 END;//   

 

8.函数:函数不可以进行数据操作,只可以用来进行设置变量。

 CREATE FUNCTION factorial (n DECIMAL(3,0)) 
    RETURNS DECIMAL(20,0) 
    DETERMINISTIC 
  BEGIN 
    DECLARE factorial DECIMAL(20,0) DEFAULT 1; 
    DECLARE counter   DECIMAL(3,0); 
    SET counter = n; 
    factorial_loop: REPEAT 
      SET factorial = factorial * counter; 
      SET counter = counter - 1; 
    UNTIL counter = 1 
    END REPEAT; 
    RETURN factorial; 
  END // 

 9.Privileges Invokers and Definers 特权的调用者和定义者
 
CREATE PROCEDURE p26 () 
  SQL SECURITY INVOKER 
  SELECT COUNT(*) FROM t // 
CREATE PROCEDURE p27 () 
  SQL SECURITY DEFINER 
  SELECT COUNT(*) FROM t // 
GRANT INSERT ON db5.* TO peter; //  

以peter用户身份登录
 
mysql> CALL p26(); 
ERROR 1142 (42000): select command denied to user 
 'peter'@'localhost' for table 't' 
 
mysql> CALL p27(); 
+----------+ 
| COUNT(*) | 
+----------+ 
|        1 | 
+----------+ 
1 row in set (0.00 sec) 

算术运算符

+     加   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) //分

                        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值