美文网首页
mysql 高级语句--存储过程(PROCEDURE)

mysql 高级语句--存储过程(PROCEDURE)

作者: 君满楼001 | 来源:发表于2017-09-21 23:52 被阅读356次

    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 关闭光标

    例子:

    相关文章

      网友评论

          本文标题:mysql 高级语句--存储过程(PROCEDURE)

          本文链接:https://www.haomeiwen.com/subject/qwrasxtx.html