有两张表,分别是合同表和客户业务表,合同表如下:CREATE TABLE `jz_contect` (
`ctid` int(10) unsigned NOT NULL auto_increment,
`gbid` int(10) unsigned default NULL,
`tcid` int(10) unsigned default NULL,
`price` float default NULL,
`pricetype` int(11) default NULL,
`jfstdate` timestamp NULL default '0000-00-00 00:00:00',
`fftype` int(11) default NULL,
`contectstart` timestamp NULL default '0000-00-00 00:00:00',
`contectend` timestamp NULL default '0000-00-00 00:00:00',客户业务表如下:CREATE TABLE `jz_gbmes` (
`g_id` int(10) unsigned NOT NULL auto_increment,
`remindtype` int(11) default NULL,
`ctid` int(10) unsigned default NULL,
`bstdate` timestamp NULL default CURRENT_TIMESTAMP,
`sdate` timestamp NULL default NULL,
`edate` timestamp NULL default NULL,
`bs_id` int(10) unsigned default NULL,
PRIMARY KEY (`g_id`),
KEY `FK2_jz_gbmes` (`ctid`),
CONSTRAINT `FK2_jz_gbmes` FOREIGN KEY (`ctid`) REFERENCES `jz_contect` (`ctid`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8;工作流程为:先签完合同,然后再设置客户业务,根据合同的终止日期来生成客户业务的记录,一个合同可以有多个业务,现在当合同修改后,更新以前的客户业务记录,因为有多条记录,怎么循环产生呢?
`ctid` int(10) unsigned NOT NULL auto_increment,
`gbid` int(10) unsigned default NULL,
`tcid` int(10) unsigned default NULL,
`price` float default NULL,
`pricetype` int(11) default NULL,
`jfstdate` timestamp NULL default '0000-00-00 00:00:00',
`fftype` int(11) default NULL,
`contectstart` timestamp NULL default '0000-00-00 00:00:00',
`contectend` timestamp NULL default '0000-00-00 00:00:00',客户业务表如下:CREATE TABLE `jz_gbmes` (
`g_id` int(10) unsigned NOT NULL auto_increment,
`remindtype` int(11) default NULL,
`ctid` int(10) unsigned default NULL,
`bstdate` timestamp NULL default CURRENT_TIMESTAMP,
`sdate` timestamp NULL default NULL,
`edate` timestamp NULL default NULL,
`bs_id` int(10) unsigned default NULL,
PRIMARY KEY (`g_id`),
KEY `FK2_jz_gbmes` (`ctid`),
CONSTRAINT `FK2_jz_gbmes` FOREIGN KEY (`ctid`) REFERENCES `jz_contect` (`ctid`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8;工作流程为:先签完合同,然后再设置客户业务,根据合同的终止日期来生成客户业务的记录,一个合同可以有多个业务,现在当合同修改后,更新以前的客户业务记录,因为有多条记录,怎么循环产生呢?
解决方案 »
- mysql 中的未签署选项有什么作用?
- [help] c语言监控mysql数据更新
- 想了许久无解的问题:一条SELECT语句能否搞定查询和统计?
- 请教Can't create/write to file的问题
- mysql设置密码登陆时出现的问题:client does not support authentication protocol requested by server,consider upgrading mysql clie
- 主机名 host 为 localhost 与 127.0.0.1 有什么区别呀?
- mysql与c++的一些问题请教
- mysql的排序问题?可以按数组顺序排序吗?
- mysql 10055如何解决
- MySQL数据导入/导出问题
- MySQL触发器能否在表中递归触发
- 字符过滤
------------+---------------------+-------+--------+
| g_id | remindtype | account_id | gt_id | ctid | bstdate | sdate
| edate | bs_id | org_id |
+------+------------+------------+-------+------+---------------------+---------
------------+---------------------+-------+--------+
| 15 | 0 | 28 | NULL | 9 | 2008-01-01 00:00:00 | 2008-01-
01 00:00:00 | 2008-03-01 00:00:00 | 10 | 9 |
| 16 | 2 | 28 | 4 | 9 | 2008-01-01 00:00:00 | 2008-01-
01 00:00:00 | 2008-01-15 00:00:00 | 16 | 9 |
| 17 | 0 | 28 | NULL | 11 | 2008-01-01 00:00:00 | 2008-01-
01 00:00:00 | 2008-02-22 00:00:00 | 17 | 9 |
| 20 | 0 | 28 | NULL | 12 | 2008-01-01 00:00:00 | 2008-01-
01 00:00:00 | 2008-04-01 00:00:00 | 19 | 9 |
+------+------------+------------+-------+------+---------------------+---------
------------+---------------------+-------+--------+
4 rows in set (0.07 sec)mysql>
------------+---------------------+-------+--------+
| g_id | remindtype | account_id | gt_id | ctid | bstdate | sdate
| edate | bs_id | org_id |
+------+------------+------------+-------+------+---------------------+---------
------------+---------------------+-------+--------+
| 15 | 0 | 28 | NULL | 9 | 2008-01-01 00:00:00 | 2008-01-
01 00:00:00 | 2008-03-01 00:00:00 | 10 | 9 |
| 16 | 2 | 28 | 4 | 9 | 2008-01-01 00:00:00 | 2008-01-
01 00:00:00 | 2008-01-15 00:00:00 | 16 | 9 |
| 17 | 0 | 28 | NULL | 11 | 2008-01-01 00:00:00 | 2008-01-
01 00:00:00 | 2008-02-22 00:00:00 | 17 | 9 |
| 20 | 0 | 28 | NULL | 12 | 2008-01-01 00:00:00 | 2008-01-
01 00:00:00 | 2008-04-01 00:00:00 | 19 | 9 |这是客户业务表的数据,当签订合同时,会根据合同的截止日期和业务的提醒种类生成如上的数据,这是我写的生成的触发器:SELECT a.remindtype,a.sdate,a.edate,a.bstdate,a.g_id,b.contectend,a.org_id into tps,stcaution,endcaution,caution,gid,cend,orgid from jz_gbmes a left JOIN jz_contect b
on a.ctid = b.ctid where a.g_id = new.g_id;
if(tps = 0) then
set ye = Year(caution);
set yue = month(endcaution);
set dd = dayofmonth(endcaution);
set efcd = STR_TO_DATE(concat(ye,'/',yue,'/',dd),'%Y/%m/%d');
set sfcd = STR_TO_DATE(concat(ye,'/',month(stcaution),'/',dayofmonth(stcaution)),'%Y/%m/%d');
if(caution > efcd) then
set sfcd = DATE_ADD(sfcd,interval 1 year);
set efcd = DATE_ADD(efcd,interval 1 year);
end if;
while(sfcd < cend) do
insert into jz_stream(g_id,results,sdate,edate,org_id) values(gid,0,sfcd,efcd,orgid);
set sfcd = DATE_ADD(sfcd,interval 1 year);
set efcd = DATE_ADD(efcd,interval 1 year);
end while;
elseif(tps = 1) then
set ye = Year(caution);
set yue = month(endcaution);
set dd = dayofmonth(endcaution);
set efcd = STR_TO_DATE(concat(ye,'/',yue,'/',dd),'%Y/%m/%d');
set sfcd = STR_TO_DATE(concat(ye,'/',month(stcaution),'/',dayofmonth(stcaution)),'%Y/%m/%d');
while(caution > efcd) do
set sfcd = DATE_ADD(sfcd,interval 3 month);
set efcd = DATE_ADD(efcd,interval 3 month);
end while;
while(sfcd < cend) do
insert into jz_stream(g_id,results,sdate,edate,org_id) values(gid,0,sfcd,efcd,orgid);
set sfcd = DATE_ADD(sfcd,interval 3 month);
set efcd = DATE_ADD(efcd,interval 3 month);
end while;现在是当合同表jz_contect的截止日期改变时,需要重新生成jz_gbmes表的数据,但是一个合同id可能对应多个jz_gbmes的id,我不知道当有多个jz_gbmes的id的时候,怎样控制循环生成信息。
------------+---------------------+-------+--------+
| g_id | remindtype | account_id | gt_id | ctid | bstdate | sdate
| edate | bs_id | org_id |
+------+------------+------------+-------+------+---------------------+---------
------------+---------------------+-------+--------+
| 15 | 3 | 28 | NULL | 9 | 2008-01-01 00:00:00 | 2008-01-
01 00:00:00 | 2008-03-01 00:00:00 | 10 | 9 |如果合同截止日期改为:2010-1-1哪么jz_gbmes表的数据为生成两个:
:+------+------------+------------+-------+------+---------------------+---------
------------+---------------------+-------+--------+
| g_id | remindtype | account_id | gt_id | ctid | bstdate | sdate
| edate | bs_id | org_id |
+------+------------+------------+-------+------+---------------------+---------
------------+---------------------+-------+--------+
| 15 | 3 | 28 | NULL | 9 | 2008-01-01 00:00:00 | 2008-01-
01 00:00:00 | 2008-03-01 00:00:00 | 10 | 9 |
| 16 | 3 | 28 | NULL | 9 | 2008-01-01 00:00:00 | 2009-01-
01 00:00:00 | 2009-03-01 00:00:00 | 10 | 9 |
通过ctid取记录,提醒方式是怎样生成的?
on a.ctid = b.ctid where a.g_id = new.g_id;
if(tps = 0) then
set ye = Year(caution);
set yue = month(endcaution);
set dd = dayofmonth(endcaution);
set efcd = STR_TO_DATE(concat(ye,'/',yue,'/',dd),'%Y/%m/%d');
set sfcd = STR_TO_DATE(concat(ye,'/',month(stcaution),'/',dayofmonth(stcaution)),'%Y/%m/%d');
if(caution > efcd) then
set sfcd = DATE_ADD(sfcd,interval 1 year);
set efcd = DATE_ADD(efcd,interval 1 year);
end if;
while(sfcd < cend) do
insert into jz_stream(g_id,results,sdate,edate,org_id) values(gid,0,sfcd,efcd,orgid);
set sfcd = DATE_ADD(sfcd,interval 1 year);
set efcd = DATE_ADD(efcd,interval 1 year);
end while;现在是当修改合同表中的截止日期的时候,客户已经根据合同的截止日期生成了客户记录,这样也要修改,那么我怎样有多条的情况下分别取出并根据提醒方式的不同重新产生记录呢?麻烦老大了。
执行你上述代码,实际上只多了循环部份
用游标 OR SELECT INTO 变量均可,取决于你对哪种方式熟悉 及 数据量大小
如用select into要用循环
Duplicate handler declared in the same block可是我需要两个游标,不能只有一个handler啊,我的代码如下:DECLARE flag boolean default false;
DECLARE gbmes_csr CURSOR FOR SELECT g_id FROM jz_gbmes where ctid = new.ctid;
DECLARE gb_csr CURSOR FOR SELECT a.remindtype,a.sdate,a.edate,a.bstdate,a.g_id,b.contectend,a.org_id from jz_gbmes a where a.ctid = new.ctid;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_gb=1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_gbmes=1;
select count(*) into s from jz_guestcard where ctid = new.ctid and jfstate = 1;
OPEN gbmes_csr;
REPEAT
FETCH gbmes_csr INTO gg;
SELECT count(*) into tt from jz_stream where g_id = gg and results = 1;
if(tt > 0) then set flag = true;
end if;
UNTIL no_more_gbmes END REPEAT;
CLOSE gbmes_csr;
if(s = 0 || !flag) then
delete from jz_guestcard where ctid = new.ctid;
OPEN gb_csr;
REPEAT
FETCH gb_csr INTO tps,stcaution,endcaution,caution,gid,cend,orgid;
if(tps = 0) then
set ye = Year(caution);
set yue = month(endcaution);
set dd = dayofmonth(endcaution);
set efcd = STR_TO_DATE(concat(ye,'/',yue,'/',dd),'%Y/%m/%d');
set sfcd = STR_TO_DATE(concat(ye,'/',month(stcaution),'/',dayofmonth(stcaution)),'%Y/%m/%d');
if(caution > efcd) then
set sfcd = DATE_ADD(sfcd,interval 1 year);
set efcd = DATE_ADD(efcd,interval 1 year);
end if;
while(sfcd < cend) do
insert into jz_stream(g_id,results,sdate,edate,org_id) values(gid,0,sfcd,efcd,orgid);
set sfcd = DATE_ADD(sfcd,interval 1 year);
set efcd = DATE_ADD(efcd,interval 1 year);
end while;
elseif(tps = 1) then
set ye = Year(caution);
set yue = month(endcaution);
set dd = dayofmonth(endcaution);
set efcd = STR_TO_DATE(concat(ye,'/',yue,'/',dd),'%Y/%m/%d');
set sfcd = STR_TO_DATE(concat(ye,'/',month(stcaution),'/',dayofmonth(stcaution)),'%Y/%m/%d');
while(caution > efcd) do
set sfcd = DATE_ADD(sfcd,interval 3 month);
set efcd = DATE_ADD(efcd,interval 3 month);
end while;
while(sfcd < cend) do
insert into jz_stream(g_id,results,sdate,edate,org_id) values(gid,0,sfcd,efcd,orgid);
set sfcd = DATE_ADD(sfcd,interval 3 month);
set efcd = DATE_ADD(efcd,interval 3 month);
end while;
end if;
UNTIL no_more_gb END REPEAT;
CLOSE gb_csr;
这句是什么意思?不是很明白。
select into .... where id=你的游标中相关ID
DECLARE gbmes_csr CURSOR FOR SELECT g_id FROM jz_gbmes where ctid = new.ctid;
DECLARE gb_csr CURSOR FOR SELECT a.remindtype,a.sdate,a.edate,a.bstdate,a.g_id,b.contectend,a.org_id from jz_gbmes a where a.ctid = new.ctid;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_gb=1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_gbmes=1;
OPEN gbmes_csr;
REPEAT
FETCH gbmes_csr INTO gg;
SELECT count(*) into tt from jz_stream where g_id = gg and results = 1;
if(tt > 0) then set flag = true;
end if;
UNTIL no_more_gbmes END REPEAT;
CLOSE gbmes_csr;
OPEN gb_csr;
REPEAT
FETCH gb_csr INTO tps,stcaution,endcaution,caution,gid,cend,orgid;这两个都不一样,怎么加游标的id呢?