mysql__存儲過程

1.存儲過程至關於咱們學的各類高級語言的函數,既然是函數就可能有參數,先介紹參數類型:mysql

存儲過程主要包含三種參數類型,注意我說的不是數據類型(INT、VARCHAR)sql

第一種:IN輸入參數:表示這種參數類型的值就必須由外界調用存儲過程時賦值,就意味着你在調用的時候必須傳入參數,可是像是高級語言的裏的局部變量,當存儲過程使用完畢的時候,IN類型的值隨着消失了函數

DELIMITER$$
CREATE PROCEDURE demo(IN p_in int)
BEGIN
SELECT p_in;
SET p_in=2;
SELECT p_in;
END$$oop

DELIMITER;spa

SET @P_IN=1;指針

CALL demo(@P_IN)code

select @P_OUT;  P_OUT是1!!! 值並無發生改變
it

 

ps:DELIMITER 是指定什麼是結束符,正常狀況下,咱們的SQL語句的結束符是  ;,可是存儲過程的聲明時,這個「函數」中的語句也須要 ;來表示結束,因此爲了以防產生二義性,像我寫的那樣,此時 $$ 就至關於結束符 ;io

第二種:OUT輸出參數:依我看就是省去傳參的時候的賦值操做,但卻改變了傳進來的的值(像是C語言的指針賦值),提及來彷佛有些矛盾,可是卻事實存在,直接上代碼。
DELIMITER
CREATE PROCEDURE demo_out(OUT p_out int)
BEGIN
SELECT p_out;   p_out 爲 null!!!!
SET p_out=2;
SELECT p_out;   p_out 爲2!!!!
END;
DELIMITER;ast

SET @P_OUT=9;

CALL demo_out(@P_OUT)

select @P_OUT;  P_OUT是2!!!

 

第三種:INOUT函數,簡單明瞭不用多說,就是傳值而且改變值

DELIMITER
CREATE PROCEDURE demo_inout(INOUT p_inout int)
BEGIN
SELECT p_inout;
SET p_inout=2;
SELECT p_inout;
END;
DELIMITER;
SET @p_inout=1;
CALL demo_inout(@p_inout)

ps:

存儲過程當中的變量聲明  declare 變量名字  變量的數據類型;

聲明的方式也有兩種,第一種是用select,第二種是使用SET語句;for example:

select 'Hello world' into @x;
SET @y='Goodbye Cruel world'
若是你的存儲過程只有一行的時候,那麼你徹底能夠省略那些BEGIN 或者END

FOR EXAMPLE:


CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World');  
SET @greeting='Hello';
CALL GreetWorld( );

CREATE PROCEDURE p1()   SET @last_procedure='p1';
CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@last_procedure);
CALL p1( );
CALL p2( );

2,存儲過程當中經常使用的各類語法與結構:
if_then_else語句

1.  mysql > DELIMITER   
2.  mysql > CREATE PROCEDURE proc2(IN parameter int)  
3.       -> begin
4.       -> declare var int;  
5.       -> set var=parameter+1;  
6.       -> if var=0 then
7.       -> select var;  
8.       -> end if;  
9.       -> if parameter=0 then
10.     ->   set parameter=100;
11.     -> else
12.     -> set parameter=0;  
13.     -> end if;  
14.     -> end;  
15.     -> //  
16.mysql > DELIMITER ;  
大體兩種結構
if (condition) then (注意then以後沒有;)
sql_stetament;
end if;

if(condition) then
sql_statement
else
sql_statement
end if;

CASE 語句
、1.  mysql > DELIMITER
2.  mysql > CREATE PROCEDURE proc3 (in parameter int)  
3.       -> begin
4.       -> declare var int;  
5.       -> set var=parameter+1;  
6.       -> case var  
7.       -> when 0 then   
8.       -> insert into t values(17);  
9.       -> when 1 then   
10.     -> insert into t values(18);  
11.     -> else   
12.     -> insert into t values(19);  
13.     -> end case;  
14.     -> end;  
15.     -> //  
16.mysql > DELIMITER ;
總結了下結構
case NUMBER
when number then
SQL_Statement;
when anotherNUMber then
SQL_Statement;
else
SQL_Statement;
end ease;

while語句
1.  mysql > DELIMITER //  
2.  mysql > CREATE PROCEDURE proc4()  
3.       -> begin
4.       -> declare var int;  
5.       -> set var=0;  
6.       -> while var<6 do  
7.       -> insert into t values(var);  
8.       -> set var=var+1;  
9.       -> end while;  
10.     -> end;  
11.     -> //  
12.mysql > DELIMITER ;
大體結構
while (condition) do
SQL_statement/SET_Statement
end while;

repeat語句:

與do-while循環很類似,先執行一次,而後由Until驗證條件

mysql > DELIMITER // 2. mysql > CREATE PROCEDURE proc5 () 3. -> begin 4. -> declare v int; 5. -> set v=0; 6. -> repeat 7. -> insert into t values(v); 8. -> set v=v+1; 9. -> until v>=5 10. -> end repeat; 11. -> end; 12. -> // 13.mysql > DELIMITER ;


(哈哈哈,複製一段,懶得敲了)
repeat
SQL_statement/SET_Statement
until (Condition)     
end repeat;

loop語句:開始學的時候就這個最變扭
1.  mysql > DELIMITER //  
2.  mysql > CREATE PROCEDURE proc6 ()  
3.       -> begin
4.       -> declare v int;  
5.       -> set v=0;  
6.       -> LOOP_LABLE:loop   LOOP_LABLE:標號,能夠用在合法的語句前,便於結束(leave)循環
7.       -> insert into t values(v);  
8.       -> set v=v+1;  
9.       -> if v >=5 then
10.     -> leave LOOP_LABLE;   leave跳出由LOOP_LABEL指定的loop循環  
11.     -> end if;  
12.     -> end loop;  
13.     -> end;  
14.     -> //  

 leave--break、ITERATE--continue
再複製一段,哈哈哈
 DELIMITER $$
 DROP PROCEDURE IF EXISTS LOOPLoopProc$$
 CREATE PROCEDURE LOOPLoopProc()
       BEGIN
               DECLARE x  INT;
               DECLARE str  VARCHAR(255);
               SET x = 1;
               SET str =  '';
               loop_label:  LOOP
                           IF  x > 10 THEN
                               LEAVE  loop_label; mysql 大多數是不區分大小寫的,除了你在查詢的時候使用DISTINCT
                           END  IF;
                           SET  x = x + 1;
                           IF  (x mod 2) THEN
                               ITERATE  loop_label; ITERATE  相似於高級語言中的continue語言,返回外層循環而且開始下一個                           ELSE                               SET  str = CONCAT(str,x,',');                           END  IF;               END LOOP;                   SELECT str;       END$$ DELIMITER ;

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息