1. 程式人生 > >MySQL 儲存過程及遊標使用

MySQL 儲存過程及遊標使用

一、儲存過程建立1.1、語法[DELIMITER $$ ]  --宣告結束符號,mysql預設;為語句結束符,這裡聲明後當儲存過程遇到$$才結束。CREATE PROCEDURE pro_name ([[ IN |OUT | INOUT ] 引數名 資料類形...])  --pro_name過程名,in、out、inout為過程引數後面例子介紹BEGIN  --過程體END[$$]1.2、建立user表資料如下1.3、引數1.3.1、IN引數  輸入引數(可做查詢條件):表示該引數的值必須在呼叫儲存過程時指定,在儲存過程中修改該引數的值不能被返回,為預設值

設定引數呼叫:
結果及解釋:a、定義userName='lisi'呼叫過程查出name為lisi的記錄。
b、過程中通過set改變userName引數的值,查詢為改變後的值。
c、過程解釋再查詢userName,結果為'lisi',及修改後變數值不會被返回。
1.3.2、OUT引數   輸出引數,用於接受返回結果(無法在呼叫時指定,其值可在儲存過程中改變,並將改變後的值返回。)
呼叫:
結果及解釋:a、定義值無法傳入,第一條查詢結果為null。
b、在過程中設值後,開始有值,且值可返回。
1.3.3、 INOUT引數  輸入輸出引數:呼叫時指定,並且可被改變和返回。(可做查詢條件也可做結果返回)
呼叫:
結果及解釋:a、傳入可直接接受
b、作為其他語句的條件直接使用
c、在過程中改變值,並返回到過程外
1.4 儲存過程刪除語法: DROP PROCEDURE IF EXISTS pro_name;二、儲存過程使用遊標2.1 簡單遊標使用例:定義如下儲存過程
呼叫: CALL test_cursor();
name為lisi的記錄已改為lisi1.2.2 多遊標及遊標巢狀使用例:定義的過程如下
DELIMITER $$
CREATE PROCEDURE test_cursor()
BEGIN 
	/*定義變數*/
	DECLARE userId Long;
	DECLARE userName VARCHAR(255);
	DECLARE userAge INT;
	-- 定義迴圈標識,預設值為 FALSE
	DECLARE done INT DEFAULT FALSE; 
	-- 定義遊標
	DECLARE My_Cursor CURSOR FOR (SELECT id,`name`,age FROM user);
	DECLARE My_Cursor2 CURSOR FOR (SELECT id,`name`,age FROM user WHERE id in(3,4));
	DECLARE My_Cursor3 CURSOR FOR (SELECT id,`name`,age FROM user WHERE id=userId);
	-- 將結束標誌繫結到遊標,若沒有資料返回,程式繼續,並將變數done設為TRUE 
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
	-- 開啟遊標
	OPEN My_Cursor;
		myLoop : LOOP
			-- 循環遊標中的資料,並賦值到變數中
			FETCH My_Cursor INTO userId,userName,userAge;
			IF done THEN
				LEAVE myLoop;
			ELSE
				IF userName='lisi' THEN
					UPDATE user SET `name`='lisi1' WHERE id=userId;
				END IF;
			END IF;
			COMMIT;
		END LOOP myLoop;
	CLOSE My_Cursor;

	-- 開始第二個遊標時先將 done 置為 FALSE
	SET done = FALSE;
	
	-- 開啟遊標
	OPEN My_Cursor2;
		myLoop2 : LOOP
			-- 循環遊標中的資料,並賦值到變數中
			FETCH My_Cursor2 INTO userId,userName,userAge;
			IF done THEN
				LEAVE myLoop2;
			ELSE
				OPEN My_Cursor3;
					myLoop3 : LOOP
						FETCH My_Cursor3 INTO userId,userName,userAge;
						IF done THEN
							LEAVE myLoop3;
						ELSE
							UPDATE user SET `name`=CONCAT(userName,'1','2') WHERE id=userId;
						END IF;
						COMMIT;
					END LOOP myLoop3;
				CLOSE My_Cursor3;
				-- 巢狀使用是內部遊標結束後給done置 FALSE
				SET done=FALSE;
			END IF;
		END LOOP myLoop2;
	CLOSE My_Cursor2;
END
$$

呼叫後的結果: