萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> mysql存儲過程創建與注意事項

mysql存儲過程創建與注意事項

mysql教程存儲過程創建與注意事項
第一 mysql存儲過程跟之前寫sqlserver 2005 的存儲過程有點區別;

第二,用的mysql第三方企業管理器 sqlyogent.exe 調試的時候,寫存儲過程和一般的查詢語句要分開的,我是後來才意識到的,氣得要命(可能也是用sqlserver 2005企業管理器的編輯器的習慣導致的)。 廢話少說,寫存儲過程,要注意如下幾點:

第一 要定義delimiter //,意思是用//作為一段語句的結束符(這個很重要,我寫的存儲過程語法一點也沒錯,但是,就是通不過,原來分號:;分隔符是通知mysql客戶端已經輸入完成的符號,而我的存儲過程裡邊很多都有分號;結果運行的時候,就是把我一段存儲過程分成很多段執行)

第二 如果你想我一樣“不幸”選擇了第三方mysql客戶端sqlyogent.exe ,一定要在數據庫教程目錄裡邊的存儲過程右鍵選擇新建存儲過程,然後在右邊彈出的窗口裡鍵入你的存儲過程語句,在普通查詢分析器輸入無效,這是慘痛教訓

第三,如果存儲過程的參數如果是輸入中文的話,要在定義存儲過程的後面加上character set gbk這個編碼,不然調用存儲過程使用中文參數的時候會出錯,如:

 

create  procedure countpro(out a_out int,in b_date date, in unit_name varchar(45) character set gbk)
第四,如果你的存儲過程裡邊需要模糊查詢,用到 like '%內容%' 不要在select 語句的where後邊寫'%';定義一個參數,用: set wherestr = "'%"+wherestr+"%'";拼接語句第五,最後要還原結束符:delimiter ; 為;作為語句的結束符

下面來看mysql存儲過程實例

1. 創建實例數據庫
   create database db5;
   use db5;

2.創建一個簡單的工作表,並插入數據
   create table t(s1 int);
   insert into t values(5);

3.創建程序實例 create procedure example
   create procedure p1() select * from t;
      sql語句存儲過程的第一部分是 create procedure
      第二部分是過程名:上面新存儲過程的名字是p1。
      第三部分書參數列表(),第四部分是程序的主體,“select * from t”

*****什麼樣的mysql語句在存儲過程體中是合法的?
       在存儲過程體中可以包含所有的合法sql數據庫定義語言,insert,update,delete,drop,create,replace等等語句
包括(set,commit,rollback)但是,在代碼中如果包含mysql的擴充功能,那麼代碼將不能移植。
   
4. 調用存儲過程,所需要輸入的就是call和你過程名以及一個括號。
    call p1();

5.過程中的特征子句
    create procedure p2()language sql
                         not deterministic
    sql security definer
    comment ''
     select current_date,rand() from t;

6.parameters參數
    create procedure p5()------; //參數列表是空的
    create procedure p5([in] name data-type)---- //輸入參數in可選,默認為參數為in
    create procedure p5(out name data-type)----- //輸出參數out
    create procedure p5(inout 那麼data-type)----- //即可以做輸入參數也可以做輸出參數

   ----輸入參數in 例子。
       create procedure p5(p int) set @x=p;
       call p5(12345);
       select @x;

   ----輸出參數out 例子
       create procedure p6(out p int)set p=-5;
       call p6(@y);
       select @y;

7. 復合語句:如果你的過程中有多條語句,那麼你需要begin/end塊。在這裡你可以進行變量的定義和流程的控制
       首先執行命令 delimiter //
       create procedure p7()
           begin
              set  @a=6;
       set  @b=5;
       insert into t values (@a);
       select s1 * @a from t where s1>= @b;
    end;//

   -----在復合語句中申明變量
       create procedure p8()
            begin
       declare a int;
       declare b int;
       set a=5;
       set b=5;
       insert into t values (a);
       select s1*a from t where s1>=b;
            end;//

       含有default默認語句舌設定語句的例子
       create procedure p9()
       begin
          declare a ,b int default 5;
   insert into t values(a);
   select s1*a from t where s1>=b;
       end;//

8. scope作用域的問題:內部的變量在其作用域范圍內享有更高的優先權,當執行到end
        變量時,內部變量消失,此時已經在其作用域外,變量不再可見了,應為在存儲
 過程外再也不能找到這個申明的變量,但是你可以通過out參數或者將其值指派
 給會話變量來保存其值。
   create procedure p11()
   begin
      declare x1 char(5) default 'outer';
      begin
        declare x1 char(5) default 'inner';
 select x1;
      end;
      select x1;
   end;//
  
/*********************************  存儲過程中的條件式語句  ***************************************/

1. if-then -else語句
    create procedure p12(in parameter int)
    begin
      declare var int;
      set var=parameter+1;
      if var=0 then
        insert into t values(17);
      end if;
      if parameter=0 then
        update t set s1=s1+1;
      else
        update t set s1=s1+2;
      end if;
    end;//

2. case指令:如果需要進行更多條件真假的判斷我們可以使用case語句
   create procedure p13(in parameter int)
    begin
       declare var int;
       set var=parameter+1;
       case var
         when 0 then insert into t values(17);
  when 1 then insert into t values(18);
  else insert into t values(19);
       end case;
    end;//

/*****************************  循環語句  ************************************/
1. while ···· end while; 循環語句
  create procedure p14()
   begin
     declare var int;
     set var=0;
     while var<6 do
        insert into t values(var);
 set var=var+1;
     end while;
   end;//

2. repeat···· end repeat ;它在執行操作後檢查結果,而while則是執行前進行檢查
  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;//

3. loop ·····end loop; loop 循環不需要初始條件,這點和while 循環相似,同時和repeat
       循環一樣不需要結束條件, leave語句的意義是離開循環,
  create procedure p16()
   begin
      declare v int;
      set v=0;
      loop_lable:loop
         insert into t values(v);
  set v=v+1;
  if v >=5 then
     leave loop_lable;
  end if;
      end loop;
   end;//

4. lables 標號:標號可以用在begin repeat while 或者loop 語句前,語句標號只能在
      合法的語句前面使用。可以跳出循環,使運行指令達到復合語句的最後一步。

/*****************************  iterate迭代  ***************************************/

1. iterate:通過引用復合語句的標號,來從新開始復合語句
    create procedure p20()
      begin
        declare v int;
 set v=0;
 loop_lable:loop
          if v=3 then
      set v=v+1;
      iterate loop_lable;
   end if;
   insert into t values(v);
   set v=v+1;
   if v>=5 then
     leave loop_lable;
   end if;
 end loop;
      end;//

copyright © 萬盛學電腦網 all rights reserved