• MySQL学习笔记八:存储过程与自定义函数


    一、存储过程

    1.1、delimiter

    MySQL 中有一个命令是delimiter,作用是设置命令段的结束符号,即遇到这个所设置的结束符号后,按回车,则命令段就可以执行了。通常默认情况下,命令的结束符号是分号(;),但是在存储过程中,过程体内可能会包含分号(;),因此需要将命令结束符号替换成其他的字符,如$$、//等,存储过程创建完成后,可以将命令段的结束符号重新设为分号。

    语法:delimiter 命令结束符

    1.2、存储过程示例

    1)创建:

    DELIMITER $$
    CREATE PROCEDURE SHOW_EMP01()
    BEGIN
        SELECT * FROM STUDY11;
    END$$
    DELIMITER ;

    2)调用:

    CALL SHOW_EMP01();

    1.3、查看存储过程

    1)查看所有存储过程

    SHOW PROCEDURE STATUS;

    2)查看指定数据库的存储过程

    SHOW PROCEDURE STATUS WHERE DB='test';

    3)查看指定存储过程源代码

    SHOW CREATE PROCEDURE SHOW_EMP01;

    1.4、删除存储过程

    DROP PROCEDURE SHOW_EMP01;

    1.5、声明变量

    DELIMITER $$
    CREATE PROCEDURE SHOW_EMP02()
    BEGIN
        #变量定义
        DECLARE ROWS INT DEFAULT 0;    
        #变量赋值
        SELECT COUNT(*) INTO ROWS FROM STUDY11;
        #结果返回
        SELECT ROWS;
    END$$
    DELIMITER ;

    1.6、参数

    1.6.1、IN:输入参数

    1)创建:

    DELIMITER $$
    CREATE PROCEDURE GETSEX (IN PNAME VARCHAR(12))
    BEGIN
        SELECT SEX FROM STUDY11 WHERE NAME=PNAME;
    END$$
    DELIMITER ;

    2)调用:

    CALL GETSEX ('study01');

    1.6.2、OUT:输出参数

    1)创建:

    DELIMITER $$
    CREATE PROCEDURE GETID (IN PNAME VARCHAR(12),OUT PID INT)
    BEGIN
        SELECT ID INTO PID FROM STUDY11 WHERE NAME=PNAME;
    END$$
    DELIMITER ;

    2)调用:

    CALL GETID ('study01',@PID);
    SELECT @PID;    -- 此句的完整写法是:SELECT @PID FROM DUAL;

    1.6.3、INOUT:输入输出参数

    1)创建:

    DELIMITER $$
    CREATE PROCEDURE ADDINT (INOUT PNUM INT,IN PINC INT)
    BEGIN
        SET PNUM=PNUM+PINC;
    END$$
    DELIMITER ;

    2)调用:

    SET @PNUM=10,@PINC=20;
    CALL ADDINT (@PNUM,@PINC);
    SELECT @PNUM;

    二、自定义函数

    1)创建:

    #如果开启了BIN-LOG,需要加上以下这句。
    SET GLOBAL LOG_BIN_TRUST_FUNCTION_CREATORS=TRUE;
    #随机生成一个指定个数的字符串
    DELIMITER $$
    CREATE FUNCTION RAND_STR (PLEN INT) RETURNS VARCHAR(255)
    BEGIN
        #声明一个包含52个字母的PSTR
        DECLARE PSTR VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        #记录当前是第几个
        DECLARE I INT DEFAULT 0;
        #生成结果
        DECLARE PRESULT VARCHAR(255) DEFAULT '';
        WHILE I<PLEN DO
            SET PRESULT=CONCAT(PRESULT,SUBSTRING(PSTR,CEILING(RAND()*52),1));
            SET I=I+1;
        END WHILE;
        #返回结果
        RETURN PRESULT;
    END$$
    DELIMITER ;

    可以看出,自定义函数的参数,不像存储过程那样需要IN了。

    2)调用:

    SELECT RAND_STR(6);

    说明:MySQL的自定义函数,相当于SQL Server中的标量函数,当前版本尚未支持表值函数,这也是一大功能缺陷吧。当然,想返回一个表,可以使用存储过程的方式来实现。

    三、存储过程构建千万条数据

    1)创建表:

    CREATE TABLE EMP (ID INT,NAME VARCHAR(50),AGE INT);

    2)通过存储过程调用自定义函数RAND_STR构建千万条数据:

    DELIMITER $$
    CREATE PROCEDURE INSERT_EMP (IN startNum INT,IN maxNum INT)
    BEGIN
        #声明一个变量记录当前是第几条数据
        DECLARE i INT DEFAULT 0;
        
        #默认情况是自动提交SQL(AUTOCOMMIT=1)
        SET AUTOCOMMIT=0;    -- 目的:生成完所有的插入语句后再一次性提交,提高效率。
        
        REPEAT
            SET i=i+1;
            INSERT INTO EMP (ID,`NAME`,AGE) VALUES (startNum,RAND_STR(6),CEILING(18+RAND()*30));
            SET startNum=startNum+1;
        UNTIL i=maxNum
        END REPEAT;
    
        #整体提交所有的SQL,提高效率。
        COMMIT;
    END$$
    DELIMITER ;

    3)调用:

    CALL INSERT_EMP (1,10000000);
  • 相关阅读:
    DateTime的精度小问题
    使用For XML PATH 会影响Cross Apply 返回
    一个update的小故事
    行大小计算测试
    Sql Server 2008R2 遇到了BCP导入各种中文乱码的问题
    php-fpm 启动不了 libiconv.so.2找不到
    Git使用教程
    支付宝接口使用文档说明 支付宝异步通知
    Linux(CentOs6.4)安装Git
    NGINX防御CC攻击教程
  • 原文地址:https://www.cnblogs.com/atomy/p/13636663.html
Copyright © 2020-2023  润新知