mysql的存儲過程語法
mysql存儲過程的基本用法有哪些
在外部程序訪問資料庫時(例如 PHP),要組織很多 SQL 語句。 
特別是業務邏輯復雜的時候,一大堆的 SQL 和條件夾雜在 PHP 代碼中,讓人不寒而慄。現在有了 MySQL 存儲過程,業務邏輯可以封裝存儲過程中,這樣不僅容易維護,而且執行效率也高。 
一、MySQL 創建存儲過程 
"pr_add" 是個簡單的 MySQL 存儲過程,這個MySQL 存儲過程有兩個 int 類型的輸入參數 "a"、"b",返回這兩個參數的和。 
復制代碼 代碼如下: 
drop procere if exists pr_add; 
 
計算兩個數之和 
復制代碼 代碼如下: 
create procere pr_add 
( 
a int, 
b int 
) 
begin 
declare c int; 
if a is null then 
set a = 0; 
end if; 
if b is null then 
set b = 0; 
end if; 
set c = a + b; 
select c as sum; 
/* 
return c; 
不能在 MySQL 存儲過程中使用。return 只能出現在函數中。 
*/ 
end; 
 
二、調用 MySQL 存儲過程 
復制代碼 代碼如下: 
call pr_add(10, 20); 
 
執行 MySQL 存儲過程,存儲過程參數為 MySQL 用戶變數。 
復制代碼 代碼如下: 
set @a = 10; 
set @b = 20; 
call pr_add(@a, @b); 
 
三、MySQL 存儲過程特點 
創建 MySQL 存儲過程的簡單語法為: 
復制代碼 代碼如下: 
create procere 存儲過程名字() 
( 
[in|out|inout] 參數 datatype 
) 
begin 
MySQL 語句; 
end; 
 
MySQL 存儲過程參數如果不顯式指定"in"、"out"、"inout",則默認為"in"。習慣上,對於是"in" 的參數,我們都不會顯式指定。 
1. MySQL 存儲過程名字後面的"()"是必須的,即使沒有一個參數,也需要"()" 
2. MySQL 存儲過程參數,不能在參數名稱前加"@",如:"@a int"。下面的創建存儲過程語法在 MySQL 中是錯誤的(在 SQL Server 中是正確的)。 MySQL 存儲過程中的變數,不需要在變數名字前加"@",雖然 MySQL 客戶端用戶變數要加個"@"。 
復制代碼 代碼如下: 
create procere pr_add 
( 
@a int, -- 錯誤 
b int -- 正確 
) 
 
3. MySQL 存儲過程的參數不能指定默認值。 
4. MySQL 存儲過程不需要在 procere body 前面加 "as"。而 SQL Server 存儲過程必須加 "as" 關鍵字。 
復制代碼 代碼如下: 
create procere pr_add 
( 
a int, 
b int 
) 
as -- 錯誤,MySQL 不需要 "as" 
begin 
mysql statement ...; 
end; 
 
5. 如果 MySQL 存儲過程中包含多條 MySQL 語句,則需要 begin end 關鍵字。 
復制代碼 代碼如下: 
create procere pr_add 
( 
a int, 
b int 
) 
begin 
mysql statement 1 ...; 
mysql statement 2 ...; 
end; 
 
6. MySQL 存儲過程中的每條語句的末尾,都要加上分號 ";" 
復制代碼 代碼如下: 
... 
declare c int; 
if a is null then 
set a = 0; 
end if; 
... 
end; 
 
7. MySQL 存儲過程中的注釋。 
復制代碼 代碼如下: 
/* 
這是個 
多行 MySQL 注釋。 
*/ 
declare c int; -- 這是單行 MySQL 注釋 (注意 -- 後至少要有一個空格) 
if a is null then # 這也是個單行 MySQL 注釋 
set a = 0; 
end if;
❷ mysql資料庫存儲過程怎麼寫
創建存儲過程
mysql> delimiter $ -- delimiter $是設置 $為命令終止符號,代替默認的分號,因為分號有其他用處.
mysql> create procere sp_test(IN pi_id int, OUT po_name varchar(10))
-> begin
-> select * from test.tb_test;
-> select tb_test.name into po_name from test.tb_test where tb_test.id = pi_id;
-> end
-> $
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ; -- 恢復分號作為分隔終止符號
5.調用存儲過程
mysql> set    @po_name='';
Query OK, 0 rows affected (0.00 sec)
mysql> call   sp_test(1,@po_name);
❸ mysql 存儲過程
1. exec 存儲過程名 
2. exec 存儲過程名 參數1,參數2,參數3...... 
 或者exec 存儲過程名 參數1='',參數2='',參數3=''......
