1. 程式人生 > >儲存過程(1)----開篇

儲存過程(1)----開篇

這幾天覺得自己要研究一下儲存過程,因為覺得自己資料庫這塊,自己也要加強一下

接下介紹自己的心得,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語句逐一從遊標中獲取記錄,並賦給主變數,交由主語言進一步處理。

  遊標是處理結果集的一種機制吧,它可以定位到結果集中的某一行,多資料進行讀寫,也可以移動遊標定位到你所需要的行中進行操作資料。一般複雜的儲存過程,都會有遊標的出現,他的用處主要有:

  1. 定位到結果集中的某一行。
  2. 對當前位置的資料進行讀寫。
  3. 可以對結果集中的資料單獨操作,而不是整行執行相同的操作。
  4. 是面向集合的資料庫管理系統和麵向行的程式設計之間的橋樑。

DECLARE CS CURSOR 是宣告遊標,for後面跟一個查詢語句