MySql存储过程总结

系统 1737 0
原文: MySql存储过程总结

      之前总是在MSSQL上写存储过程,没有在MYSQL上写过,也基本没有用过,今天需要用到MYSQL,研究了下,把项目的需要的存储过程写了一部分,写一下工作总结。这里没有给出数据库结构,不讨论SQL语句的细节,主要探讨存储过程语法,适合有基础的人。

 发表地址: http://www.cnblogs.com/zxlovenet/p/3783136.html

      
        #查询文章回复


      
      
        --
      
      
         ----------------------------
      
      
        

--
      
      
         Procedure structure for `sp_select_reply_article`
      
      
        

--
      
      
         ----------------------------
      
      
        DROP
      
      
        PROCEDURE
      
      
        IF
      
      
        EXISTS
      
      
         `sp_select_reply_article`;

DELIMITER ;;


      
      
        CREATE
      
       DEFINER
      
        =
      
      `root`@`localhost` 
      
        PROCEDURE
      
       `sp_select_reply_article`(
      
        IN
      
       `ra_id` 
      
        int
      
      ,
      
        IN
      
       `pagefrom` 
      
        int
      
      ,
      
        IN
      
       `pagesize` 
      
        int
      
      
        )


      
      
        BEGIN
      
      
        

         #Routine body goes here...

         
      
      
        SET
      
      
        @ra_id
      
      
        =
      
      
         ra_id;

         
      
      
        SET
      
      
        @pagefrom
      
      
        =
      
      
         pagefrom;

         
      
      
        SET
      
      
        @pagesize
      
      
        =
      
      
         pagesize;

         
      
      
        SET
      
      
        @ssra
      
      
        =
      
       CONCAT(
      
        '
      
      
        SELECT * FROM gk_article WHERE id = ? LIMIT ?,?
      
      
        '
      
      
        );

         
      
      
        PREPARE
      
       sqlquery 
      
        FROM
      
      
        @ssra
      
      
        ;

         
      
      
        EXECUTE
      
       sqlquery USING 
      
        @ra_id
      
      ,
      
        @pagefrom
      
      ,
      
        @pagesize
      
      
        ;


      
      
        END
      
      
        

;;

DELIMITER ;
      
    

 

#技术点1:MySql5.1不支持LIMIT参数(MySql5.5就支持了),如果编写存储过程时使用LIMIT做变量,那是需要用动态SQL来构建的,而这样做性能肯定没有静态SQL好。主要代码如下:

         SET @ssra = CONCAT('SELECT * FROM gk_article WHERE id = ? LIMIT ?,?');

         PREPARE sqlquery FROM @ssra;

         EXECUTE sqlquery USING @ra_id,@pagefrom,@pagesize;

 

#技术点2:如果同时需要返回受影响行数需要在语句后面添加语句:ROW_COUNT()函数,两条语句之间需要“;”分隔。

  发表地址: http://www.cnblogs.com/zxlovenet/p/3783136.html

      
        #更新数据


      
      
        --
      
      
         ----------------------------
      
      
        

--
      
      
         Procedure structure for `sp_update_permission`
      
      
        

--
      
      
         ----------------------------
      
      
        DROP
      
      
        PROCEDURE
      
      
        IF
      
      
        EXISTS
      
      
         `sp_update_permission`;

DELIMITER ;;


      
      
        CREATE
      
       DEFINER
      
        =
      
      `root`@`localhost` 
      
        PROCEDURE
      
       `sp_update_permission`(
      
        IN
      
       `puser_uid` 
      
        varchar
      
      (
      
        20
      
      ),
      
        IN
      
       `plevel` 
      
        int
      
      ,
      
        IN
      
       `ppower` 
      
        int
      
      
        )


      
      
        BEGIN
      
      
        

         #Routine body goes here...

        

         
      
      
        SET
      
      
        @puser_uid
      
      
        =
      
      
         puser_uid;

         
      
      
        SET
      
      
        @plevel
      
      
        =
      
      
         plevel;

         
      
      
        SET
      
      
        @ppower
      
      
        =
      
      
         ppower;

         
      
      
        UPDATE
      
       gk_permission 
      
        SET
      
       `
      
        level
      
      ` 
      
        =
      
      
        @plevel
      
      , 
      
        power
      
      
        =
      
      
        @ppower
      
      
        WHERE
      
       user_uid 
      
        =
      
      
        CONVERT
      
      (
      
        @puser_uid
      
      
         USING utf8) COLLATE utf8_unicode_ci;


      
      
        END
      
      
        

