【MySQL】mysql 存储过程应用

存储过程

存储过程如同一门程序设计语言,同样包含了数据类型、流程控制、输入和输出和它自己的函数库。

存储过程优点

  • 存储过程增强了SQL语言的功能和灵活性。利用控制语句组合SQL语句,可以实现较为复杂的逻辑和计算。

  • 存储过程允许标准组件是编程。创建后可以被重复调用,类似方法。

  • 存储过程能实现较快的执行速度。存储过程是预编译的,在首次执行时优化器会对其进行分析优化,并给出存储在系统表中的执行计划,而批处理transaction-SQL语句块在执行时都要进行编译和优化,因此存储过程速度比批处理快。

  • 存储过程能过减少网络流量。

  • 存储过程可被作为一种安全机制来充分利用。通过对执行存储过程权限进行限制来实现安全性。

基本语法

  • 创建存储过程:

    DELIMITER
    CREATE PROCEDURE seq_no()
    begin
    DECLARE v_cnt int;
    DECLARE v_timestr int;
    DECLARE rowcount bigint;
    set v_timestr = DATE_FORMAT(NOW(),’%Y%m%d’);
    end
    DELIMITER;

  • 调用存储过程:

    call seq_no()

  • 删除存储过程:

    drop procedure seq_no;
    不能再一个存储构成删除另一个存储过程,只能调用另一个存储过程。

  • 显示存储过程的基本信息:

    查看所有存储过程所在的库,创建日期,修改日期,编码格式等。
    show procedure status;
    查看存储过程的创建代码
    show create procedure sp_name;

  • 查看MYSQL中的存储过程:

    1.select name from mysql.proc where db=’数据库名’;
    2.select routine_name from information_schema.routines where routine_schema=’数据库名’;
    3.show procedure status where db=’数据库名’;

  • 修改存储过程

    只需将创建时的create变为alter,添加修改的内容即可。

  • 存储过程参数定义:

    MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT
    形式如:CREATE PROCEDURE SP_demo([[IN |OUT |INOUT ] 参数名 数据类形…])

数据类型及运算符

  • 变量定义及赋值

    变量分为系统变量和用户变量,系统变量会话和全局级变量。
    MySQL数据类型:int, number,float, date, varchar(length)

    • 定义: DECLARE variable_name[,variable_name] 数据类型 [defalut_value]

    • 赋值:set variable_name = value;

    • 例如
      DECLARE v_count int;
      DECLARE v_num mumber(8,2) DEFAULT 10.02;
      DECLARE v_date date DEFAULT ‘1999-12-31’;
      DECLARE v_str varchar(10);
      set v_count = 10;
      set v_str = “hello world”;

    用户变量定义:一般都以@开头,不需定义,直接用下列两种方法赋值即可。

    • 例如
      mysql >select “hello world” into @v_str;
      mysql >select @v_str;

      mysql >set @v_num=1+2+3;
      mysql >select @v_num;

  • 运算符

    • 算术运算符
      加(+)、减(-)、乘(*)、除(/)、取整(div)、取模(%)
      set var1 = 10 div 3; 3
      set var2 = 10 % 3; 1

    • 比较运算符
      大于 1>2 False
      小于 2<1 False
      小于等于 2<=2 True
      大于等于 3>=2 True
      在两值之间 5 BETWEEN 1 AND 10 True
      不在两值之间 5 NOT BETWEEN 1 AND 10 False
      在集合中 5 IN (1,2,3,4) False
      不在集合中 5 NOT IN (1,2,3,4) True
      等于 2=3 False
      不等于 2<>3 2 !=3 True
      严格比较两个NULL值是否相等 NULL<=>NULL True
      简单模式匹配 “Guy Harrison” LIKE “Guy%” True
      正则式匹配 “Guy Harrison” REGEXP “[Gg]reg” False
      为空 0 IS NULL False
      不为空 0 IS NOT NULL True

    • 位运算符
      或( | )、与(&)、左移位(<<)、右移位(>>)、非(~)(单目运算,按位取反)

MySQL存储过程的控制语句

  • 条件语句

    • if-then -else语句
     mysql > delimiter //
     mysql > CREATE PROCEDURE sp_demo(IN param int)  
         -> begin 
         -> declare var int;  
         -> set var=param+1;  
         -> if var=0 then 
         -> insert into t values(10);  
         -> end if;  
         -> if param=0 then 
         -> update t set s1=s1+1;  
         -> else 
         -> update t set s1=s1+2;  
         -> end if;  
         -> end;  
         -> //  
     mysql > delimiter ;     
    • case语句
    mysql > DELIMITER //  
    mysql > CREATE PROCEDURE sp_demo (IN param int)  
         -> begin 
         -> declare var int;  
         -> set var = param+1;  
         -> case var  
         -> when 0 then   
         -> insert into t values(0);  
         -> when 1 then   
         -> insert into t values(1);  
         -> else   
         -> insert into t values(2);  
         -> end case;  
         -> end;  
         -> //  
    mysql > DELIMITER ; 
  • 循环结构

    • while语句

      mysql > DELIMITER //  
      mysql > CREATE PROCEDURE sp_demo()  
           -> begin 
           -> declare var int default 0;  
           -> while var<2 do  
           -> insert into t values(var);  
           -> set var=var+1;  
           -> end while;  
           -> end;  
           -> //  
      mysql > DELIMITER ;
    • repeat语句

      需要注意的是,repeat和until语句后没有分号。

      mysql > DELIMITER //  
      mysql > CREATE PROCEDURE sp_demo ()  
           -> begin   
           -> declare var int default 0; 
           -> repeat  
           -> insert into t values(v);  
           -> set var = var + 1;  
           -> until var >= 2
           -> end repeat;  
           -> end;
           -> //  
      mysql > DELIMITER ; 
    • loop语句

      leave语句的意义是离开循环。

      mysql > DELIMITER //  
      mysql > CREATE PROCEDURE proc6 ()  
           -> begin 
           -> declare var int default 0; 
           -> LOOP_LABLE:loop  
           -> insert into t values(var);  
           -> set var=var+1;  
           -> if var >=5 then 
           -> leave LOOP_LABLE;  
           -> end if;  
           -> end loop;  
           -> end;  
           -> //  
      mysql > DELIMITER ; 

附:函数库
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个字符,position第一个字符默认为1
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为返回的小数位数,返回类型并非均为整数
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 ,MINUTE ,MINUTE_SECOND,MONTH ,SECOND ,YEAR

 

posted on 2016-08-10 18:26  皮五天  阅读(120)  评论(0编辑  收藏  举报

导航