1. 程式人生 > >mysql儲存過程中的三種引數型別小解

mysql儲存過程中的三種引數型別小解

mysql儲存過程語法:

mysql> delimiter //               (分割符)

mysql> create procedure 方法名(引數型別引數 引數的資料型別)

   -> begin(表示sql語句的開始)

   -> select p_in_out as p_01;           (查詢輸入引數)

   -> set  引數名 =  引數值(修改引數值)

   -> select p_in_out as p_02;           (查詢修改後的引數值)   

   -> end;(sql語句的結束)

   -> //

mysql> delimiter;                 (分割符)

引數賦值

mysql> set @設定的引數名=引數值;

檢視賦值後的所有結果

mysql> call 方法名(@賦值時的引數名);  

檢視返回值

mysql> select @賦值時的引數名;

儲存過程的語法與sql語句一樣,不區分大小寫

引數型別有三類,分別為:in(輸入引數);out(輸入輸出引數);inout(輸入輸出引數)

in(輸入引數):引數值可以在儲存過程內部指定,為預設值,在儲存過程中修改該引數的值不能被返回

如:

mysql> create procedure test_in(in p_in int)

    -> begin

    -> select p_in as p_01;

    -> set p_in=100;

    -> select p_in as p_02;

    -> end;

    -> //

Query OK, 0 rows affected

mysql> delimiter;

mysql> set @p_in=30;

Query OK, 0 rows affected

mysql> call test_in(@p_in);

+------+

| p_01 |

+------+

|   30 |

+------+

1 row in set

+------+

| p_02 |

+------+

|  100 |

+------+

1 row in set

Query OK, 0 rows affected

mysql> select @p_in as p_03;

+------+

| p_03 |

+------+

|   30 |

+------+

1 row in set

由此可看出:p_in的值在儲存過程中的改變不影響最終結果

out(輸出引數):該值不能初始化賦值,可在儲存過程內部被改變,並可返回;

如:

mysql> delimiter //

mysql> create procedure test_out(outp_out int)

   -> begin

   -> select p_out as p_01;

   -> set p_out=100;

   -> select p_out as p_02;

   -> end;

   -> //

Query OK, 0 rows affected

mysql> delimiter;

mysql> set @p_out=1000;

Query OK, 0 rows affected

mysql> call test_out(@p_out);

+------+

| p_01 |

+------+

| NULL |

+------+

1 row in set

+------+

| p_02 |

+------+

| 100 |

+------+

1 row in set

Query OK, 0 rows affected

mysql> select @p_out as p_03;

+------+

| p_03 |

+------+

| 100 |

+------+

1 row in set

由此可看出:p_out的初始化賦值沒有返回,最終返回的結果是儲存過程中引數值的修改

inout(輸入輸出引數):呼叫時指定,可被改變和返回

              如:

mysql> delimiter //

mysql> create procedure test_inout(inoutp_inout int)

   -> begin

   -> select p_inout as p_01;

   -> set p_inout=20;

   -> select p_inout as p_02;

   -> end;

   -> //

Query OK, 0 rows affected

mysql> delimiter;

mysql> set @p=10000;

Query OK, 0 rows affected

mysql> call test_inout(@p);

+-------+

| p_01 |

+-------+

| 10000 |

+-------+

1 row in set

+------+

| p_02 |

+------+

|  20 |

+------+

1 row in set

Query OK, 0 rows affected

mysql> select @p as p_03;

+------+

| p_03 |

+------+

|  20 |

+------+

1 row in set          

由此可看出:p_inout的初始化引數賦值和儲存過程中的修改引數值均被執行並返回,最終的返回結果是儲存過程的修改值