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 ;