;;

DELIMITER ;
      
    

 

#技术点3:MySQL进行字符串比较时发生错误(Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='),解决方法:将比较等式一边进行字符串转换,如改为“CONVERT(b.fullCode USING utf8) COLLATE utf8_unicode_ci”,主要代码如下:

         UPDATE gk_permission SET `level` = @plevel, power = @ppower WHERE user_uid = CONVERT(@puser_uid USING utf8) COLLATE utf8_unicode_ci;

 

      
        #插入数据


      
      
        --
      
      
         ----------------------------
      
      
        

--
      
      
         Procedure structure for `sp_insert_user`
      
      
        

--
      
      
         ----------------------------
      
      
        DROP
      
      
        PROCEDURE
      
      
        IF
      
      
        EXISTS
      
      
         `sp_insert_user`;

DELIMITER ;;


      
      
        CREATE
      
       DEFINER
      
        =
      
      `root`@`localhost` 
      
        PROCEDURE
      
       `sp_insert_user`(
      
        IN
      
       `uid` 
      
        varchar
      
      (
      
        20
      
      ),
      
        IN
      
       `upw` 
      
        varchar
      
      (
      
        32
      
      ),
      
        IN
      
       `name` 
      
        varchar
      
      (
      
        20
      
      ),
      
        IN
      
       `sex` 
      
        int
      
      ,
      
        IN
      
       `phone` 
      
        varchar
      
      (
      
        20
      
      ),
      
        IN
      
       `u_id` 
      
        int
      
      ,
      
        IN
      
       `s_id` 
      
        int
      
      ,
      
        IN
      
       `j_id` 
      
        int
      
      
        )


      
      
        BEGIN
      
      
        

         #Routine body goes here...

         
      
      
        SET
      
      
        @uid
      
      
        =
      
      
         uid;

         
      
      
        SET
      
      
        @upw
      
      
        =
      
      
         upw;

         
      
      
        SET
      
      
        @uname
      
      
        =
      
      
         uname;

         
      
      
        SET
      
      
        @sex
      
      
        =
      
      
         sex;

         
      
      
        SET
      
      
        @phone
      
      
        =
      
      
         phone;

         #由于外键约束,所以添加的外键字段需要在对应外键所在表有相应数据

         
      
      
        SET
      
      
        @u_id
      
      
        =
      
      
         u_id;

         
      
      
        SET
      
      
        @s_id
      
      
        =
      
      
         s_id;

         
      
      
        SET
      
      
        @j_id
      
      
        =
      
      
         j_id;

         
      
      
        SET
      
      
        @verifytime
      
      
        =
      
       DATE(
      
        '
      
      
        0000-00-00
      
      
        '
      
      
        );

         
      
      
        INSERT
      
      
        INTO
      
       gk_user(uid,upw,uname,sex,phone,u_id,s_id,j_id,verifytime) 
      
       VALUES ( @uid , @upw , @uname , @sex , @phone , @u_id , @s_id , @j_id , @verifytime ); #查询结果会自动返回受影响行数 END ;; DELIMITER ;

  发表地址: http://www.cnblogs.com/zxlovenet/p/3783136.html

      
        #根据ID删除数据


      
      
        --
      
      
         ----------------------------
      
      
        

--
      
      
         Procedure structure for `sp_delete_exchange_by_id`
      
      
        

--
      
      
         ----------------------------
      
      
        DROP
      
      
        PROCEDURE
      
      
        IF
      
      
        EXISTS
      
      
         `sp_delete_exchange_by_id`;

