zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    Oracle 中用 update 语句更新timestamp字段的格式
    Oracle 获取本周、本月、本季、本年的第一天和最后一天
    Linux服务器下,java程序上传文件,中文名乱码或显示问号的解决办法
    Java实现 Oracle decode函数 转换为 MySQL 可用的 case when
    C# Ling to Sql 几种模糊查询
    机器学习学习笔记:sklearn.preprocessing.PolynomialFeatures偏置值inlude_bias设置,以及在Pipeline中的设置
    SQL Server更新表(用一张表的数据更新另一张表的数据)
    windows server 2012 R2里IIS配置.net core2.1遇到的坑
    combobox控件重新绑定后会出现下拉后显示值不变
    List<>使用之坑
  • 原文地址:https://www.cnblogs.com/liuxs13/p/7794765.html
Copyright © 2011-2022 走看看