儲存過程(1)----開篇
阿新 • • 發佈:2019-01-12
這幾天覺得自己要研究一下儲存過程,因為覺得自己資料庫這塊,自己也要加強一下
接下介紹自己的心得,oracle和mysql的都看過了一些,先從簡單都起步
建立一個簡單都儲存過程
DROP PROCEDURE IF EXISTS `stu_insert`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `stu_insert`()
BEGIN
declare i int;
declare m varchar(20);
set i=21;
repeat
set m ='wm';
set m = concat(m , i);
insert into Student(id,name,address,desction,age,createTime) values(i,m,m,m,i,now());
set i=i+1;
until i>23
end repeat;
END
;;
DELIMITER ;
第一句話,建表是不是很常見。儲存過程也是存放在一個地方都,這個地方oracle叫做procedures檔案下,而mysql是在函式下面。
判斷下stu_insert這個表是否存在,存在就drop。
DELIMITER oracle有沒有我不知道,mysql 是告訴mysql 我要用;;來結束一個儲存過程,因為mysql遇見;這個就結束,開始執行這個語句,所以要改掉結束語句都標誌符當然DELIMITER後面都符號你可以自己定義,;;或這$$都是可以的,也是比較常見的
當然最後要把定義的結束語;;改為; 不然接下來的執行的sql都會以;;為結尾
create 是建立 ,DEFINER是指明儲存過程是由哪個使用者定義的
PROCEDURE 是建立的儲存過程的名稱
BEGIN 和END是儲存過程的開始和結束
declare這個定義用的,變數加一個這個
set一看功能就知道他是一個賦值功能
concat 一個string和string拼接或string和int拼接就用到這個函式:如 m="hha"+123 >> m="hha123"
1.repeat進入迴圈,until處理迴圈到跳出機制,當不滿足條件就跳出迴圈
DROP PROCEDURE IF EXISTS `stu_insert`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `stu_insert`()
BEGIN
#Routine body goes here...
declare i int;
set i=0;
while i<5 do
insert into Student(id,name,address,desction,age,createTime) values(i,'wm1','wm1','wm1',i,now());
set i=i+1;
end while;
END
;;
DELIMITER ;
2. while do迴圈,當不滿足跳出迴圈
DROP PROCEDURE IF EXISTS `stu_insert3`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `stu_insert3`()
BEGIN
#Routine body goes here...
declare i int;
declare m varchar(20);
set i=21;
wmdahshuaige:loop
set m ='wm';
set m = concat(m , i);
insert into Student(id,name,address,desction,age,createTime) values(i,m,m,m,i,now());
set i=i+1;
if i>=5 then
leave wmdahshuaige;
end if;
end loop;
END
;;
DELIMITER ;
3.loop迴圈:先隨便定義一個loop當名稱,我這裡定義的是 wmdahshuaige ,然後我們選擇在這該loop裡用一個if條件來判斷是否離開迴圈
leave+自己定義的loop名稱,就是脫離迴圈
DROP PROCEDURE IF EXISTS `stu_insert4`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `stu_insert4`() -- 建立儲存過程
begin -- 開始儲存過程
declare my_id varchar(32); -- 自定義變數1
declare my_name varchar(50); -- 自定義變數2
DECLARE done INT DEFAULT FALSE; -- 自定義控制遊標迴圈變數,預設false
DECLARE My_Cursor CURSOR FOR ( SELECT id, name FROM Student limit 5); -- 定義遊標並輸入結果集
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 繫結控制變數到遊標,遊標迴圈結束自動轉true
OPEN My_Cursor; -- 開啟遊標
myLoop: LOOP -- 開始迴圈體,myLoop為自定義迴圈名,結束迴圈時用到
FETCH My_Cursor into my_id, my_name; -- 將遊標當前讀取行的資料順序賦予自定義變數12
IF done THEN -- 判斷是否繼續迴圈
LEAVE myLoop; -- 結束迴圈
END IF;
-- 自己要做的事情,在 sql 中直接使用自定義變數即可
set my_name = CONCAT(my_name,'ttt');
UPDATE Student SET name = my_name WHERE id = my_id;
COMMIT; -- 提交事務
END LOOP myLoop; -- 結束自定義迴圈體
CLOSE My_Cursor; -- 關閉遊標
END -- 結束儲存過程
;;
DELIMITER ;
遊標
遊標(cursor)是系統為使用者開設的一個數據緩衝區,存放SQL語句的執行結果。每個遊標區都有一個名字,使用者可以用SQL語句逐一從遊標中獲取記錄,並賦給主變數,交由主語言進一步處理。
遊標是處理結果集的一種機制吧,它可以定位到結果集中的某一行,多資料進行讀寫,也可以移動遊標定位到你所需要的行中進行操作資料。一般複雜的儲存過程,都會有遊標的出現,他的用處主要有:
- 定位到結果集中的某一行。
- 對當前位置的資料進行讀寫。
- 可以對結果集中的資料單獨操作,而不是整行執行相同的操作。
- 是面向集合的資料庫管理系統和麵向行的程式設計之間的橋樑。
DECLARE CS CURSOR 是宣告遊標,for後面跟一個查詢語句