任务描述
本关任务:
jdxx数据表有四个字段,分别是省份(sf)、城市(cs)、区县(qxmc)、街道(name)。
例如,查询天心区(qxmc)的所有字段的值结果如图所示
任务要求
建立存储过程
tjdq(in sf varchar(10))
输入省份的名称,将该省份所有城市的所有地区的
乡x、镇z和街道jd和其他的个数插入到数据表dqtj中。
dqtj数据表已经建立在数据库中,有城市(cs),区县名称(qxmc)、县(x)、街道(jd)、镇(z)、其他(qt)六个字段。分别存储指定省份的城市、区县名称和县、街道、镇、其他的个数。
以湖南省为参数,调用tjdq过程后
dqtj数据表部分数据如图所示
调用过程
以安徽省为参数,调用过程
提示:该过程先要删除dqtj数据表的所有数据
然后将指定省份的城市和区县的唯一信息值存入游标
然后将游标的各条信息依次取出循环,根据游标中的城市和区县名称,在jdxx数据表查出对应的乡、街道、镇和其他的个数,然后插入到dqtj数据表。
相关知识
声明游标
命令格式:
DECLARE 游标名 CURSOR FOR select语句
打开和关闭游标
命令格式:
open 游标名
close 游标名
读取游标信息
命令格式:
FETCH 游标名 INTO var1,var2[,…]
将游标声明时的查询结果逐条存放在变量中
每执行一次fetch将指针指向下一条结果
变量必须在声明游标前定义
遍历游标
代码
use province;
#代码开始
delimiter $$
create procedure tjdq(in sm varchar(10))
begin
declare flag int default 1;
declare city varchar(10);
declare qx varchar(10);
declare jd int;
declare x int;
declare z int;
declare qt int;
declare dq cursor for select distinct cs, qxmc from jdxx where sf = sm;
declare continue handler for not found set flag = 0;
delete from dqtj;
open dq;
fetch dq into city, qx;
while flag = 1 do
select count(*) from jdxx where cs = city and qxmc = qx and name like "%街道" into jd;
select count(*) from jdxx where cs = city and qxmc = qx and name like "%乡" into x;
select count(*) from jdxx where cs = city and qxmc = qx and name like "%镇" into z;
select count(*) from jdxx where cs = city and qxmc = qx and name not like "%镇" and name not like "%街道" and name not like "%乡" into qt;
insert into dqtj values(city, qx, x, jd, z, qt);
fetch dq into city, qx;
end while;
close dq;
end $$
delimiter ;
call tjdq("安徽省");
#代码结束
select * from dqtj;