首頁 > 後端開發 > php教程 > mysql預存程序詳解以及PHP呼叫MYSQL預存程序實例

mysql預存程序詳解以及PHP呼叫MYSQL預存程序實例

不言
發布: 2023-03-25 17:32:02
原創
1714 人瀏覽過

這篇文章主要介紹了關於mysql預存程序詳解以及PHP呼叫MYSQL預存程序實例,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

mysql預存程序詳解

#1.     

##預存程序簡介我們常用的操作資料庫語言SQL

語句在執行的時候需要要先編譯,然後執行,而預​​存程序(Stored Procedure)是一組為了完成特定功能的

SQL語句集,經編譯後儲存在資料庫中,使用者透過指定預存程序的名字並給定參數(如果該預存程序帶有參數)來呼叫執行它。 一個預存程序是一個可編程的函數,它在資料庫中建立並保存。它可以有

SQL

語句和一些特殊的控制結構組成。當希望在不同的應用程式或平台上執行相同的函數,或封裝特定功能時,預存程序是非常有用的。資料庫中的預存程序可以看做是對程式設計中物件導向方法的模擬。它允許控制資料的存取方式。 預存程序通常有下列優點:

###(1).#######預存程序增強了######SQL######語言的功能和彈性。預存程序可以用流控制語句編寫,具有很強的彈性,可以完成複雜的判斷和較複雜的運算。 ##################(2).######預存程序允許標準元件是程式設計。預存程序被建立後,可以在程式中被多次調用,而不必重新編寫該預存程序的######SQL######語句。而且資料庫專業人員可以隨時對預存程序進行修改,對應用程式原始碼毫無影響。 ##########

(3).預存程序能達到較快的執行速度。如果某一操作包含大量的Transaction-SQL程式碼或分別被多次執行,那麼預存程序要比批次的執行速度快很多。因為預存程序是預編譯的。在首次運行預存程序時查詢,優化器對其進行分析優化,並且給出最終被儲存在系統表中的執行計劃。而批次的Transaction-SQL語句在每次執行時都要進行編譯和最佳化,速度相對要慢一些。

(4).預存程序能過度減少網路流量。針對同一個資料庫物件的操作(如查詢、修改),如果這一操作所涉及的Transaction-SQL語句被組織程預存過程,那麼當在客戶電腦上調用在該預存程序時,網路中傳送的只是該呼叫語句,從而大大增加了網路流量並降低了網路負載。

(5).預存程序可被當作安全機制來充分利用。系統管理員透過執行某一預存程序的權限進行限制,能夠實現對對應的資料的存取權限的限制,避免了非授權使用者對資料的訪問​​,保證了資料的安全。

2.      關於#MySQL的預存程序

預存程序是資料庫儲存的一個重要的功能,但是# MySQL5.0#以前不支援預存程序,這使得MySQL在應用程式上大打折扣。還好MySQL 5.0終於開始已經支援預存程序,這樣可以大幅提升資料庫的處理速度,同時也能提升資料庫程式設計的彈性。

3.     MySQL##儲存程序的建立

(1). 格式

##MySQL 預存程序建立的格式:CREATE PROCEDURE #過程名稱 ([程式參數


##[,...]])[特性

 ####...]### ###過程本體######## ###########這裡先舉例:###################

1

2

3

4

5

6

7

mysql> DELIMITER // 

mysql> CREATE PROCEDURE proc1(OUT s int) 

    -> BEGIN

    -> SELECT COUNT(*) INTO s FROM user; 

    -> END

    -> // 

mysql> DELIMITER ;

登入後複製
############# ####註:#################################(#####1################################################################################################## ###)這裡要注意的是######DELIMITER //######和######DELIMITER ;######兩句,######DELIMITER## #####是分割符的意思,因為######MySQL######預設以######";"######為分隔符,如果我們沒有聲明分割符,那麼編譯器會把預存程序當成######SQL######語句來處理,則預存程序的編譯過程會報錯,所以要事先用######DELIMITER### ####關鍵字申明目前段分隔符,這樣######MySQL######才會將######";"######當做預存程序中的程式碼,不會執行這些程式碼,用完了之後要把分隔符號還原。 ##########

2)預存程序依需求可能會有輸入、輸出、輸入輸出參數,這裡有一個輸出參數# s,型別是int型,如果有多個參數用","分割開。

