现在在做一个项目,设计到一个统计。可以不写存储过程,用程序就可以解决,但自己觉得用程序效率会慢一些,就想到了用存储过程。在书写的存储过程中用到了游标,临时表。也碰到一些问题。
-- 联系人导入统计创建存储过程
create PROCEDURE relationpepole_pro()
BEGIN
-- DECLARE x INT;
DECLARE costnum BIGINT DEFAULT 0;
DECLARE lasttime datetime;
DECLARE num int DEFAULT 0;
DECLARE rrelationpepolepk varchar(36);
DECLARE rownpoit double DEFAULT 0;
DECLARE rrpaddtime datetime;
DECLARE rrpemail varchar(30);
DECLARE rrpname varchar(20);
DECLARE rrptel varchar(13);
DECLARE rrpuserid varchar(36);
DECLARE rstatues varchar(6);
DECLARE rtelnum varchar(15);
DECLARE rbirthday datetime;
DECLARE rremail varchar(30);
DECLARE rsex varchar(6);
DECLARE rrcustomgrade varchar(36);
DECLARE rrcustormtype varchar(36);
DECLARE rraddress varchar(100);
DECLARE resutmark INT DEFAULT 0;
DECLARE tempmark INT DEFAULT 0;
DECLARE rp_cursor CURSOR FOR SELECT relationpepolepk,ownpoit,rpaddtime,rpemail,rpname,rptel,
rpuserid,statues,telnum,birthday,remail,sex,rcustomgrade,rcustormtype,raddress from relationpepole;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET resutmark = 1;
-- 删除表relationpepole_total_temp
drop table if EXISTS relationpepole_total_temp;
-- 创建relationpepole_total_temp 临时表
CREATE TEMPORARY TABLE if not EXISTS `relationpepole_total_temp` (
`relationpepolepk` varchar(36) NOT NULL,
`ownpoit` double NOT NULL,
`rpaddtime` datetime NOT NULL,
`rpemail` varchar(30) DEFAULT NULL,
`rpname` varchar(20) NOT NULL,
`rptel` varchar(13) DEFAULT NULL,
`rpuserid` varchar(36) NOT NULL,
`statues` varchar(6) DEFAULT NULL,
`telnum` varchar(15) DEFAULT NULL,
`birthday` datetime DEFAULT NULL,
`remail` varchar(30) DEFAULT NULL,
`sex` varchar(6) DEFAULT NULL,
`rcustomgrade` varchar(36) DEFAULT NULL,
`rcustormtype` varchar(36) DEFAULT NULL,
`raddress` varchar(100) DEFAULT NULL,
`rcostnum` int DEFAULT 0 NOT NULL,
`rlasttime` datetime DEFAULT NULL,
PRIMARY KEY (`relationpepolepk`)
);
-- 调试 set @x=3;
open rp_cursor;
REPEAT
FETCH rp_cursor INTO rrelationpepolepk,rownpoit,rrpaddtime,rrpemail,rrpname,rrptel,rrpuserid,rstatues,rtelnum,rbirthday,rremail,rsex,rrcustomgrade,rrcustormtype,rraddress;
IF (resutmark<>1) THEN
-- 成交次数,成交时间赋值
SELECT count(orderidpk),costime into costnum,lasttime from sysorder where rpfkid=rrelationpepolepk and ostatues='normal' AND orderstatus='confirm'
and checkstate='pass' order by costime;
set @x=CONCAT(@x,costnum);
-- 插入到临时表 relationpepole_total_temp
INSERT INTO relationpepole_total_temp VALUES (rrelationpepolepk, rownpoit, rrpaddtime, rrpemail,rrpname,
rrptel,rrpuserid,rstatues,rtelnum,rbirthday, rremail, rsex, rrcustomgrade, rrcustormtype,rraddress,costnum,lasttime);
END IF;
UNTIL resutmark=1 END REPEAT;
close rp_cursor;
-- 返回结果集
SELECT relationpepolepk,ownpoit,rpaddtime,rpemail,rpname,rptel,rpuserid,statues,telnum,birthday,remail,sex,rcustomgrade,rcustormtype,raddress,rcostnum,rlasttime from relationpepole_total_temp;
end
sql的存储过程大同小异,第一个是申明一个存储过程(包括输入和输出参数),第二 创建内容 begin end
临时表的存在是在一次连接中,当连接返回到连接池是或连接销毁时,临时表就不存在了。临时表也是存在硬盘系统中。还有一种临时表存在内存中。这种临时表访问速度快,但是耗内存。具体用哪种临时表,就依情况而定。
说一下我在书写过程中遇到的问题
1.申明的变量名不要和表字段名一样
SELECT relationpepolepk,ownpoit,rpaddtime,rpemail,rpname,rptel,rpuserid,statues,telnum,birthday,remail,sex,rcustomgrade,rcustormtype,raddress,rcostnum,rlasttime from relationpepole_total_temp;
rcostnum,rlasttime原先是和申明变量名costnum,lasttime一致的,返回的时候mysql分不清你是要返回字段的值,还是申明变量的值。这时就返回申明变量的值
2 其他的变量的申明要在游标变量之前也就是游标申明放在后边
3 异常帮助书写
DECLARE CONTINUE HANDLER FOR NOT FOUND SET resutmark = 1;
这里的意思是数据查询不出 继续程序,并 给resutmark 赋值,在这里我耗费了好多时间,看的最多的是和游标一起用,游标找不到数据,就赋值,循环终止。当请仔细 是数据查不到,只要你的存储过程中有查询语句,如果查不到,就是出发这个语句。所以要注意
3 调试
在mysql里调试是很不方便,在网上找了一下也没找到什么调试工具,不过还好有这个
-- 调试 set @x=3;
通过这个方式你可以进行单步调试,虽然不怎么方便,总比没有强。
在调用存储过程后你可以通过 select @x来查看变量x的值,从而知晓过程的执行状态,进行调试
分享到:
相关推荐
MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者预编译一系列SQL语句并封装成一个可重复使用的单元,从而提高数据处理的效率和代码的复用性。本教程将深入探讨MySQL存储过程的创建、调用以及相关概念...
本文实例讲述了mysql存储过程之返回多个值的方法。分享给大家供大家参考,具体如下: mysql存储函数只返回一个值。要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程。咱们先来看一个orders表它的...
本教程结合"mysql经典教程+mysql存储过程讲解"的主题,将深入探讨MySQL的基础知识以及核心特性——存储过程。 首先,我们需要理解什么是数据库。数据库是一个组织和存储数据的系统,允许用户以结构化方式访问和管理...
本实例展示了如何在MySQL存储过程中实现异常处理,以捕获并处理可能出现的错误。 首先,我们注意到在创建存储过程`myProc`时,使用了`delimiter $$`来改变MySQL客户端的语句分隔符,这是为了在存储过程中使用多个...
总的来说,Java通过JDBC调用MySQL存储过程涉及到连接数据库、创建`CallableStatement`、执行存储过程和处理结果。这使得开发者能够在Java应用中灵活地利用数据库提供的强大功能,实现更高效的数据处理。
Mysql存储过程常用语句模板(含变量,if,三种循环等等) Mysql存储过程常用语句模板(含变量,if,三种循环等等) Mysql存储过程常用语句模板(含变量,if,三种循环等等) Mysql存储过程常用语句模板(含变量,if,三...
最后,"mysql存储过程.pdf"专注于MySQL的存储过程。存储过程是预编译的SQL语句集合,可以提高数据库操作的性能,减少网络流量,并增强数据安全。在PDF文档中,你将学习如何定义、调用和管理存储过程,以及如何使用...
MySQL 存储过程编程 MySQL 存储过程编程是指在 MySQL 数据库中使用存储过程来实现业务逻辑的编程技术。存储过程是一种可以在数据库中存储和执行的程序单元,它可以实现复杂的业务逻辑和数据处理操作。 在 MySQL ...
MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者预编译一系列的SQL语句,形成一个可重复使用的代码块,以提高数据处理的效率和应用程序的性能。在这个"MySQL存储过程学习"的主题中,我们将深入探讨...
MySQL存储过程是数据库管理系统中的一个重要特性,它允许程序员或数据库管理员预先定义一组SQL语句,形成一个可重用的逻辑单元。在这个“MySQL存储过程入门到精通”资料中,你将深入理解存储过程的原理、创建、调用...
c++实现调mysql存储过程,实现存储过程的出参入参,可以支持查询多数据返回,还有存储过程的复杂数据的增删改等
MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者编写一系列复杂的SQL语句,并作为一个单元进行执行,提高代码复用性和效率。然而,与普通的编程语言一样,存储过程的调试同样至关重要,因为错误的存储...
MySQL 存储过程实例 MySQL 存储过程实例详细介绍了 MySQL 存储过程的开发步骤,本节将通过具体的实例讲解 PHP 是如何操纵 MySQL 存储过程的。 创建存储过程 存储过程的创建是 MySQL 存储过程的基础,MySQL 5.0 ...
### MySQL存储过程实现分页 #### 背景与需求 在数据库操作中,分页是一种常见的需求,尤其是在处理大量数据时。通过分页技术,可以有效地减少每次查询的数据量,提高系统的响应速度和用户体验。MySQL作为一种广泛...
### MySQL存储过程实战知识点 #### 一、存储过程概述 MySQL 存储过程是一种预编译的 SQL 脚本,它可以包含复杂的逻辑控制结构、循环等操作,并且可以接受参数,执行完后还可以返回结果。存储过程可以提高数据处理...
MySQL存储过程编程是数据库应用开发中的一个重要环节,它可以帮助开发者将一系列的数据库操作封装起来,以提高程序的可维护性和运行效率。在MySQL 5.0及以上版本中,存储过程、函数和触发器的支持为数据库提供了更...