数据库实验 | 第5关:使用游标的存储过程

任务描述

本关任务:
jdxx数据表有四个字段,分别是省份(sf)、城市(cs)、区县(qxmc)、街道(name)。
例如,查询天心区(qxmc)的所有字段的值结果如图所示
数据库实验 | 第5关:使用游标的存储过程_第1张图片

任务要求

建立存储过程
tjdq(in sf varchar(10))
输入省份的名称,将该省份所有城市的所有地区的
乡x、镇z和街道jd和其他的个数插入到数据表dqtj中。
dqtj数据表已经建立在数据库中,有城市(cs),区县名称(qxmc)、县(x)、街道(jd)、镇(z)、其他(qt)六个字段。分别存储指定省份的城市、区县名称和县、街道、镇、其他的个数。
以湖南省为参数,调用tjdq过程后
dqtj数据表部分数据如图所示
数据库实验 | 第5关:使用游标的存储过程_第2张图片
调用过程
以安徽省为参数,调用过程

提示:该过程先要删除dqtj数据表的所有数据
然后将指定省份的城市和区县的唯一信息值存入游标
然后将游标的各条信息依次取出循环,根据游标中的城市和区县名称,在jdxx数据表查出对应的乡、街道、镇和其他的个数,然后插入到dqtj数据表。


相关知识

声明游标

命令格式:

DECLARE   游标名  CURSOR FOR   select语句

打开和关闭游标

命令格式:

open 游标名  
close 游标名  

读取游标信息

命令格式:

FETCH  游标名  INTO var1,var2[,]  

将游标声明时的查询结果逐条存放在变量中
每执行一次fetch将指针指向下一条结果
变量必须在声明游标前定义

遍历游标

数据库实验 | 第5关:使用游标的存储过程_第3张图片


代码

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;

你可能感兴趣的:(数据库,数据库,mysql)