1. 程式人生 > >關於MySQL資料庫儲存過程的感想

關於MySQL資料庫儲存過程的感想

以下只是學習路上的淺薄感想,如理解有所偏差,還請有識之士指正!

一、儲存過程意義理解

    關於儲存過程,我的理解是對資料庫語言進行程式設計呼叫,就像Java程式碼類程式設計寫一個具有某種特定功能的方法去進行呼叫一樣。資料庫的儲存過程是一組相關聯的sql語句或函式,通過進行組合形成模組化,從而具有某種特定的功能。而這種儲存過程建立後會被儲存在資料庫中,被編譯,隨時可以被資料庫使用者呼叫。

    前面說過,資料庫儲存過程是一組sql語句或者函式,那麼為什麼這種儲存過程會和普通的sql DDL(資料定義語言)、DML(資料管理語言)、DQL(資料查詢語言)這類CRUD語句不同呢,因為普通的sql語句是告訴資料庫需要做什麼,而這種對資料庫儲存過程進行程式設計,是告訴資料庫引擎做什麼。就好比要求一個人10天跑完1萬公里路程,前者是我需要告訴你每天跑1000公里,10天跑完。而後者只需要輸入一個引數10天,他自己就跑完了。從而達到了你所需要的結果預期。

 一個儲存過程也可以巢狀在另一個儲存過程裡,就像Java裡的方法呼叫一樣,這種設計可能是為了提高這種模組化的(sql語句和函式組合)程式設計複用性。

二、儲存過程與單個sql語句相比較

   優點提取:

                  1、支援模組化程式設計。

     2、語句已經儲存在資料庫裡了且被解析過,以可執行格式存在。

     3、可被其他儲存過程呼叫,提高了開發的複用性。

三、語法

       CREATE   [OR REPLACE]    PROCEDURE  PROCEDURE_NAME

   //建立儲存過程

  [AGUMENT [{  IN  |  OUT  |  IN OUT }]   TYPE ,          //引數

  AGUMENT [{  IN  |  OUT  |  IN OUT }]   TYPE]  {AS}        

  PROCEDURE_BODY                     //主體內容

四、案例  {mysql建立使用者表並利用儲存過程新增10萬條隨機測試資料}

(1)建表資料

CREATE TABLE User_Hundred_Thousand(
user_id INT NOT NULL AUTO_INCREMENT,
first_name VARCHAR(20) NOT NULL,
last_name VARCHAR(20) NOT NULL,
sex VARCHAR(5) NOT NULL,
score INT NOT NULL,
copy_id INT NOT NULL,
PRIMARY KEY (`user_id`)
);

(2)建立儲存過程

create PROCEDURE add_user(in num INT)
BEGIN
DECLARE rowid INT DEFAULT 0;
DECLARE firstname CHAR(1);
DECLARE name1 CHAR(1);
DECLARE name2 CHAR(1);
DECLARE lastname VARCHAR(3) DEFAULT '';
DECLARE sex CHAR(1);
DECLARE score CHAR(2);
WHILE rowid < num DO
SET firstname = SUBSTRING('趙錢孫李周吳鄭王林楊柳劉孫陳江阮侯鄒高彭徐',FLOOR(1+21*RAND()),1);
SET name1 = SUBSTRING('一二三四五六七八九十甲乙丙丁靜景京晶名明銘敏閔民軍君俊駿天田甜恬益依成城誠立莉力黎勵',ROUND(1+43*RAND()),1);
SET name2 = SUBSTRING('一二三四五六七八九十甲乙丙丁靜景京晶名明銘敏閔民軍君俊駿天田甜恬益依成城誠立莉力黎勵',ROUND(1+43*RAND()),1);
SET sex=FLOOR(0 + (RAND() * 2));
SET score= FLOOR(40 + (RAND() *60));
SET rowid = rowid + 1;
IF ROUND(RAND())=0 THEN
SET lastname =name1;
END IF;
IF ROUND(RAND())=1 THEN
SET lastname = CONCAT(name1,name2);
END IF;
insert INTO User_Hundred_Thousand (first_name,last_name,sex,score,copy_id) VALUES (firstname,lastname,sex,score,rowid);
END WHILE;
END ;

(3)呼叫儲存過程

call add_user(100000);