oracle cursor生成学生号

由前面做过的实验,学号的规格是这样的ABCD17EFGH共10位,AB表示学院 CD表示专业 17表示年级 EF表示班级 GH表示班里的序号 班级序号是连续的,班内学号是连续的

创建一个学院专业信息表

要自动生成学生号,那么先把那些学院 专业 人数 班级数先输入是十分合情又合理的事情= =,所以这些信息我们得先建个表

1
2
3
4
5
6
7
8
9
10
11
12
create table sch_J314(
college varchar(4),
major varchar(4),
class_num int,
stud_num int
);
insert into sch_J314 values('09', '02', 7, 200);
insert into sch_J314 values('02', '09', 4, 100);
insert into sch_J314 values('03', '03', 5, 150);
insert into sch_J314 values('09', '05', 4, 102);
insert into sch_J314 values('03', '04', 6, 170);
select * from sch_J314;

既然要自动生成学号那还要一个保存生成的学号的表(本来可以用stud_J314,但是想想还要改约束,还是新建吧)

1
2
3
create table sno_J314(
sno varchar(20) primary key
);

下一步就是创建这么一个过程来把生成的学号存入sno_J314

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
create or replace procedure P_sno_J314
as
cursor num is select * from sch_J314;
college varchar(4);
major varchar(4);
class int;
stud int;
each_stud int;
begin

for a in num loop
college := a.college;
major := a.major;
class := a.class_num;
stud := a.stud_num;
each_stud := stud/class;
if each_stud * class > stud then
each_stud := each_stud - 1;
end if;
for i in 1..class loop
for j in 1..each_stud loop
insert into sno_J314 values(college||major||'17'||TO_CHAR(i,'FM09')||TO_CHAR(j,'FM09'));
end loop;
end loop;
for i in 1..stud - each_stud * class loop
insert into sno_J314 values(college||major||'17'||TO_CHAR(i,'FM09')||TO_CHAR(stud / class + 1,'FM09'));
end loop;
end loop;
end P_sno_J314;
.
/
exec P_sno_J314;

中间发现一个问题,我默认是像C/C++一样int类型相除取整,结果本应有722个结果变成了725个,查阅资料后才知道是四舍五入

p1

p2