❹ mysql怎麼執行一個存儲過程
給你個例子
drop procere if exists call proc_temp;
delimiter $ //存儲過程從$ 開始
create procere proc_temp(
IN startDate VARCHAR(20),//設置傳入的變數,沒有可以不要傳
IN endDate VARCHAR(20))
BEGIN
DECLARE dflag INT(11); //這里可以定義你需要的僅在存儲過程里使用的變數
SET dflag = 0;//初始化
select * from table where time between startDate and endDate ;//你的sql語句,可以一句可以多句
END $//存儲過程從$ 結束
delimiter ;
當上面的選中運行後沒問題,可以選中下面的call xx 運行,上面的代碼沒有改動的話只需要運行一次
call proc_temp("2017-07-05","2017-08-05")
❺ 如何創建MySQL存儲過程可以返回一個表類型的數據
如何創建MySQL存儲過程可以返回一個表類型的數據
首先需要知道「另一個存儲過程」的結果集的所有列的類型。 
假設「另一個存儲過程」的名字是sp1,沒有參數,返回的結果集共3列,全部為int型,那麼「存儲過程」里添加一個與結果集列數相同的臨時表或表變數用於接收「另一個存儲過程」的結果集
如下
CREATE PROCEDURE sp2
AS
DECLARE @t table(a int,b int,c int)
INSERT INTO @t(a,b,c)
EXEC sp1
SELECT * FROM @t
使用SQLSERVER存儲過程可以很大的提高程序運行速度,簡化編程維護難度,現已得到廣泛應用。
創建存儲過程
和數據表一樣,在使用之前需要創建存儲過程,它的簡明語法是: 
引用: 
Create PROC 存儲過程名稱
[參數列表(多個以「,」分隔)] 
AS 
SQL 語句 
例: 
引用: 
Create PROC upGetUserName 
@intUserId        INT, 
@ostrUserName NVARCHAR(20) OUTPUT                -- 要輸出的參數 
AS 
BEGIN
-- 將uName的值賦給 @ostrUserName 變數,即要輸出的參數
Select @ostrUserName=uName FROM uUser Where uId=@intUserId 
END 
其中 Create PROC 語句(完整語句為Create PROCEDURE)的意思就是告訴SQL SERVER,現在需要建立一個存儲過程,upGetUserName 就是存儲過程名稱,@intUserId 和 @ostrUserName 分別是該存儲過程的兩個參數,注意,在SQL SERVER中,所有用戶定義的變數都以「@」開頭,OUTPUT關鍵字表示這個參數是用來輸出的,AS之後就是存儲過程內容了。只要將以上代碼在「查詢分析器」里執行一次,SQL SERVER就會在當前資料庫中創建一個名為「upGetUserName」的存儲過程。你可以打開「企業管理器」,選擇當前操作的資料庫,然後在左邊的樹型列表中選擇「存儲過程」,此時就可以在右邊的列表中看到你剛剛創建的存儲過程了(如果沒有,刷新一下即可)。 
二、存儲過程的調用 
之前已經創建了一個名為「upGetUserName」的存儲過程,從字面理解該存儲過程的功能是用來取得某一個用戶的名稱。存儲過程建立好了,接下來就是要在應用程序里調用了,下面看一下在ASP程序里的調用。
❻ mysql 存儲過程
你應該在做統計吧,估計你不會的就是mysql存儲過程的語法 我之前也寫過 很是郁悶 我給你一段代碼 是我用mysql寫過的一個存儲過程 你看看 主要是了解裡面的語法  看懂了 你所說的需求並不難 
有看不懂的地方一起討論 :
begin
declare tikk datetime ; 
declare done int default 0; 
declare userid int default 0; 
declare moleid int default 0; 
declare couid int default 0;
declare mname varchar(255) ; 
declare opsid int default 0; 
declare c1 cursor for Select I_userID,I_operationID from space_operation_record where status<>0 group by I_userID,I_operationID order by createtime desc;
declare continue handler for sqlstate '02000' set done =1;
set tikk = now();
open c1;
repeat
 fetch c1 into userid, opsid;
 if not done then
 select I_moleID from space_operation where status<>0 and ID=opsid into moleid;
 if moleid <> '' then 
   select Nvc_identification from space_operation where status<>0 and ID=opsid into @identiftion;
   if moleid > 0 then
    Select Nvc_ename from space_mole where status<>0 and ID=moleid into mname;
  else
     set mname = 'space';
  end if;   
   create temporary table if not exists sp_tab1(id bigint(20),Nvc_content MEDIUMTEXT,I_obyuID bigint(20),I_tID bigint(20),createtime datetime);
    INSERT INTO sp_tab1 Select ID,Nvc_content,I_objectID,I_tmID,createtime from space_operation_record where status<>0 and I_operationID=opsid and I_userID=userid ;
    select count(*) from sp_tab1 into couid;
    
    set @ihod = 0;
    set @listp = '';
    set @listpp = '';
    set @content0p = '';
    set @content0 = '';
     while couid > 0 do
     select ID,Nvc_content,I_obyuID,createtime,I_tID into @iok,@conuiy,@objiplk,@crtimhr,@tmids from sp_tab1 where ID > @ihod order by ID asc limit 0,1;
       if @iok <> '' then
      if mname = 'blog' then
        INSERT INTO space_operation_stat(I_operationID,I_userID,Nvc_content,D_stattime,createtime) VALUES (@iok,userid,@conuiy,@crtimhr,tikk);
      elseif mname = 'team' then
        if(@identiftion = 'addblog' || @identiftion = 'mdyblog') then
          INSERT INTO space_operation_stat(I_operationID,I_userID,Nvc_content,D_stattime,I_tmID,createtime) VALUES (@iok,userid,@conuiy,@crtimhr,@tmids,tikk);
        else
           set  @listpp   = CONCAT(@listpp,CONCAT(@objiplk,','));
        set  @operarry1p = substring_index(@conuiy,'|',1);
        set  @operarry2p = substring_index(@conuiy,'|',-1);
        set  @content0p  = CONCAT(@content0p,CONCAT(@operarry2p,SPACE(1)));
        set  @objlistp   = substring(@listpp,1,length(@listpp)-1);  
        end if;
       elseif mname = 'space' then
        if(@identiftion = 'headphoto' || @identiftion = 'status') then
          INSERT INTO space_operation_stat(I_operationID,I_userID,Nvc_content,D_stattime,I_tmID,createtime) VALUES (@iok,userid,@conuiy,@crtimhr,@tmids,tikk);
        else
           set  @listppr   = CONCAT(@listppr,CONCAT(@objiplk,','));
        set  @operarry1pr = substring_index(@conuiy,'|',1);
        set  @operarry2pr = substring_index(@conuiy,'|',-1);
        set  @content0pr  = CONCAT(@content0pr,CONCAT(@operarry2pr,SPACE(1)));
        set  @objlistpr   = substring(@listppr,1,length(@listppr)-1);  
        end if;   
      else
        set @listp   = CONCAT(@listp,CONCAT(@objiplk,','));
     set  @operarry1 = substring_index(@conuiy,'|',1);
     set  @operarry2 = substring_index(@conuiy,'|',-1);
     set  @content0  = CONCAT(@content0,CONCAT(@operarry2,SPACE(1)));
     set  @objlist   = substring(@listp,1,length(@listp)-1);  
      end if;
       set @ihod = @iok;
     end if;
     set couid = couid -1;
    end while;
