1. 程式人生 > >6.儲存過程和函式-mysql

6.儲存過程和函式-mysql

儲存過程和函式是在資料庫中定義一些SQL語句的集合。然後需要哪些功能的時候,直接掉用儲存過程和函式來執行已經定義好了的SQL語句,引入儲存過程和函式可以減少開發人員編寫重複的SQL。

儲存過程和函式是在MYSQL的伺服器中儲存執行的,這個SQL語句是已經編譯過了的,可以減少了客戶端服務端資料傳輸。

儲存過程

儲存過程的關鍵詞是 PROCEDURE ,和函式有些類似,也有引數

還是以這個t_book表為例,這裡建立的儲存過程功能是,得到某個類別下圖書的數量

sql語句就是,這個bt是輸入的引數 在呼叫儲存過程的時候輸入的引數

SELECT COUNT(*) from t_book where bookTypeId=bT;
儲存過程如下
delimiter &&
CREATE PROCEDURE pro_book(IN bT INT, OUT count_num INT)
	READS SQL DATA
	BEGIN
		SELECT COUNT(*) from t_book where bookTypeId=bT;
	END
	&&
delimiter;

呼叫儲存過程是用call

call pro_book(1, @a);
select @a;

得到的欄位是圖書類別為1的圖書數量


函式

mysql的函式和高階語言的函式語法差不多,有帶引數,也有return

看一個簡單的函式,按照id查詢對應的圖書名稱

delimiter &&
CREATE FUNCTION fun_book(bookId INT)
	RETURNS VARCHAR(20)
	BEGIN
		RETURN (SELECT bookName from t_book WHERE id = bookId);
	END
	&&
delimiter;

呼叫函式 直接select就可以得到資訊了

SELECT fun_book(2);

關於儲存過程和函式裡面的用法還有很多,也有if,while迴圈等操作。結合實際的例子再說

1、申請變數Declear和賦值set

這個建立儲存過程的程式碼,申請三個變數 並說明資料型別,使用set賦值,然後插入到表裡面去

//使用set給變數賦值
delimiter &&
CREATE PROCEDURE pro_user2()
        BEGIN
            DECLARE a VARCHAR(20);
            DECLARE b DECIMAL(5,2);
            DECLARE c INT;
            SET a = '計算機網路', b = 34.5, c = 7;
            INSERT INTO t_book VALUES(NULL, a,b, c);
        END
&&
delimiter;

然後直接呼叫該過程call pro_user2();

就完成一次資料的插入

這是申請變數和給變數賦值的用法。

2、遊標的使用

遊標有點想迭代器,一次可以指向一個表裡面的一行,配合迴圈使用的話,可以將一個表裡多條資料插入到另一個表裡面去。

從一個表中讀取多條資料插入到另一個表中去,配合迴圈一起使用

delimiter &&
CREATE PROCEDURE pro_user4()
		BEGIN
			DECLARE a,b VARCHAR(20);
			DECLARE done INT DEFAULT FALSE;
			DECLARE cur_t_user2 CURSOR FOR SELECT userName2,password2 from t_user2;
			OPEN cur_t_user2;
			read_loop:LOOP				
				FETCH cur_t_user2 INTO a,b;
				IF done THEN
					LEAVE read_loop;
				END IF;
				INSERT INTO t_user VALUES(NULL,a,b);
			END LOOP;
			CLOSE cur_t_user2;
		END
&&
delimiter;

沒呼叫儲存過程之前兩個表分別是這樣子:


call pro_user4();之後就應該把第二張表的所有資料插入到第一張表中去


可以理解成一個迭代器,有點相像。

3、迴圈,if分支的使用

這裡的迴圈和if的判斷和程式設計語言語法是差不多的

看一個if的用法例子 ,呼叫的時候需要傳一個引數,如果存在這樣id的記錄,就修改,如果不存在 就插入一條新的資料

//條件判斷 
delimiter &&
CREATE PROCEDURE pro_user5(IN bookId INT)
	BEGIN
			SELECT COUNT(*) INTO @num from t_user WHERE id = bookId;
			IF @num > 0 THEN UPDATE t_user SET userName = '勞資更新' WHERE id = bookId;
			ELSE
				INSERT INTO t_user VALUES(null, '插入資料','hhhhh');
			END IF;
	END
&&
delimiter;

兩個測試:



case的用法,也是屬於選擇判斷分支,類似switch case語句

//case 判斷
delimiter &&
CREATE PROCEDURE pro_user6(IN bookId INT)
	BEGIN
			SELECT COUNT(*) INTO @num from t_user WHERE id = bookId;
			CASE @num
				WHEN 1 THEN UPDATE t_user SET userName = 'case 更新' WHERE id = bookId;
				when 2 THEN INSERT INTO t_user VALUES(null, 'case 插入','case hhhh');
				ELSE INSERT INTO t_user VALUES(null, 'else case 插入', 'else hhhh');
			END CASE;
	END
&&
delimiter;

while迴圈的用法

傳入一個引數 n,給一個表裡面插入n條記錄

//while迴圈語句 有著一個迴圈就夠用了
delimiter &&
CREATE PROCEDURE pro_user10(IN totalNum INT)
	BEGIN
		WHILE totalNum > 0 DO
			INSERT INTO t_user VALUES(totalNum, '2346353', 'hhhhhhh');
			SET totalNum = totalNum - 1;
		END WHILE;
	END
&&
delimiter;

對於儲存過程和函式的用法,還是要多做練習才能熟練掌握用法,掌握基礎語法,多找一些例題練習鞏固一下最好。