1. 程式人生 > >mysql資料庫學習11-儲存過程、函式、觸發器

mysql資料庫學習11-儲存過程、函式、觸發器

儲存的程式
========================================
  * 資料庫中儲存的程式,對資料進行運算處理
  
  * 儲存過程
  * 函式
  * 觸發器
  

會話變數

========================================
  * 一次會話過程中,可以設定一些變數儲存資料
  
  * set @name='張三'
  
      * @表示回話變數
      * @@表示全域性變數,指定是系統變數
            
            set @@sql_mode='STRICT_TRANS_TABLES';
            set @@autocommit=OFF
            set sql_mode='STRICT_TRANS_TABLES';
            set autocommit=OFF

  * 顯示變數的值
      
      select @name, @a, @b, @c;
    


儲存過程

==================================================
  * 建立儲存過程
      
      delimiter // -- 設定語句的結束符號
      
      create procedure p1()
      begin
          select * from t;
      end;
      //
      
      delimiter ; -- 語句的結束符重新設定會成分號
  
  * 呼叫儲存過程
      
      call p1();
  
  * 刪除儲存過程
      
      drop procedure [if exists] p1;
  
  * 引數
      
      儲存過程的引數三種:
      in      輸入引數(預設)
      out     輸出引數
      inout   即可輸入也可輸出
      
      定義儲存過程: p2(in a int, out b int)
                        ...
                        ...
                        set b = a*2;
      
      呼叫 p2():
            
            call p2(255, @v1)
            select @v1;
  
  * 流程控制
      *)選擇判斷
          
          if 條件 then
              ...
          end if;
          -----------------
          if 條件 then
              ...
          else
              ...
          end if;
          ==========================
          case 
              when 條件 then ...;
              when 條件 then ...;
              when 條件 then ...;
              else ...;
          end case;
      
      *) 迴圈
          
          while 條件 do
              ...
          end while;
          ---------------
          loop
              ...
          end loop;  
          ---------------
          repeat
              ...
          until 條件 end repeat; 
          ---------------
          
          leave     跳出迴圈
          iterate   直接進入下次迭代
          
          ---------------
          
          迴圈命名
              lp: loop
                  leave lp;
                  iterate lp;
              end loop;

  * declare 
        定義區域性變數
        
        *) declare a int;             -- null
        *) declare a int default 1;
  
        *) 區域性變數在 end 結束時銷燬
              
              begin
                  declare a int default 1;
                  begin
                        declare b int default 2;
                  end;
                  select a; -- ok
                  select b; -- 錯誤
              end;


函式

==================================================
  * 與儲存過程類似,
  * 函式有返回值
  * 用 select f() 呼叫函式
  
  * 建立
      
      create function f(引數) returns int
      begin
          ....
          return 計算結果;
      end;
      
        
遊標 cursor
==================================================
  * 遊標: 查詢結果的資料指標
  * 只能一步一步向下一行移動
  * 不能任意的被定位
  * 遊標操作:
        
        *)定義遊標:
          declare c cursor for select ...
        
        *)開啟遊標:
          open c;
        
        *)從遊標取一行資料(自動下移):
          -- 從遊標取出幾個欄位的資料,存入幾個變數
          fetch c into v1,v2,v3,v4;
        
        *)關閉遊標:
          close c;

  * 從頭到尾用遊標訪問資料
  
        mysql 的錯誤處理機制:
            declare continue handler for ...
            
            當出現指定錯誤(not found)時,執行一段程式碼(done=),
            使程式可以繼續正常執行(continue)
        
        declare done int default 0;
        declare c cursor for select ...
        declare continue handler for not found set done=1;
        
        open c;
        while done=0 do
            -- 在末尾取不到資料,會出現 not found 錯誤
            -- 觸發 done=1 執行
            fetch c into ... 
        end while;

觸發器
=============================================
  * 對一行資料進行增刪改操作,
    可以觸發一端程式碼執行
    
  * 六種: 一張表最多就能建立6個觸發器
        before insert
        before update
        before delete
        
        after insert
        after update
        after delete
  
  * 建立觸發器
        
        create trigger 名稱 before insert 
        on tb1 for each row
        begin
            ....
        end;
  
  * 兩個隱含物件
        
        new  - 新的資料行
        old  - 舊的資料行
        
        new.id,  new.name,  new.price
        old.id,  old.name,  old.price
        
        *)插入操作
              new  - 新插入的一行資料
              old  - 沒有
        *)修改操作
              new  - 修改後的新資料
              old  - 修改前的舊資料
        *)刪除操作
              new  - 沒有
              old  - 被刪掉的資料