3)過程體的開始與結束使用BEGIN END進行標識。

這樣,我們的一個MySQL預存程序就完成了,是不是很容易呢 ?看不懂也沒關係,接下來,我們詳細的講解。

(2). 宣告分割符號

其實,關於宣告分割符,上面的註解已經寫得很清楚,不需要多說,只是稍微要注意一點的是:如果是用MySQL#的Administrator管理工具時,可以直接創建,不再需要宣告。  

(3). 參數

MySQL預存程序的參數用在預存程序的定義,共有三種參數型別,IN,OUT,INOUT,形式如:

CREATE PROCEDURE([[IN |OUT |INOUT ] 參數名稱 資料類別形...])

IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值

OUT 输出参数:该值可在存储过程内部被改变,并可返回

INOUT 输入输出参数:调用时指定,并且可被改变和返回

. IN参数例子

创建:

  1. 1

    2

    3

    4

    5

    6

    7

    8

    9

    mysql > DELIMITER // 

    mysql > CREATE PROCEDURE demo_in_parameter(IN p_in int) 

    -> BEGIN

    -> SELECT p_in;  

    -> SET p_in=2;  

    -> SELECT p_in;  

    -> END;  

    -> // 

    mysql > DELIMITER ;

    登入後複製

执行结果:

  1. 1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    mysql > SET @p_in=1; 

    mysql > CALL demo_in_parameter(@p_in); 

    +------+

    | p_in | 

    +------+

    |   1  |  

    +------+

    +------+

    | p_in | 

    +------+

    |   2  |  

    +------+

    mysql> SELECT @p_in; 

    +-------+

    | @p_in | 

    +-------+

    |  1    | 

    +-------+

    登入後複製

以上可以看出,p_in虽然在存储过程中被修改,但并不影响@p_id的值

.OUT参数例子

创建:

1

2

3

4

5

6

7

8

9

mysql > DELIMITER // 

mysql > CREATE PROCEDURE demo_out_parameter(OUT p_out int) 

-> BEGIN

-> SELECT p_out; 

-> SET p_out=2; 

-> SELECT p_out; 

-> END

-> // 

mysql > DELIMITER ;

登入後複製
    执行结果:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

mysql > SET @p_out=1; 

mysql > CALL sp_demo_out_parameter(@p_out); 

+-------+

| p_out |  

+-------+

| NULL  |  

+-------+

+-------+

| p_out | 

+-------+

|   2   |  

+-------+

mysql> SELECT @p_out; 

+-------+

| p_out | 

+-------+

|   2   | 

+-------+

登入後複製

. INOUT参数例子

创建:

1

2

3

4

5

6

7

8

9

mysql > DELIMITER // 

mysql > CREATE PROCEDURE demo_inout_parameter(INOUT p_inout int) 

-> BEGIN

-> SELECT p_inout; 

-> SET p_inout=2; 

-> SELECT p_inout;  

-> END

-> //  

mysql > DELIMITER

登入後複製

执行结果:

  1. 1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    mysql

    mysql > CALL demo_inout_parameter(@p_inout) ; 

    +---------+ 

    | p_inout | 

    +---------+ 

    |    1    | 

    +---------+ 

    +---------+ 

    | p_inout |  

    +---------+ 

    |    2    | 

    +---------+ 

    mysql > SELECT @p_inout; 

    +----------+ 

    | @p_inout |  

    +----------+ 

    |    2     | 

    +----------+

    登入後複製

(4). 变量

. 变量定义

DECLARE variable_name [,variable_name...] datatype [DEFAULT value];

其中,datatypeMySQL的数据类型,如:int, float, date, varchar(length)

例如:

1

2

3

4

5

DECLARE l_int int unsigned default 4000000; 

DECLARE l_numeric number(8,2) DEFAULT 9.95; 

DECLARE l_date date DEFAULT '1999-12-31'; 

DECLARE l_datetime datetime DEFAULT '1999-12-31 23:59:59'; 

DECLARE l_varchar varchar(255) DEFAULT 'This will not be padded';

登入後複製

. 变量赋值

1

SET 变量名 = 表达式值 [,variable_name = expression ...]

登入後複製

. 用户变量

