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);
相關文章
相關標籤/搜索