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

1、存储过程

1.一、delimiter

MySQL 中有一个命令是delimiter,做用是设置命令段的结束符号,即遇到这个所设置的结束符号后,按回车,则命令段就能够执行了。一般默认状况下,命令的结束符号是分号(;),可是在存储过程当中,过程体内可能会包含分号(;),所以须要将命令结束符号替换成其余的字符,如$$、//等,存储过程建立完成后,能够将命令段的结束符号从新设为分号。数据库

语法:delimiter 命令结束符函数

1.二、存储过程示例

1)建立:spa

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

2)调用:3d

CALL SHOW_EMP01();

1.三、查看存储过程

1)查看全部存储过程code

SHOW PROCEDURE STATUS;

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

SHOW PROCEDURE STATUS WHERE DB='test';

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

SHOW CREATE PROCEDURE SHOW_EMP01;

1.四、删除存储过程

DROP PROCEDURE SHOW_EMP01;

1.五、声明变量

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

1.六、参数

1.6.一、IN:输入参数it

1)建立:class

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

2)调用:test

CALL GETSEX ('study01');

1.6.二、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.三、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;

2、自定义函数

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中的标量函数,当前版本还没有支持表值函数,这也是一大功能缺陷吧。固然,想返回一个表,可使用存储过程的方式来实现。

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

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);
相关文章
相关标签/搜索