. MySQL客户端使用用户变量

  1. 1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    mysql > SELECT 'Hello World' into @x; 

    mysql > SELECT @x; 

    +-------------+

    |   @x        | 

    +-------------+

    | Hello World | 

    +-------------+

    mysql > SET @y='Goodbye Cruel World'; 

    mysql > SELECT @y; 

    +---------------------+

    |     @y              | 

    +---------------------+

    | Goodbye Cruel World | 

    +---------------------+

    mysql > SET @z=1+2+3; 

    mysql > SELECT @z; 

    +------+

    | @z   | 

    +------+

    |  6   | 

    +------+

    登入後複製

ⅱ. 在存储过程中使用用户变量

  1. 1

    2

    3

    4

    5

    6

    7

    8

    mysql > CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World'); 

    mysql > SET @greeting='Hello'; 

    mysql > CALL GreetWorld( ); 

    +----------------------------+

    | CONCAT(@greeting,' World') | 

    +----------------------------+

    |  Hello World               | 

    +----------------------------+

    登入後複製

. 在存储过程间传递全局范围的用户变量

  1. 1

    2

    3

    4

    5

    6

    7

    8

    9

    mysql> CREATE PROCEDURE p1()   SET @last_procedure='p1'; 

    mysql> CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@last_proc); 

    mysql> CALL p1( ); 

    mysql> CALL p2( ); 

    +-----------------------------------------------+

    | CONCAT('Last procedure was ',@last_proc  | 

    +-----------------------------------------------+

    | Last procedure was p1                         | 

    +-----------------------------------------------+

    登入後複製

注意:

用户变量名一般以@开头

滥用用户变量会导致程序难以理解及管理

(5). 注释

MySQL存储过程可使用两种风格的注释

双模杠:--

该风格一般用于单行注释

c风格: 一般用于多行注释

例如:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

mysql > DELIMITER // 

mysql > CREATE PROCEDURE proc1 --name存储过程名

-> (IN parameter1 INTEGER)  

-> BEGIN

-> DECLARE variable1 CHAR(10);  

-> IF parameter1 = 17 THEN

-> SET variable1 = 'birds';  

-> ELSE

-> SET variable1 = 'beasts';  

-> END IF;  

-> INSERT INTO table1 VALUES (variable1); 

-> END

-> // 

mysql > DELIMITER ;

登入後複製

4. MySQL存储过程的调用

call和你过程名以及一个括号,括号里面根据需要,加入参数,参数包括输入参数、输出参数、输入输出参数。具体的调用方法可以参看上面的例子。

5. MySQL存储过程的查询

我们像知道一个数据库下面有那些表,我们一般采用show tables;进行查看。那么我们要查看某个数据库下面的存储过程,是否也可以采用呢?答案是,我们可以查看某个数据库下面的存储过程,但是是令一钟方式。

我们可以用

1

2

3

4

5

select name from mysql.proc where db=’数据库名’;

或者

select routine_name from information_schema.routines where routine_schema='数据库名';

或者

show procedure status where db='数据库名';

登入後複製

进行查询。

如果我们想知道,某个存储过程的详细,那我们又该怎么做呢?是不是也可以像操作表一样用describe 表名进行查看呢?

答案是:我们可以查看存储过程的详细,但是需要用另一种方法:

SHOW CREATE PROCEDURE 数据库.存储过程名;

就可以查看当前存储过程的详细。

6. MySQL存储过程的修改

1

ALTER PROCEDURE

登入後複製

更改用CREATE PROCEDURE 建立的预先指定的存储过程,其不会影响相关存储过程或存储功能。

7. MySQL存储过程的删除

删除一个存储过程比较简单,和删除表一样:

1

DROP PROCEDURE

登入後複製

MySQL的表格中删除一个或多个存储过程。

8. MySQL存储过程的控制语句

(1). 变量作用域

内部的变量在其作用域范围内享有更高的优先权,当执行到end。变量时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储
过程外再也不能找到这个申明的变量,但是你可以通过out参数或者将其值指派
给会话变量来保存其值。

1

2

3

4

5

6

7

8

9

10

11

12

mysql > DELIMITER // 

mysql > CREATE PROCEDURE proc3() 

     -> begin

     -> declare x1 varchar(5) default 'outer'; 

     -> begin

     -> declare x1 varchar(5) default 'inner'; 

     -> select x1; 

     -> end

     -> select x1; 

     -> end

     -> // 

mysql > DELIMITER

登入後複製

(2). 条件语句

. if-then -else语句

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

mysql > DELIMITER // 

mysql > CREATE PROCEDURE proc2(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

     -> // 

mysql > DELIMITER ;

登入後複製
    . case语句:
  1. 1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    mysql > DELIMITER // 

    mysql > CREATE PROCEDURE proc3 (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

         -> // 

    mysql > DELIMITER ;

    登入後複製

(3). 循环语句

. while ···· end while

  1. 1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    mysql > DELIMITER // 

    mysql > CREATE PROCEDURE proc4() 

         -> begin

         -> declare var int; 

         -> set var=0; 

         -> while var<6 do 

         -> insert into t values(var); 

         -> set var=var+1; 

         -> end while

         -> end

         -> // 

    mysql > DELIMITER ;

    登入後複製

. repeat···· end repeat

它在执行操作后检查结果,而while则是执行前进行检查。

  1. 1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    mysql > DELIMITER // 

    mysql > CREATE PROCEDURE proc5 () 

         -> begin

         -> declare v int; 

         -> set v=0; 

         -> repeat 

         -> insert into t values(v); 

         -> set v=v+1; 

         -> until v>=5 

         -> end repeat; 

         -> end

         -> // 

    mysql > DELIMITER ;

    登入後複製

. loop ·····end loop:

loop循环不需要初始条件,这点和while 循环相似,同时和repeat循环一样不需要结束条件, leave语句的意义是离开循环。

  1. 1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    mysql > DELIMITER // 

    mysql > CREATE PROCEDURE proc6 () 

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

         -> // 

    mysql > DELIMITER ;

    登入後複製

. LABLES 标号:

标号可以用在begin repeat while 或者loop 语句前,语句标号只能在合法的语句前面使用。可以跳出循环,使运行指令达到复合语句的最后一步。

(4). ITERATE迭代

. ITERATE:

通过引用复合语句的标号,来从新开始复合语句

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

mysql > DELIMITER // 

mysql > CREATE PROCEDURE proc10 () 

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

     -> // 

mysql > DELIMITER ;

登入後複製

9. MySQL存储过程的基本函数

(1).字符串类

CHARSET(str) //傳回字符串字元集
#CONCAT (string2 [,... ]) // 連接字符串
INSTR (string ,substring ) //返回substring首次在string中出現的位置,不存在回傳0
LCASE (string2 ) //
轉換成小寫

LEFT (string2 ,length ) //#從string2中的左邊起取length個字元
##LENGTH (string ) //string長度
LOAD_FILE (file_name ) //從檔案讀取內容
LOCATE (substring , string [,start_position ] ) 相同INSTR,##但可指定開始位置LPAD (string2 ,length ,pad ) //
#重複使用pad加在# string開頭,直到字串長度為length
LTRIM (string2 ) //
移除前端空格

REPEAT (string2 ,count ) //重複count
REPLACE (str ,search_str ,replace_str ) //str中用replace_str替換search_str
RPAD (string2 ,length ,pad) //
##在str後用pad補充,直到長度為
lengthRTRIM (string2 ) //
移除後端空格
STRCMP (string1 ,string2 ) //逐字符比较两字串大小,
SUBSTRING (str , position [,length ]) //
strposition开始,length个字符
,
注:mysql中处理字符串时,默认第一个字符下标为1,即参数position必须大于等于1

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

mysql> select substring(&#39;abcd&#39;,0,2); 

+-----------------------+

| substring(&#39;abcd&#39;,0,2) | 

+-----------------------+

|                       | 

+-----------------------+

1 row in set (0.00 sec) 

mysql> select substring(&#39;abcd&#39;,1,2); 

+-----------------------+

| substring(&#39;abcd&#39;,1,2) | 

+-----------------------+

|     ab                | 

+-----------------------+

1 row in set (0.02 sec) 

TRIM([[BOTH|LEADING|TRAILING] [padding] FROM]string2) //去除指定位置的指定字符

UCASE (string2 ) //转换成大写

RIGHT(string2,length) //取string2最后length个字符

SPACE(count) //生成count个空格

登入後複製

(2).数学类

ABS (number2 ) //绝对值
BIN (decimal_number ) //十进制转二进制
CEILING (number2 ) //向上取整
CONV(number2,from_base,to_base) //进制转换
FLOOR (number2 ) //向下取整
FORMAT (number,decimal_places ) //保留小数位数
HEX (DecimalNumber ) //转十六进制
注:HEX()中可传入字符串,则返回其ASC-11,如HEX('DEF')返回4142143
也可以传入十进制整数,返回其十六进制编码,如HEX(25)返回
19
LEAST (number , number2 [,..]) //
求最小值

MOD (numerator ,denominator ) //求余
POWER (number ,power ) //求指数
RAND([seed]) //随机数
ROUND (number [,decimals ]) //四舍五入,decimals为小数位数]

注:返回类型并非均为整数,如:
(1)默认变为整形值

1

2

3

4

5

6

7

8

9

10

11

12

13

14

mysql> select round(1.23); 

+-------------+

| round(1.23) | 

+-------------+

|           1 | 

+-------------+

1 row in set (0.00 sec) 

mysql> select round(1.56); 

+-------------+

| round(1.56) | 

+-------------+

|           2 | 

+-------------+

1 row in set (0.00 sec)

登入後複製
    (2)可以设定小数位数,返回浮点型数据

1

2

3

4

5

6

7

8

mysql>

+----------------+

| round(1.567,2) | 

+----------------+

|           1.57 | 

+----------------+

1 row in set (0.00 sec)

SIGN (number2 ) //

登入後複製

(3).日期时间类

ADDTIME (date2 ,time_interval ) //#將time_interval#加到#date2
CONVERT_TZ (datetime2 ,fromTZ ,toTZ ) //
轉換時區
CURRENT_DATE ( ) //
目前日期
#CURRENT_TIME ( ) //
目前時間
CURRENT_TIMESTAMP ( ) //
目前時間戳記##DATE (datetime ) //
返回datetime的日期部分DATE_ADD (date2 , INTERVAL d_value d_type ) //
#DATE_ADD (date2 , INTERVAL d_value d_type ) //date2中加上日期或時間
DATE_FORMAT (datetime ,FormatCodes ) //使用formatcodes格式顯示
datetimeDATE_SUB (date2 , INTERVAL d_value d_type ) //date2上減去一個時間
DATEDIFF (date1 ,date2 ) //#兩個日期差
DAY (date ) //#返回日期的天
DAYNAME (date ) //英文星期
######DAYOFWEEK (date ) //
星期(1-7) ,1為星期日
DAYOFYEAR (date ) //
一年中的第幾天
EXTRACT (interval_name FROM date ) //
date中提取日期的指定部分
MAKEDATE (year ,day ) //
#給出年及年中的第幾天,產生日期字串
MAKETIME (hour ,minute ,second ) //
產生時間字串
MONTHNAME (date ) //
英文月份名稱
NOW ( ) //
目前時間
SEC_TO_TIME (seconds ) //
秒數轉成時間
STR_TO_DATE (string ,format ) //
字串轉換成時間##, ##format格式顯示
TIMEDIFF (datetime1 ,datetime2 ) //
兩個時間差##TIME_TO_SEC (time ) //
時間轉秒數]WEEK (date_time [,start_of_week ]) //
第幾週 YEAR (datetime ) //
年份DAYOFMONTH(datetime) //
月的第幾天##HOUR(datetime) //
小时
LAST_DAY(date) //date
的月的最后日期
MICROSECOND(datetime) //
微秒
MONTH(datetime) //

MINUTE(datetime) //
返回符号,正负或0

SQRT(number2) //开平方

PHP调用MYSQL存储过程实例

实例一:无参的存储过程

1

2

3

4

5

6

7

8

9

10

11

$conn = mysql_connect(&#39;localhost&#39;,&#39;root&#39;,&#39;root&#39;) or die ("数据连接错误!!!");

mysql_select_db(&#39;test&#39;,$conn);

$sql = "

create procedure myproce()

begin

INSERT INTO user (id, username, sex) VALUES (NULL, &#39;s&#39;, &#39;0&#39;);

end;

";

mysql_query($sql);//创建一个myproce的存储过程

$sql = "call test.myproce();";

mysql_query($sql);//调用myproce的存储过程,则数据库中将增加一条新记录。

登入後複製

实例二:传入参数的存储过程

1

2

3

4

5

6

7

8

9

10

11

12

13

$sql = "

create procedure myproce2(in score int)

begin

if score >= 60 then

select &#39;pass&#39;;

else

select &#39;no&#39;;

end if;

end;

";

mysql_query($sql);//创建一个myproce2的存储过程

$sql = "call test.myproce2(70);";

mysql_query($sql);//调用myproce2的存储过程,看不到效果,可以在cmd下看到结果。

登入後複製

实例三:传出参数的存储过程

1

2

3

4

5

6

7

8

9

10

11

12

$sql = "

create procedure myproce3(out score int)

begin

set score=100;

end;

";

mysql_query($sql);//创建一个myproce3的存储过程

$sql = "call test.myproce3(@score);";

mysql_query($sql);//调用myproce3的存储过程

$result = mysql_query(&#39;select @score;&#39;);

$array = mysql_fetch_array($result);

echo &#39;<pre class="brush:php;toolbar:false">&#39;;print_r($array);

登入後複製

实例四:传出参数的inout存储过程

1

2

3

4

5

6

7

8

9

10

11

$sql = "

create procedure myproce4(inout sexflag int)

begin

SELECT * FROM user WHERE sex = sexflag;

end;

";

mysql_query($sql);//创建一个myproce4的存储过程

$sql = "set @sexflag = 1";

mysql_query($sql);//设置性别参数为1

$sql = "call test.myproce4(@sexflag);";

mysql_query($sql);//调用myproce4的存储过程,在cmd下面看效果

登入後複製

实例五:使用变量的存储过程

1

2

3

4

5

6

7

8

9

10

11

$sql = "

create procedure myproce5(in a int,in b int)

begin

declare s int default 0;

set s=a+b;

select s;

end;

";

mysql_query($sql);//创建一个myproce5的存储过程

$sql = "call test.myproce5(4,6);";

mysql_query($sql);//调用myproce5的存储过程,在cmd下面看效果

登入後複製

实例六:case语法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

$sql = "

create procedure myproce6(in score int)

begin

case score

when 60 then select &#39;及格&#39;;

when 80 then select &#39;及良好&#39;;

when 100 then select &#39;优秀&#39;;

else select &#39;未知分数&#39;;

end case;

end;

";

mysql_query($sql);//创建一个myproce6的存储过程

$sql = "call test.myproce6(100);";

mysql_query($sql);//调用myproce6的存储过程,在cmd下面看效果

登入後複製

实例七:循环语句

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

$sql = "

create procedure myproce7()

begin

declare i int default 0;

declare j int default 0;

while i<10 do

set j=j+i;

set i=i+1;

end while;

select j;

end;

";

mysql_query($sql);//创建一个myproce7的存储过程

$sql = "call test.myproce7();";

mysql_query($sql);//调用myproce7的存储过程,在cmd下面看效果

登入後複製

实例八:repeat语句

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

$sql = "

create procedure myproce8()

begin

declare i int default 0;

declare j int default 0;

repeat

set j=j+i;

set i=i+1;

until j>=10

end repeat;

select j;

end;

";

mysql_query($sql);//创建一个myproce8的存储过程

$sql = "call test.myproce8();";

mysql_query($sql);//调用myproce8的存储过程,在cmd下面看效果

登入後複製

实例九:loop语句

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

$sql = "

create procedure myproce9()

begin

declare i int default 0;

declare s int default 0;

loop_label:loop

set s=s+i;

set i=i+1;

if i>=5 then

leave loop_label;

end if;

end loop;

select s;

end;

";

mysql_query($sql);//创建一个myproce9的存储过程

$sql = "call test.myproce9();";

mysql_query($sql);//调用myproce9的存储过程,在cmd下面看效果

登入後複製

实例十:删除存储过程

1

2

mysql_query("drop procedure if exists myproce");//删除test的存储过程

实例十:存储过程中的游标

登入後複製

以上就是本篇文章的全部内容了,更多相关内容请关注PHP中文网。

相关推荐:

php调用mysql存储过程和函数的方法

以上是mysql預存程序詳解以及PHP呼叫MYSQL預存程序實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板