MySQL 中有一个命令是delimiter,做用是设置命令段的结束符号,即遇到这个所设置的结束符号后,按回车,则命令段就能够执行了。一般默认状况下,命令的结束符号是分号(;),可是在存储过程当中,过程体内可能会包含分号(;),所以须要将命令结束符号替换成其余的字符,如$$、//等,存储过程建立完成后,能够将命令段的结束符号从新设为分号。数据库
语法:delimiter 命令结束符函数
1)建立:spa
DELIMITER $$ CREATE PROCEDURE SHOW_EMP01() BEGIN SELECT * FROM STUDY11; END$$ DELIMITER ;
2)调用:3d
CALL SHOW_EMP01();
1)查看全部存储过程code
SHOW PROCEDURE STATUS;
2)查看指定数据库的存储过程blog
SHOW PROCEDURE STATUS WHERE DB='test';
3)查看指定存储过程源代码字符串
SHOW CREATE PROCEDURE SHOW_EMP01;
DROP PROCEDURE SHOW_EMP01;
DELIMITER $$ CREATE PROCEDURE SHOW_EMP02() BEGIN #变量定义 DECLARE ROWS INT DEFAULT 0; #变量赋值 SELECT COUNT(*) INTO ROWS FROM STUDY11; #结果返回 SELECT ROWS; END$$ DELIMITER ;
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;
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);