一、存盤程序
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);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/1117.html
標籤:MySQL
上一篇:事務的本質和死鎖的原理
下一篇:MySQL學習筆記九:索引
