mysql存储过程调用自定义函数_MySQL学习笔记八:存储过程与自定义函数

一、存储过程

1.1、delimiter

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

语法:delimiter 命令结束符

ffd2bf8fe1f633fc7a3f39712aaa750a.png

1.2、存储过程示例

1)创建:

DELIMITER $$CREATE PROCEDURESHOW_EMP01()BEGIN

SELECT * FROMSTUDY11;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 PROCEDURESHOW_EMP02()BEGIN#变量定义DECLARE ROWS INT DEFAULT 0;

#变量赋值SELECT COUNT(*) INTO ROWS FROMSTUDY11;

#结果返回SELECTROWS;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个字母的PSTRDECLARE PSTR VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

#记录当前是第几个DECLARE I INT DEFAULT 0;

#生成结果DECLARE PRESULT VARCHAR(255) DEFAULT '';WHILE I

#返回结果RETURNPRESULT;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; --目的:生成完所有的插入语句后再一次性提交,提高效率。

REPEATSET i=i+1;INSERT INTO EMP (ID,`NAME`,AGE) VALUES (startNum,RAND_STR(6),CEILING(18+RAND()*30));SET startNum=startNum+1;

UNTIL i=maxNumENDREPEAT;

#整体提交所有的SQL,提高效率。COMMIT;END$$

DELIMITER ;

3)调用:

CALL INSERT_EMP (1,10000000);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值