DELIMITER ;;


      
      
        CREATE
      
       DEFINER
      
        =
      
      `root`@`localhost` 
      
        PROCEDURE
      
       `sp_delete_exchange_by_id`(
      
        IN
      
       `eid` 
      
        int
      
      
        )


      
      
        BEGIN
      
      
        

         #Routine body goes here...

         
      
      
        SET
      
      
        @eid
      
      
        =
      
      
         eid;

         
      
      
        DELETE
      
      
        FROM
      
       gk_exchange 
      
        WHERE
      
       id 
      
        =
      
      
        @eid
      
      
        ;


      
      
        END
      
      
        

;;

DELIMITER ;
      
    

 

      
        #通过账号查询用户或者管理员


      
      
        --
      
      
         ----------------------------
      
      
        

--
      
      
         Procedure structure for `sp_select_user_by_uid`
      
      
        

--
      
      
         ----------------------------
      
      
        DROP
      
      
        PROCEDURE
      
      
        IF
      
      
        EXISTS
      
      
         `sp_select_user_by_uid`;

DELIMITER ;;


      
      
        CREATE
      
       DEFINER
      
        =
      
      `root`@`localhost` 
      
        PROCEDURE
      
       `sp_select_user_by_uid`(
      
        IN
      
       `uid` 
      
        varchar
      
      (
      
        20
      
      ),
      
        IN
      
       `getAdmin` 
      
        int
      
      
        )


      
      
        BEGIN
      
      
        

         #Routine body goes here...

         
      
      
        SET
      
      
        @uid
      
      
        =
      
      
         uid;

         #
      
      
        SET
      
      
        @getadmin
      
      
        =
      
      
         getAdmin;

         #查询管理员

         
      
      
        IF
      
       (getAdmin 
      
        =
      
      
        1
      
      ) 
      
        THEN
      
      
        SELECT
      
       us.
      
        *
      
      , un.`name`, se.`name`, jo.`name`, pe.`
      
        level
      
      `, pe.
      
        power
      
      
        FROM
      
       gk_user 
      
        AS
      
       us, gk_unit 
      
        AS
      
       un, gk_section 
      
        AS
      
       se, gk_jobtitle 
      
        AS
      
       jo, gk_permission 
      
        AS
      
       pe 
      
        WHERE
      
       us.u_id 
      
        =
      
       un.id 
      
        AND
      
       us.s_id 
      
        =
      
       se.id 
      
        AND
      
       us.j_id 
      
        =
      
       jo.id 
      
        AND
      
       us.uid 
      
        =
      
       pe.user_uid 
      
        AND
      
       us.uid 
      
        =
      
      
        CONVERT
      
      (
      
        @uid
      
      
         USING utf8) COLLATE utf8_unicode_ci;

         
      
      
        END
      
      
        IF
      
      
        ;

         #查询用户

         
      
      
        IF
      
       (getAdmin 
      
        =
      
      
        0
      
      ) 
      
        THEN
      
      
        SELECT
      
       us.
      
        *
      
      , un.`name`, se.`name`, jo.`name` 
      
        FROM
      
       gk_user 
      
        AS
      
       us, gk_unit 
      
        AS
      
       un, gk_section 
      
        AS
      
       se, gk_jobtitle 
      
        AS
      
       jo 
      
        WHERE
      
       us.u_id 
      
        =
      
       un.id 
      
        AND
      
       us.s_id 
      
        =
      
       se.id 
      
        AND
      
       us.j_id 
      
        =
      
       jo.id 
      
        AND
      
       us.uid 
      
        =
      
      
        CONVERT
      
      (
      
        @uid
      
      
         USING utf8) COLLATE utf8_unicode_ci;

         
      
      
        END
      
      
        IF
      
      
        ;


      
      
        END
      
      
        

;;

DELIMITER ;
      
    

 

#技术点4:这个存数过程需要用到控制语句(if else elseif while loop repeat leave iterate)。

         IF (getAdmin = 1) THEN

                   #语句…

         END IF;

  发表地址: http://www.cnblogs.com/zxlovenet/p/3783136.html

#技术点5:在传入参数不匹配的情况下报错(Column count doesn't match value count at row 1),这个就是细心问题了,详细检查参数吧。

 

#技术点6:获取当前时间的函数:NOW()

 

#技术点7:“`”这个符号是反单引号,两个反单引号夹起来的会被当做变量,一般是在定义字段时遇到关键字冲突的时候会用到。

MySql存储过程总结


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论