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);