mysql預存程序建立與注意事項

來源:互聯網
上載者:User

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;//

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.