zoukankan      html  css  js  c++  java
  • mysql 总结二(自定义存储过程)

    mysql执行流程:

      sql命令---》mysql引擎-----(分析)----》语法正确-----(编译)---》可识别命令----(执行)----》执行结果---(返回)---》客户端。

    存储过程定义:

      sql语句和控制语句的预编译集合,以一个名称存储作为一个单元处理。

    最重要的优点:

      省略部分执行流程,提高执行速度

    其他优点:

      增强sql语句的功能和灵活性,减少网络流量(http只传输参数和存储函数名)。

    -------------------------------------------------我是分割线-----------------------------------------------------------------

    创建存储过程的模板:

      create

      [definer={user|current_user}]

      procedure   sp_name([proc_parameter[,...]])

      [characteristic  ...]  routine_body

      pro_parameter:

      [in|out|inout]  param_name  type

    参数:

      in:表示该参数的值必须在调用存储过程中指定;(只能进,不能返回)

      out:表示该参数的值可以被存储过程改变,并且可以返回;(能进,能返回)

      inout:表示该参数在调用时指定,并且可以被改变和返回。(能进,能被改变并能返回)

    过程体:

      过程体由合法的sql语句构成;

      过程体可以是任意sql语句;

      过程体如果为复合结构,则使用begin...end语句;

      复合结构可以包含声明,循环,控制结构;

    -------------------------------------------------我是分割线-----------------------------------------------------

    调用存储过程:

      call  sp_name([parameter  [,...]])

      call  sp_name[()]

    -------------------------------------------------我是分割线-----------------------------------------------------

    实例:

      示例一:

      CREATE PROCEDURE sp1()  SELECT VERSION();

    调用:CALL sp1();    或CALL sp1;      因为没有参数

      实例二:

      delimiter //

      CREATE PROCEDURE removerUserById( in id int )
      BEGIN
      DELETE from users WHERE id=id;
      END
      //
      delimiter ;

    调用:CALL removerUserById(3)        

    结果:所有记录都被删除掉了;    结论:参数名不能喝数据表中的字段名相同;

    -------------------------------------------------我是分割线-----------------------------------------------------

    修改存储过程模板:

      alter procedure  sp_name  [characteristic  ...]

      commit  'string'  

      |{constains sql |no sql  |reads  sql  data  |modifies sql data  |sql security{definer|invoker}  }

    过程体无法修改,只能删除存储过程,再重建;

    删除存储过程:

      drop  procedure  [if  exists]  sp_name;  

    ----------------------------------------------

    用户变量:@name;      set @t=1;      

    局部变量:begin ...end 之间声明的变量;

    ----------------------------------------------

    定义局部变量:

      DECLARE variable_name [,variable_name...] datatype [DEFAULT value];

      

    其中,datatypeMySQL的数据类型,如:int, float, date, varchar(length)

    例如:

      1. DECLARE l_int int unsigned default 4000000;  
      2. DECLARE l_numeric number(8,2) DEFAULT 9.95;  
      3. DECLARE l_date date DEFAULT '1999-12-31';  
      4. DECLARE l_datetime datetime DEFAULT '1999-12-31 23:59:59';  
      5. DECLARE l_varchar varchar(255) DEFAULT 'This will not be padded';   

    在存储过程中使用用户变量

      1. mysql > CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World');  
      2. mysql > SET @greeting='Hello';  
      3. mysql > CALL GreetWorld( );  
      4. +----------------------------+  
      5. | CONCAT(@greeting,' World') |  
      6. +----------------------------+  
      7. |  Hello World               |  
      8. +----------------------------+  

    MySQL存储过程的控制语句

    (1). 变量作用域

    内部的变量在其作用域范围内享有更高的优先权,当执行到end。变量时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储
    过程外再也不能找到这个申明的变量,但是你可以通过out参数或者将其值指派
    给会话变量来保存其值。

    1. mysql > DELIMITER //  
    2. mysql > CREATE PROCEDURE proc3()  
    3.      -> begin 
    4.      -> declare x1 varchar(5) default 'outer';  
    5.      -> begin 
    6.      -> declare x1 varchar(5) default 'inner';  
    7.      -> select x1;  
    8.      -> end;  
    9.      -> select x1;  
    10.      -> end;  
    11.      -> //  
    12. mysql > DELIMITER ;  

     

     (2). 条件语句

    . if-then -else语句

    1. mysql > DELIMITER //  
    2. mysql > CREATE PROCEDURE proc2(IN parameter int)  
    3.      -> begin 
    4.      -> declare var int;  
    5.      -> set var=parameter+1;  
    6.      -> if var=0 then 
    7.      -> insert into t values(17);  
    8.      -> end if;  
    9.      -> if parameter=0 then 
    10.      -> update t set s1=s1+1;  
    11.      -> else 
    12.      -> update t set s1=s1+2;  
    13.      -> end if;  
    14.      -> end;  
    15.      -> //  
    16. mysql > DELIMITER ;  


    . case语句: 

    1. mysql > DELIMITER //  
    2. mysql > CREATE PROCEDURE proc3 (in parameter int)  
    3.      -> begin 
    4.      -> declare var int;  
    5.      -> set var=parameter+1;  
    6.      -> case var  
    7.      -> when 0 then   
    8.      -> insert into t values(17);  
    9.      -> when 1 then   
    10.      -> insert into t values(18);  
    11.      -> else   
    12.      -> insert into t values(19);  
    13.      -> end case;  
    14.      -> end;  
    15.      -> //  
    16. mysql > DELIMITER ; 

     

    (3). 循环语句

    . while ···· end while

    1. mysql > DELIMITER //  
    2. mysql > CREATE PROCEDURE proc4()  
    3.      -> begin 
    4.      -> declare var int;  
    5.      -> set var=0;  
    6.      -> while var<6 do  
    7.      -> insert into t values(var);  
    8.      -> set var=var+1;  
    9.      -> end while;  
    10.      -> end;  
    11.      -> //  
    12. mysql > DELIMITER ; 

     

    . repeat···· end repeat

    它在执行操作后检查结果,而while则是执行前进行检查。

    1. mysql > DELIMITER //  
    2. mysql > CREATE PROCEDURE proc5 ()  
    3.      -> begin   
    4.      -> declare v int;  
    5.      -> set v=0;  
    6.      -> repeat  
    7.      -> insert into t values(v);  
    8.      -> set v=v+1;  
    9.      -> until v>=5  
    10.      -> end repeat;  
    11.      -> end;  
    12.      -> //  
    13. mysql > DELIMITER ;  


    . loop ·····end loop:

    loop循环不需要初始条件,这点和while 循环相似,同时和repeat循环一样不需要结束条件, leave语句的意义是离开循环。

    1. mysql > DELIMITER //  
    2. mysql > CREATE PROCEDURE proc6 ()  
    3.      -> begin 
    4.      -> declare v int;  
    5.      -> set v=0;  
    6.      -> LOOP_LABLE:loop  
    7.      -> insert into t values(v);  
    8.      -> set v=v+1;  
    9.      -> if v >=5 then 
    10.      -> leave LOOP_LABLE;  
    11.      -> end if;  
    12.      -> end loop;  
    13.      -> end;  
    14.      -> //  
    15. mysql > DELIMITER ;  

     

    . LABLES 标号:

    标号可以用在begin repeat while 或者loop 语句前,语句标号只能在合法的语句前面使用。可以跳出循环,使运行指令达到复合语句的最后一步。

     

    (4). ITERATE迭代

    . ITERATE:

    通过引用复合语句的标号,来从新开始复合语句

      1. mysql > DELIMITER //  
      2. mysql > CREATE PROCEDURE proc10 ()  
      3.      -> begin 
      4.      -> declare v int;  
      5.      -> set v=0;  
      6.      -> LOOP_LABLE:loop  
      7.      -> if v=3 then   
      8.      -> set v=v+1;  
      9.      -> ITERATE LOOP_LABLE;  
      10.      -> end if;  
      11.      -> insert into t values(v);  
      12.      -> set v=v+1;  
      13.      -> if v>=5 then 
      14.      -> leave LOOP_LABLE;  
      15.      -> end if;  
      16.      -> end loop;  
      17.      -> end;  
      18.      -> //  
      19. mysql > DELIMITER ; 

    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 ]) //
    strposition开始,length个字符
    ,
    注:mysql中处理字符串时,默认第一个字符下标为1,即参数position必须大于等于1
     

     

    1. mysql> select substring('abcd',0,2);  
    2. +-----------------------+  
    3. | substring('abcd',0,2) |  
    4. +-----------------------+  
    5. |                       |  
    6. +-----------------------+  
    7. 1 row in set (0.00 sec)  
    8.  
    9. mysql> select substring('abcd',1,2);  
    10. +-----------------------+  
    11. | substring('abcd',1,2) |  
    12. +-----------------------+  
    13. |     ab                |  
    14. +-----------------------+  
    15. 1 row in set (0.02 sec)  

    TRIM([[BOTH|LEADING|TRAILING] [padding] FROM]string2) //去除指定位置的指定字符
    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为小数位数]

    注:返回类型并非均为整数,如:
    (1)默认变为整形值

    1. mysql> select round(1.23);  
    2. +-------------+  
    3. | round(1.23) |  
    4. +-------------+  
    5. |           1 |  
    6. +-------------+  
    7. 1 row in set (0.00 sec)  
    8.  
    9. mysql> select round(1.56);  
    10. +-------------+  
    11. | round(1.56) |  
    12. +-------------+  
    13. |           2 |  
    14. +-------------+  
    15. 1 row in set (0.00 sec) 



    (2)
    可以设定小数位数,返回浮点型数据

    1. mysql> select round(1.567,2);  
    2. +----------------+  
    3. | round(1.567,2) |  
    4. +----------------+  
    5. |           1.57 |  
    6. +----------------+  
    7. 1 row in set (0.00 sec) 

    SIGN (number2 ) //

     

    (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) //
    开平方

  • 相关阅读:
    Session服务器配置指南与使用经验
    string和byte[]的转换 (C#)
    错误1已授予对“SqlAccess...的友元访问解决方法
    网络视频会议 二
    Editplus配置环境变量
    TSC 条码打印机 Dll 说明
    源码C#事例网址
    C#中的日志类
    分页事例 比较好的
    dotnet 网络编程 tcp
  • 原文地址:https://www.cnblogs.com/zqsky/p/5911044.html
Copyright © 2011-2022 走看看