• mysql存储过程


    -->存储过程简介:sql语句需要先编译后执行,而存储过程是完成一组特定功能的sql语句集,经编译后存储在数据库中,用户通过执行存储过程名并给定参数(如果存储过程带有参数)来调用它。

                                  存储过程是可编程的函数,在数据库中创建并保存,可以由sql语句和控制结构组成。当想要在不同应用程序和平台上执行相同函数,或者封装特定功能,存储过程是非常有用的。

                                 数据库中的存储过程是对编程中的面向对象方法的模拟,它允许控制数据库的访问方式。

    存储过程的优点:

    (1).增强SQL语言的功能和灵活性:存储过程可以用控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

    (2).标准组件式编程:存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。

    (3).较快的执行速度:如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。

    (4).减少网络流量:针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织进存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大减少网络流量并降低了网络负载。

    (5).作为一种安全机制来充分利用:通过对执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。

    mysql存储过程的创建:

    语法:

    创建示例:

    ->当参数为out 时

    delimiter //

       create procedure myProc(out  s int)

         begin

             select count(*)  into s from consumer;

         end

        //

    delimiter;

    调用示例:

    call  myProc(@s)    当参数为out时,调用也需要传入参数,只不过传入的为变量,调用时这个变量名可以任意写

    ->当参数为  int ,out   时

    delimiter //

       create procedure myProc1(in  id  int ,out num_name int  )

        begin

          select  num into  num_name from consumer  where address=id; 

       end

    //

    delimiter;

    ->调用  call myProc1(1,@n)   调用时,这个变量名可以任意写

    ->当参数为 in 时

    delimiter //

       create procedure myProc2(in id int)

       begin

       select num from consumer where address=id;

       end

    //

    delimiter ;

    变量名:

       declare  变量名1,变量名2.........

    变量赋值:

      set  变量名=变量值   ,变量名1=变量值1,变量名2=变量值2........

    用户变量以@开头

    set @y='hello world';

    concat   用于字符串的连接

    delimiter //

     create procedure greetingWorld()

     begin

      select  concat(@greeting,'world');

      set  @greeting='hello';

    end

    //

    delimiter;

    调用方式: call greetingWorld()

    变量作用域

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

    #变量作用域
    DELIMITER //
    CREATE PROCEDURE proc()
    BEGIN
    DECLARE x1 VARCHAR(5) DEFAULT 'outer';
    BEGIN
    DECLARE x1 VARCHAR(5) DEFAULT 'inner';
    SELECT x1;
    END;
    SELECT x1;
    END;
    //
    DELIMITER ;
    #调用
    CALL proc();

    条件语句

    IF-THEN-ELSE语句

    #条件语句IF-THEN-ELSE
    DROP PROCEDURE IF EXISTS proc3;
    DELIMITER //
    CREATE PROCEDURE proc3(IN parameter int)
    BEGIN
    DECLARE var int;
    SET var=parameter+1;
    IF var=0 THEN
    INSERT INTO t VALUES (17);
    END IF ;
    IF parameter=0 THEN
    UPDATE t SET s1=s1+1;
    ELSE
    UPDATE t SET s1=s1+2;
    END IF ;
    END ;
    //
    DELIMITER ;

    CASE-WHEN-THEN-ELSE语句

    #CASE-WHEN-THEN-ELSE语句
    DELIMITER //
    CREATE PROCEDURE proc4 (IN parameter INT)
    BEGIN
    DECLARE var INT;
    SET var=parameter+1;
    CASE var
    WHEN 0 THEN
    INSERT INTO t VALUES (17);
    WHEN 1 THEN
    INSERT INTO t VALUES (18);
    ELSE
    INSERT INTO t VALUES (19);
    END CASE ;
    END ;
    //
    DELIMITER ;
     
    循环语句
    WHILE-DO…END-WHILE
    DELIMITER //
    CREATE PROCEDURE proc5()
    BEGIN
    DECLARE var INT;
    SET var=0;
    WHILE var<6 DO
    INSERT INTO t VALUES (var);
    SET var=var+1;
    END WHILE ;
    END;
    //
    DELIMITER ;
     
    REPEAT...END REPEAT
    此语句的特点是执行操作后检查结果
    DELIMITER //
    CREATE PROCEDURE proc6 ()
    BEGIN
    DECLARE v INT;
    SET v=0;
    REPEAT
    INSERT INTO t VALUES(v);
    SET v=v+1;
    UNTIL v>=5
    END REPEAT;
    END;
    //
    DELIMITER ;
     
    LOOP...END LOOP
    DELIMITER //
    CREATE PROCEDURE proc7 ()
    BEGIN
    DECLARE v INT;
    SET v=0;
    LOOP_LABLE:LOOP
    INSERT INTO t VALUES(v);
    SET v=v+1;
    IF v >=5 THEN
    LEAVE LOOP_LABLE;
    END IF;
    END LOOP;
    END;
    //
    DELIMITER ;
     
    LABLES标号

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

    ITERATE迭代

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

    #ITERATE
    DELIMITER //
    CREATE PROCEDURE proc8()
    BEGIN
    DECLARE v INT;
    SET v=0;
    LOOP_LABLE:LOOP
    IF v=3 THEN
    SET v=v+1;
    ITERATE LOOP_LABLE;
    END IF;
    INSERT INTO t VALUES(v);
    SET v=v+1;
    IF v>=5 THEN
    LEAVE LOOP_LABLE;
    END IF;
    END LOOP;
    END;
    //
    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个字符,
    注:mysql中处理字符串时,默认第一个字符下标为1,即参数position必须大于等于1

    RIM([[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为小数位数] 注:返回类型并非均为整数,如:

    #默认变为整型值
    SELECT ROUND(1.23);
    image
    SELECT ROUND(1.56);
    image
    #设定小数位数,返回浮点型数据
    SELECT ROUND(1.567,2);
    image

     

    SIGN (number2 ) // 正数返回1,负数返回-1

     
    日期时间类

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

  • 相关阅读:
    Array的个人总结
    sublime3 的安装
    小白 安装和配置Tomcat 局域网内访问网页
    安装Axure7.0,完整教程,有验证码和汉化包
    安装 sublime2 (包括插件)
    ffmpeg
    ExecutorService
    artDialog
    交互
    刚查了,Z3795不支持EPT,即WP8开发必须的SLAT,看来只能作为简单的WINDOWS备机了
  • 原文地址:https://www.cnblogs.com/linqiuhua/p/7640726.html
Copyright © 2020-2023  润新知