if @content0 <> '' then
        set @contentp  = CONCAT(@operarry1,concat('|',@content0));
      Select createtime,ID into @uitimej,@IDjok from space_operation_record where status<>0 and I_operationID=opsid order by createtime desc limit 0,1;
        if @uitimej <> '' then
          INSERT INTO space_operation_stat(I_operationID,I_userID,Nvc_content,D_stattime,createtime,Nvc_objlist) VALUES(@iok,userid,@contentp,@crtimhr,tikk,@objlist);
        end if;
   end if;
     if @content0p <> '' then
              if @identiftion = 'addphoto' then
                 set @contentp  = CONCAT(@operarry1p,CONCAT('|',@content0p));
              else
                set @contentp  = CONCAT(@operarry1p,CONCAT(@content0p,'|'));
              end if;
              
         Select createtime,ID into @uitimej,@IDjok from space_operation_record where status<>0 and I_operationID=opsid order by createtime desc limit 0,1;
          if @uitimej <> '' then
           INSERT INTO space_operation_stat(I_operationID,I_userID,Nvc_content,D_stattime,createtime,Nvc_objlist,I_tmID) VALUES(@iok,userid,@contentp,@crtimhr,tikk,@objlistp,@tmids);
         end if;
  end if;
  if @content0pr <> '' then
         set @contentp  = CONCAT(@operarry1p,concat('|',@content0pr));
         Select createtime,ID into @uitimej,@IDjok from space_operation_record where status<>0 and I_operationID=opsid order by createtime desc limit 0,1;
          if @uitimej <> '' then
           INSERT INTO space_operation_stat(I_operationID,I_userID,Nvc_content,D_stattime,createtime,Nvc_objlist,I_tmID) VALUES(@iok,userid,@contentp,@crtimhr,tikk,@objlistp,@tmids);
         end if;
  end if;
  delete from sp_tab1; 
 end if;
 end if;
