伴随着mysql5.X支持存储过程,让人无比自信,特别是一直受困于mssql的程序猿来说,和其他选择的mssql原因相同,mssql开发简单、益于上手,提供良好的人机交互界面,再加上随便在任何一个网站都可以下载到其最新的客户端。伴随着项目用户的增多,相关的问题也显现出来。正版化的问题,因其不能跨操作系统,因此导致使用mssql的话必须搭载winServer操作系统,从成本上考虑造价不菲啊。因而一些中小企业的网站使用了mysql数据库,因其适用于跨平台、企业版造价低的优势,受到了广大中小企业的欢迎。哈哈闲话不扯,进入正题。

    因前期做的项目将大部分业务实现通过服务器端的存储过程来实现,所以当初提出变更数据库厂家时很是头疼,并且在这个项目中,为提高存储过程的复用场所,在设计参数时尽量的宽泛,内部通过判断传递过来的参数值,来动态的拼接需要执行的t-sql语句,这个也是一直让我担心的一个问题。还好今天做了一个demo顺利解决。(本人刚刚接触Mysql1月有余,还处于菜鸟级,如有介绍不到之处还请包涵)。

创建数据表语句:

CREATE TABLE T_MENUINFO -- 存储系统导航目录信息
(
    MI_ID INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,-- 编号
    MI_MENUNAME VARCHAR(50) NOT NULL ,-- 导航名称
    MI_MENUURL VARCHAR(255) NOT NULL DEFAULT '',-- 导航链接
    MI_MENUPIC VARCHAR(255) NOT NULL DEFAULT '', -- 导航图片链接
    MI_PARENTNODE VARCHAR(255) NOT NULL,-- 导航父级节点
    MI_GROUPNAME VARCHAR(50) NOT NULL ,-- 导航所属分组名称
    MI_STATE BIT DEFAULT 0 -- 导航启用状态
);

这里主要实现通过传递参数 来对T_MENUINFO 进行查询;

详细存储过程如下:

-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `PROC_GETMENUINFOLISTBYPARAMETER`(
    IN _ID VARCHAR(50),-- 编号
    IN _MENUNAME VARCHAR(50)  ,-- 导航名称
    IN _MENUURL VARCHAR(255) ,-- 导航链接
    IN _MENUPIC VARCHAR(255) , -- 导航图片链接
    IN _PARENTNODE VARCHAR(255),-- 导航父级节点
    IN _GROUPNAME VARCHAR(50)  ,-- 导航所属分组名称
    IN _STATE VARCHAR(50) ,-- 导航启用状态
    IN _PAGEINDEX INT,
    IN _PAGESIZE INT
)
BEGIN
    SET @ORDERHEAD='SELECT MI_ID ,MI_MENUNAME,MI_MENUURL,MI_MENUPIC,MI_PARENTNODE,MI_GROUPNAME,MI_STATE FROM T_MENUINFO ';
    SET @ORDERPARAMETER='WHERE 1=1 ';
    IF _ID<>'' THEN
    SET @ORDERPARAMETER=CONCAT(@ORDERPARAMETER,CONCAT(' AND MI_ID=''',_ID,''''));
    END IF;
    IF _MENUNAME<>'' THEN
    SET @ORDERPARAMETER=CONCAT(@ORDERPARAMETER,CONCAT(' AND MI_MENUNAME=''',_MENUNAME,''''));
    END IF;
    IF _MENUURL<>'' THEN
    SET @ORDERPARAMETER=CONCAT(@ORDERPARAMETER,CONCAT(' AND MI_MENUURL=''',_MENUURL,''''));
    END IF;
    IF _MENUPIC<>'' THEN
    SET @ORDERPARAMETER=CONCAT(@ORDERPARAMETER,CONCAT(' AND MI_MENUPIC=''',_MENUPIC,''''));
    END IF;
    IF _PARENTNODE<>'' THEN
    SET @ORDERPARAMETER=CONCAT(@ORDERPARAMETER,CONCAT(' AND MI_PARENTNODE=''',_PARENTNODE,''''));
    END IF;
    IF _GROUPNAME<>'' THEN
    SET @ORDERPARAMETER=CONCAT(@ORDERPARAMETER,CONCAT(' AND MI_GROUPNAME=''',_GROUPNAME,''''));
    END IF;
    IF _STATE<>'' THEN
    SET @ORDERPARAMETER=CONCAT(@ORDERPARAMETER,CONCAT(' AND MI_STATE=''',_STATE,''''));
    END IF;

    SET @ORDERORDERBY=CONCAT(' LIMIT ',((_PAGEINDEX-1)*_PAGESIZE),' , ',(_PAGESIZE);  --  !!!!
    -- SELECT @ORDERPARAMETER,@ORDERHEAD,@ORDERORDERBY;

    SET @ORDERSQL=CONCAT(@ORDERHEAD,@ORDERPARAMETER,@ORDERORDERBY);
      -- SELECT @ORDERSQL;
    prepare stmt from @ORDERSQL;  -- 预编译      !!!!
    EXECUTE stmt;
END

这里重点看一下存在 !!!!编辑的语句,与mssql不同 ,希望能对大家有所帮助。