Mysql存储过程使用总结

来源:互联网 发布:易企秀源码 编辑:程序博客网 时间:2024/05/02 01:53

Mysql存储过程使用总结:

存储过程是MYSQL在5.0版本开始支持的,它一个被定义并保存在数据库服务器中的SQL语句集,是一种介于应用程序和数据库间的编程接口,也是封装重复性工作的一种有效方法,它支持用户变量、条件执行及其它的编程功能,具体如下:

 

·     存储过程的用途

·     存储过程的语法

·     存储过程的使用

 

一、存储过程的用途

1、封装常用的SQL语句集,解决重复性工作;

2、对数据进行倒入和导出,常用在数据同步及报表导出导出;

3、与触发器结合使用,实现复杂的功能;

 

注:以上只是常用的情景,其实还有很多业务需求使用。

 

二、存储过程的语法

1、创建

CREATE PROCEDURE procedure_name ([paramters[,…]])[attributes]

BEGIN

  body_statement

END;

 

注:

procedure_name:存储过程的名字,建议以下划线_分割多个单词

paramters:存储过程的过程参数,包含:IN、OUT及INOUT,具体:

IN 代表输入或传入值,在存储过程中被修改,但不返回;

OUT 代表输出或传出值,在存储过程中被修改,并返回;

INOUT 代表输入输出,在存储过程中被修改,并返回;

body_statement:存储过程体,这里可以放入SQL集,也可以内嵌存储过程;

 

2、删除

DROP PROCEDURE [IF EXISTS] procedure_name;

 

注:

procedure_name:存储过程名字,如果存储过程存在(IF EXISTS)再删除

 

3、修改

ALTER PROCEDURE procedure_name ([paramters[,…]])[attributes]

BEGIN

  body_statement

END;

 

注:与创建的格式基本相同

 

4、执行

CALL procedure_name ([paramters[,…]]);

 

注:使用CALL来调用存储过程,不同的数据库调用的关键字不同

 

5、分隔符定义

MYSQL中默认是以;号为分隔符的,如果没有声明不同的分隔符,MYSQL的编译器会误将存储过程当作SQL编译,则样执行时就会报错,所以需要使用DELIMITER设置不同的分隔符,例如:DELIMITER |,记得使用完之后,恢复;的定义。

 

三、存储过程的使用

1、内部使用

定义:

DELIMITER |

 

USE cwteam |

 

#根据传入的ID值 返回对应的内容

DROP PROCEDURE IF EXISTS p_get_product_type |

CREATE PROCEDURE p_get_product_type(IN ID int,OUT type varchar(15))

BEGIN

IF(ID=1) THEN

    SET type = 'PTNO_2016031000';

END IF;

IF(ID=2) THEN

    SET type = 'PTNO_2016031001';

END IF;

END |

#调用上面的存储过程获得特定值座位当前存储过程之行SQL的条件

#并返回查询的结果

DROP PROCEDURE IF EXISTS nums_from_product |

CREATE PROCEDURE nums_from_product(IN type int,OUT count_nums int)

BEGIN

    #获得产品类型字符串#

    SET @type = type;

    SET @typeStr = NULL;

    #调用第一个存储过程

    CALL p_get_product_type(@type,@typeStr);

    #拼接SQL字符串

    SET @selectSql = CONCAT('SELECTCOUNT(*) FROM t_product_item WHERE pfid=?');

    PREPARE stmtselect FROM@selectSql;

    EXECUTE stmtselect USING @typeStr;

    DEALLOCATE PREPARE stmtselect;

END |

 

DELIMITER ; #恢复;

 

调用:

SET @nums = NULL;#设置变量 用来存储查询的结果

CALL nums_from_product(1,@nums);

 

查询:

SELECT @nums;

 

结果:

 

上面的例子:通过调用nums_from_product存储过程,并传入不同的ID值,这个值是为存储过程p_get_product_type的输入参数,该过程返回的内容作为nums_from_product的SQL查询条件,最重结果存放在变量nums中,并使用SELECT查询,请查看代码注释。

 

2、PHP中的使用

<?php

            // 链接mysql

       $conn = mysql_connect('localhost','root','');

       if(!$conn) {

           echo 'Could notconnect the db server!';

           return;

       }

       // 选择数据库

       mysql_select_db('cwteam');

       // 调用存储过程

       mysql_query($procSql.$procSql2);

       echo $procSql.$procSql2;

       $result = mysql_query('CALLnums_from_product(1,@nums)');

       // 显示数据

       $array = mysql_fetch_array($result);

       echo 'result:';print_r($array[0]);

?>

 

结果:

打印的结果与上面内部使用的结果相同。一般情况下,应用程序只调用已经创建好的存储过程,获得指定数据或实现某种功能,当然是可以在应用程序创建的,这种方式也比较简单直接拼接SQL创建存储过程即可。


(技术讨论群:276592700(新))

 

 

 

 

 

1 0