until done end repeat;
close c1;
drop temporary table if exists sp_tab1 ;
UPDATE space_operation_play SET status=0;
UPDATE space_operation_display SET status=0;
Select createtime into @ptimes from space_operation_stat where status<>0 order by createtime desc limit 0,1;
if @ptimes <>'' then
 create temporary table if not exists sp_tab2(id bigint(20),Nvc_content MEDIUMTEXT,I_userID bigint(20),I_lyuID bigint(20),D_stattime datetime);
 INSERT INTO sp_tab2 Select ID,Nvc_content,I_userID,I_tmID,D_stattime from space_operation_stat where status<>0 and createtime=@ptimes  order by D_stattime desc limit 0,30;
 select count(*) from sp_tab2 into @cou1id;
 set @uoj = 0;
 while @cou1id > 0 do
   select ID,Nvc_content,I_userID,D_stattime,I_lyuID into @io1k,@conui1y,@objipl1k,@crtimh1r,@unlpa from sp_tab2 where ID > @uoj order by ID asc limit 0,1;
   if @io1k <> '' then 
    INSERT INTO space_operation_play(I_statID,Nvc_content,D_stattime,I_userID,Createtime,I_tmID) VALUES (@io1k,@conui1y,@crtimh1r,@objipl1k,now(),@unlpa);
    set @uoj = @io1k;
   end if;
   set @cou1id = @cou1id -1;
 end while; 
 drop temporary table if exists sp_tab2 ;  
end if;
end
❼ MySql編寫一個存儲過程
1、delimiter // ,聲明分隔符:DELIMITER是分割符的意思,因為MySQL默認以";"為分隔符,如果我們沒有聲明分割符,那麼編譯器會把存儲過程當成SQL語句進行處理,則存儲過程的編譯過程會報錯,所以要事先用DELIMITER關鍵字申明當前段分隔符,這樣MySQL才會將";"當做存儲過程中的代碼,不會執行這些代碼(這里如果不懂的話,你可以通過試錯的方法來理解)。
2、編寫存儲過程的格式:CREATE PROCEDURE([[IN |OUT |INOUT ]參數名數據類形...])
例子:
1)create procere proc1(out s int)  // 只有輸出
2)create procere proc2(in p_in bigint)  // 只有輸入
3)create procere proc15() // 沒有輸入與輸出
4)create procere demo_multi_param(in id bigint,in name varchar(32),out c int) //多輸入與輸出
3、過程體的開始與結束使用BEGIN與END進行標識。
4、select count (*) into s from student; // 過程體,一系列的邏輯語句,sql語句
5、delimiter ; 用完了之後要把分隔符還原。
❽ mysql 存儲過程總結(二)if語句、參數
1、if :用於做條件判斷,具體的語法結構為:
  
 在if條件判斷的結構中,ELSE IF 結構可以有多個,也可以沒有。 ELSE結構可以有,也可以沒有。
  
 案列:
  
 根據定義的分數score變數,判定當前分數對應的分數等級。
  
  score >= 90分,等級為優秀。
  
  score >= 80分,等級為良好
  
 score >= 60分,等級為及格
  
 score < 60分,等級為不及格。
  
 上述的需求我們雖然已經實現了,但是也存在一些問題,比如:score 分數我們是在存儲過程中定義 死的,而且最終計算出來的分數等級,我們也僅僅是最終查詢展示出來而已。 
  
 那麼我們能不能,把score分數動態的傳遞進來,計算出來的分數等級是否可以作為返回值返回呢? 答案是肯定的,我們可以通過接下來所講解的 參數 來解決上述的問題。
  
 2、參數的類型
  
 主要分為以下三種:IN、OUT、INOUT。 具體的含義如下:
  
 (1)in :該類參數作為輸入,也就是需要調用時傳入值 默認
  
 (2)out:該類參數作為輸出,也就是該參數可以作為返回值
  
 (3)inout:既可以作為輸入參數,也可以作為輸出參數
  
 用法:
  
 案例一:
  
 案列二:
