【原創】Mysql存儲過程學習筆記1

1.爲什麼選擇存儲過程:
    1.1 降低網絡流量  
    1.2 處理需要檢查、循環、多語句但沒有用戶交互的重複性任務
    1.3 可移植性好,因爲與具體語言無關
2
    2.1選擇分隔符
      mysql>DELIMITER //
         不使用“;”的原因是:存儲過程中有許多語句,所以要選擇一個不容易在程序中出現的分隔符
    2.2恢復分隔符
      mysql>Delimiter ;
3  顯示存儲過程內容:
    show create procedure proc_name;
  show procedure status; ---->列出所有的存儲過程
  show function status;
  show table status;
4. 存儲體的內容可以是任意數據庫操作語句
   但不能有對例程都表操作的數據庫操作語句
5. 調用: call p1();//
-------------------------------
6. Characteristics Clauses 特徵子句
   6.1
      create procedure p2()
      Language sql                <--
      not deterministic           <--
      sql security definer        <--
      comment 'a Procedure'       <--
      select current_date,Rand() from t//
   language sql一般無用,只是指下面主本是由SQL語言所寫,但是IBM的DB2需要這句,兼容性問題。
   not deterministic(不確定性) 是傳遞給系統的信息。
                     如上面主體中含有select 語句,那返回肯定是未知的。
                     因此稱其 not deterministic
                     但Mysql內置的優化程序不會注意這個,至少現在不注意。
       sql security definer 在調用時檢查創建過程用戶的權限 。還有一個(sql security invoker)
                     如過程己經調用,則不再檢查了。
                     而(invoker)則還需要檢查!
7.Parameter 參數
    7.1 create procedure p5()...
    7.2 create procedure p5([in] name data-type)...
    7.3 create procedure p5(out name data-type)...
    7.4 create procedure p5(inout name data-type)...
8 設置一個變量 set @x=0
 in:     create procedure p5(p int) set @x=p//
      call p5(123)//
      select @x//  
 out:   create procedure p6(out p int)
       ->set p=-5//
        call p6(@y)
        select @y
 Compound Statements 複合語句:
    create procedure p7()
     begin
      set @a=5;
      set @b=5;
     insert into person values('lihua',21,'m','[email protected]')
     select name form person where age>@a*@b-10;
   end;//
9. Variables 變量
    declare a int;
    set a=5;
   變量一旦聲明,就能在任何能使用會話變量、文字、列名的地方使用
10.   不會改變的sql_mode
mysql> set sql_mode='ansi' //
mysql> create procedure p3()select'a'||'b'//
mysql> set sql_mode=''//
mysql> call p3()//
              不會改變的不會改變的不會改變的不會改變的
+------------+
| 'a' || 'b' |
+------------+
| ab           |
+------------+
這說明:MYSQL 在過程創建時會自動保持運行環境。

(3) Example with DEFAULT clause 含有DEFAULT有例子
 CREATE PROCEDURE p10 ()
BEGIN
  DECLARE a, b INT DEFAULT 5;
  INSERT INTO t VALUES (a);
  SELECT s1 * a FROM t WHERE s1 >= b;
END; //
(5) Scope作用域:
   CREATE PROCEDURE p11 ()
    結果顯示了過程能正常工作
BEGIN
 DECLARE x1 CHAR(5) DEFAULT 'outer';
 BEGIN
  DECLARE x1 CHAR(5) DEFAULT 'inner';
  SELECT x1;
  END;
 SELECT x1;
 END; //
內部高於外部
11. Conditions and IF-THEN-ELSE 條件式和IF-THEN-ELSE -end if;   (注意在endif後有分號)
12.CASE指令:
1.
drop procedure if exists p13//
CREATE PROCEDURE p13 (IN parameter1 INT)
BEGIN
   DECLARE variable1 INT;
   SET variable1 = parameter1 + 1;
   CASE variable1
    WHEN 0 THEN insert into person values('PP',11,'m','[email protected]');
    WHEN 1 THEN insert into person values('MM',22,'f','[email protected]');
    ELSE        insert into person values('ELSE',33,'el','[email protected]');
   END CASE;
END; //

13.Loops循環語句
    WHILE ... END WHILE
    LOOP ... END LOOP
    REPEAT ... END REPEAT
    GOTO
-----------------------
14.  WHILE ... END WHILE      執行前檢查結果
CREATE PROCEDURE p14 ()
BEGIN
 DECLARE v INT;
 SET v = 0;
 WHILE v < 5 DO
  INSERT INTO t VALUES (v);
  SET v = v + 1;
 END WHILE;
END; //
          
PRIME:
drop procedure if exists pro_prime2//
   create procedure pro_prime2(in num int)
    begin
      declare i,j,x,y int default 0;
      select PRI_NUM into j from prime;
      select 'count ',j;
      while i<num do
         set x=2;
         pp1:while x<=sqrt(j) do
            if j%x=0 then
               set y=1;
               leave pp1;
            else
               set x=x+1;
            end if;
         end while;
         if y=1 then
           set y=0;
         else
           set i=i+1;
           insert into prime values(j);
         end if;
           set j=j+1;
      end while;
    end;//
--------------------------------------------
15. REPEAT ... END REPEAT  執行後檢查結果,while是執行前。。。[注:UNTIL語句後面可以沒有分號]
 CREATE PROCEDURE p15 ()
BEGIN
  DECLARE v INT;
  SET v = 0;
  REPEAT
   INSERT INTO t VALUES (v);
   SET v = v + 1;
   UNTIL v >= 5
  END REPEAT;
END; //
-----------------------
16. LOOP ... END LOOP
 CREATE PROCEDURE p16 ()
BEGIN
                          過程
      我們可以看到調用
  DECLARE v INT;
  SET v = 0;
  loop_label: LOOP
    INSERT INTO t VALUES (v);
    SET v = v + 1;
    IF v >= 5 THEN                <--利用if/leave退出loop循環
      LEAVE loop_label;
    END IF;
  END LOOP;
END; //
----------------------------------------------------------------
 |  可以在begin、while、repeat、loop語句前使用標號           |
----------------------------------------------------------------
 |  也可以在語句結束時使用標號,但並不十分有用,只是         |
 |  這是良好的編程習慣。方便他人閱讀。 如:end while label1; |
----------------------------------------------------------------
ITERATE 迭代      如果目標是迭代語句的話,就必須用到leave 語句
它類似於C語言中的continue;
CREATE PROCEDURE p20 ()
BEGIN
 DECLARE v INT;
 SET v = 0;
 loop_label: LOOP
   IF v = 3 THEN
     SET v = v + 1;
     ITERATE loop_label;
     END IF;
   INSERT INTO t VALUES (v);
   SET v = v + 1;
   IF v >= 5 THEN
     LEAVE loop_label;
     END IF;
   END LOOP;
END; //
----------------------------------------
17. GOTO    [不推薦使用]
CREATE PROCEDURE p...
BEGIN
...
LABEL label_name;
...
GOTO label_name;
...
END;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章