MySql存储过程总结

原文: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:“`”这个符号是反单引号,两个反单引号夹起来的会被当做变量,一般是在定义字段时遇到关键字冲突的时候会用到。

时间: 2024-10-28 04:47:15

MySql存储过程总结的相关文章

CI调用存储过程很慢怎么提速,mysql存储过程本身执行很快,但是在php调用就要0.8s

问题描述 CI调用存储过程很慢怎么提速,mysql存储过程本身执行很快,但是在php调用就要0.8s $this -> db -> reconnect(); $mysqli = new mysqli(); $mysqli -> query(""SET NAMES utf8""); if (mysqli_connect_errno()) { printf('Connect failed: %s ' mysqli_connect_error()); e

MySql存储过程 带参数处理方式

下文介绍的MySql存储过程是带参数的存储过程(动态执行SQL语句),该MySql存储过程是根据用户输入的条件和排序方式查询用户的信息,排序条件可以没有调用方式: call GetUsersDynamic('age<=30',''); /********动态查询用户的信息********/     CREATE PROCEDURE GetUsersDynamic(WhereCondition varchar(500),OrderByExpress varchar(100))     begin 

当PHP遇到MySQL存储过程

1.MySQL存储过程 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和一些特殊的控制结构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的.数据库中的存储过程可以看做是对编

PHP和MySQL存储过程的实例演示

以下的文章主要是向大家介绍的是PHP和MySQL存储过程的实例演示,我前两天在相关网站看见PHP和MySQL存储过程的实例演示的资料,觉得挺好,就拿出来供大家分享.希望在大家今后的学习中会有所帮助.   PHP与MySQL存储过程 实例一:无参的存储过程     $conn = MySQL_connect('localhost','root','root') or die ("数据连接错误!!!"); MySQL_select_db('test',$conn); $sql = &quo

PHP调用MySQL存储过程

mysql|存储过程 返回单个数据:1.1:创建MySQL存储过程: DELIMITER $$ DROP PROCEDURE IF EXISTS `test`.`proc_test` $$CREATE PROCEDURE `test`.`proc_test` (out a int)BEGIN    select count(*) into a from tblname;END $$ DELIMITER ; 1.2:PHP调用: $db->query("CALL test.proc_test

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

mysql|存储过程|函数 存储过程和函数是MySql5.0刚刚引入的.关于这方面的操作在PHP里面没有直接的支持.但是由于Mysql PHP API的设计,使得我们可以在以前的PHP版本中的mysql php api中支持存储过程和函数的调用. 在php中调用存储过程和函数.     1.调用存储过程的方法.       a.如果存储过程有 IN/INOUT参数,声明一个变量,输入参数给存储过程,该变量是一对,       一个php变量(也可以不必,只是没有php变量时,没有办法进行动态输入

MySQL存储过程、函数、触发器和视图的权限检查

当存储过程.函数.触发器和视图创建后,不单单创建者要执行,其它用户也可能需要执行,换句话说,执行者有可能不是创建者本身,那么在执行存储过程时,MySQL是如何做权限检查的? 在默认情况下,MySQL将检查创建者的权限.假设用户A创建了存储过程p()访问表T,并把execute的权限赋给了B,即使用户B没有访问表T的权限,也能够通过执行存储过程p()访问表T. 下面看一个例子: 首先,我们创建一个表test.t和两个用户a,b,并把权限赋予用户a root@(none) 05:39:45>crea

MySQL存储过程里动态SQL的使用

MySQL的存储过程不好用,一般在应用开发过程中不建议使用.但有时候在数 据迁移等环境中,特别涉及到复杂点的逻辑处理,就需要存储过程的配合了,当 然,用其他语言写程序实现也是可以的,不过效率估计没有直接在数据库中操作 高. 有时候数据所在的表是不确定的,需要根据实际情况临时决定表名, 这时候就是动态SQL的用武之地了,以下示例展示了在一次数据导出的过程中使用 动态SQL的存储过程例子: delimiter // CREATE PROCEDURE `proc_rt_imp_group`() BEG

mysql存储过程BEGIN END复合语句用法示例

  mysql存储过程BEGIN END复合语句用法示例 begin_label:] BEGIN [statement_list] END [end_label] 存储子程序可以使用BEGIN ... END复合语句来包含多个语句.statement_list 代表一个或多个语句的列表.statement_list之内每个语句都必须用分号(;)来结尾. 复合语句可以被标记.除非begin_label存在,否则end_label不能被给出,并且如果二者都存在,他们必须是同样的. 请注意,可选的[N

java调用mysql存储过程实例分析

  本文实例讲述了java调用mysql存储过程的方法.分享给大家供大家参考.具体如下: 数据库的测试代码如下 : 1.新建表test ? 1 2 3 4 5 create table test( field1 int not null ) TYPE=MyISAM ; insert into test(field1) values(1); 2.删除已存在的存储过程: ? 1 2 3 -- 删除储存过程 delimiter // -- 定义结束符号 drop procedure p_test; 3