示例表 area_code_2022 :
DROP TABLE IF EXISTS `area_code_2022`;
CREATE TABLE `area_code_2022` ( ? `code` bigint(12) unsigned NOT NULL COMMENT '区划代码', ? `name` varchar(128) NOT NULL DEFAULT '' COMMENT '名称', ? `level` tinyint(1) NOT NULL COMMENT '级别1-5,省市县镇村', ? `pcode` bigint(12) DEFAULT NULL COMMENT '父级区划代码', ? PRIMARY KEY (`code`), ? KEY `name` (`name`), ? KEY `level` (`level`), ? KEY `pcode` (`pcode`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
添加数据:
INSERT INTO `area_code_2022` (`code`, `name`, `level`, `pcode`) VALUES ?? ?(110000000000,'北京市',1,0), ?? ?(110100000000,'市辖区',2,110000000000), ?? ?(110101000000,'东城区',3,110100000000), ?? ?(110101001000,'东华门街道',4,110101000000), ?? ?(110101001001,'多福巷社区居委会',5,110101001000), ?? ?(110101001002,'银闸社区居委会',5,110101001000), ?? ?(110101001005,'东厂社区居委会',5,110101001000), ?? ?(110101001006,'智德社区居委会',5,110101001000), ?? ?(110101001007,'南池子社区居委会',5,110101001000), ?? ?(110101001009,'灯市口社区居委会',5,110101001000), ?? ?(110101001010,'正义路社区居委会',5,110101001000), ?? ?(110101001013,'台基厂社区居委会',5,110101001000), ?? ?(110101001014,'韶九社区居委会',5,110101001000), ?? ?(110101001015,'王府井社区居委会',5,110101001000), ?? ?(110101002000,'景山街道',4,110101000000), ?? ?(110101002001,'隆福寺社区居委会',5,110101002000), ?? ?(110101002002,'吉祥社区居委会',5,110101002000), ?? ?(110101002003,'黄化门社区居委会',5,110101002000), ?? ?(110101002004,'钟鼓社区居委会',5,110101002000), ?? ?(110101002005,'魏家社区居委会',5,110101002000), ?? ?(110101002006,'汪芝麻社区居委会',5,110101002000), ?? ?(110101002008,'景山东街社区居委会',5,110101002000), ?? ?(110101002009,'皇城根北街社区居委会',5,110101002000), ?? ?(110101003000,'交道口街道',4,110101000000), ?? ?(110101003001,'交东社区居委会',5,110101003000), ?? ?(110101003002,'福祥社区居委会',5,110101003000), ?? ?(110101003003,'大兴社区居委会',5,110101003000), ?? ?(110101003005,'府学社区居委会',5,110101003000), ?? ?(110101003007,'鼓楼苑社区居委会',5,110101003000), ?? ?(110101003008,'菊儿社区居委会',5,110101003000), ?? ?(110101003009,'南锣鼓巷社区居委会',5,110101003000), ?? ?(110101004000,'安定门街道',4,110101000000), ?? ?(110101004001,'交北头条社区居委会',5,110101004000), ?? ?(110101004002,'北锣鼓巷社区居委会',5,110101004000), ?? ?(110101004003,'国子监社区居委会',5,110101004000), ?? ?(110101004004,'钟楼湾社区居委会',5,110101004000), ?? ?(110101004005,'宝钞南社区居委会',5,110101004000), ?? ?(110101004006,'五道营社区居委会',5,110101004000), ?? ?(110101004009,'分司厅社区居委会',5,110101004000), ?? ?(110101004011,'国旺社区居委会',5,110101004000), ?? ?(110101004012,'花园社区居委会',5,110101004000);
查询显示一下数据:
接下来,我们以此表进行相关操作
其实,我是很喜欢sql server的,语法用起来非常顺手,本次的演示主要是熟悉mysql中写存储过程处理mysql的表数据,为什么要这样呢?因为我很懒啦,不想写数据库之外的代码.......
动力十足,开始啦。下面的存储过程(基于mysql8),可以作为一个标准的sql模式了,见到就不要错过呦!!!!废话太多了,上sql语句。
CREATE DEFINER=`root`@`%` PROCEDURE `computer`( /* 传入的参数 */ in in_para1 int,
/* 既是传入参数,也是返回值 */ inout in_para2 int, /* 返回值 */? out n_res VARCHAR(100) ) begin
? ? /* 声明变量,注意变量名不能使用驼峰的形式,如:proMode */ ?? ??? ?DECLARE pro_mode bigint DEFAULT 10000000000; ?? ??? ?DECLARE b_id,e_id int; ?? ??? ?DECLARE r_id int; ?? ??? ?DECLARE current_code bigint; ?? ??? ?DECLARE c_type varchar(100); ?? ??? ?
?? ? ?/* 内存中的临时表,此种表有大小限制,数据量较大的地方,会有报错 */ ? ? /*删除临时表*/ ?? ??? ?drop temporary table if exists tmp1;
? ? /*创建临时表*/ ?? ??? ?create temporary table tmp1 ?? ??? ?( ?? ??? ??? ?id int unsigned not null PRIMARY key auto_increment, ?? ??? ??? ?code bigint not null ?? ??? ?) ?? ??? ?engine=memory;? ?? ??? ? ?? ??? ?/* 正常的数据表,一般不会有大小的限制 */ ?? ??? ?/*删除正常表*/ ?? ??? ?drop table if exists tmp2; ?? ??? ? ?? ??? ?/* 创建正常表 ?*/ ?? ??? ?create table tmp2 ?? ??? ?( ?? ??? ??? ?id int unsigned not null PRIMARY key auto_increment, ?? ??? ??? ?code bigint not null ?? ??? ?);?
? ? /*向正常表插入数据,临时表的操作雷同*/ ?? ??? ?insert into ?tmp2(code) ?? ??? ?select code from area_code_2022 where code % pro_mode =0; ?? ??? ? ?? ??? ?/*查询表的最小ID和最大id给变量赋值*/ ?? ??? ?select min(id),max(id) into b_id,e_id from tmp2; ?? ??? ? ?? ??? ?/*显示变量的值*/ ?? ??? ?/* select b_id,e_id; */ ?? ??? ? ?? ??? ?/* 给变量赋值*/ ?? ??? ?set r_id=b_id; ?? ??? ? ?? ??? ?/* while循环处理 */ ?? ??? ?while r_id<=e_id do ?? ??? ??? ? ? ?? ??? ??? ??? ?/* ?模拟处理一些事情 ? */ ?? ??? ??? ??? ?select code into current_code from tmp2 where id= r_id; ?? ??? ??? ??? ? ?? ??? ??? ??? ?/* if else 的使用 */ ?? ??? ??? ??? ?if current_code% 10 =0 then ?? ??? ??? ??? ??? ? set c_type='0'; ?? ??? ??? ??? ?elseif current_code% 10 =3 then ?? ??? ??? ??? ??? ? set c_type='3'; ?? ??? ??? ??? ?else ?? ??? ??? ??? ??? ? set c_type='9'; ?? ??? ??? ??? ?end if; ?? ??? ??? ??? ? ?? ??? ??? ??? ?/* ?r_id的值加1 */ ?? ??? ??? ??? ?set r_id=r_id+1; ?? ??? ?end WHILE; ?? ??? ? ?? ??? ?set n_res ='处理完成'; ?? ??? ?select n_res; end
哈哈,看着头疼吗?看注释啦,完整的mysql存储过程demo,熟练之后,见招拆招吧。
运行一下,看看效果?我是在Navicat上操作的
?点击运行之后,需要输入两个参数
?是不是咱们定义的?
随便给他们点值吧,不然怎么看效果呢?
?为什么有这么多的输出结果呢?不想说,去看sql语句吧!不知是Navicat的原因,还是怎么的,存储过程中超过20个的select,只能看见20个;
以上是界面的操作过车,下面我们使用sql语句来执行
?执行结果如下:
界面和sql语句形式执行存储过程全部演示完毕,多写几次,熟练就好了。?
|