declare
cursor c_app (mcode char, y number) is
select *
from table_stdname_rawdata
where substr(major_id,1,1) = mcode
order by major_id,name,surname;
r1 c_app%rowtype;
cursor c2 is
select *
from imajor
order by fac;
r2 c2%rowtype;
n number(3);
sid varchar2(8);
aa varchar2(1);
bb varchar2(1);
cc varchar2(1);
dd varchar2(1);
ee varchar2(4);
i varchar2(5);
jj varchar2(3);
jjj varchar2(1);
l varchar2(2);
m varchar2(1);
e number(5);
a1 number(1);
b1 number(1);
c1 number(1);
d1 number(1);
e1 number(1);
ff number(1);
gg number(1);
hh number(1);
j number(4);
k number(2);
year number := &study_year_2_digits;
begin
open c2;
loop
fetch c2 into r2;
exit when c2%notfound;
------------------------------------------------------------------- start gen master
open c_app (r2.fac,year);
loop
fetch c_app into r1;
exit when c_app%notfound;
/* เลือกรหัสนิสิตที่มากที่สุดของปีและคณะนั้น ๆ ที่มีอยู่เดิม */
select nvl(max(substr(std_id,5,3)),0) + 1
into n
from STUDENT
where substr(std_id,1,4) = year||r2.id;
sid := year||r2.id||lpad(n,3,'0');
/* ตัดค่ามาจากรหัสนิสิต หลักที่ 1 3 5 7*/
aa := substr(sid,1,1);
bb := substr(sid,3,1);
cc := substr(sid,5,1);
dd := substr(sid,7,1);
/* นำตัวแปรที่ได้มาเชื่อมต่อกัน */
ee := aa||bb||cc||dd;
/* แปลงค่าจากตัวอักษรเป็นตัวเลข แล้วคูณด้วย 2*/
e := to_number(ee)*2;
/* แปลงค่าที่ได้จากตัวแปร e มาเป็นตัวอักษรให้ครบ 5 หลัก ถ้าไม่ครบให้เพิ่ม 0 ข้างหน้า */
i := lpad(e,5,'0');
/* ตัดค่ามาจากตัวแปร i */
a1 := to_number(substr(i,1,1));
b1 := to_number(substr(i,2,1));
c1 := to_number(substr(i,3,1));
d1 := to_number(substr(i,4,1));
e1 := to_number(substr(i,5,1));
/* ตัดค่ามาจากรหัสนิสิต หลักที่ 2 4 6 */
ff := to_number(substr(sid,2,1));
gg := to_number(substr(sid,4,1));
hh := to_number(substr(sid,6,1));
/* นำค่าที่ได้มาบวกกัน */
j := a1+b1+c1+d1+e1+ff+gg+hh;
/* แปลงค่าที่ได้จากตัวแปร j มาเป็นตัวอักษรให้ครบ 3 หลัก ถ้าไม่ครบให้เพิ่ม 0 ข้างหน้า */
jj := lpad(j,3,'0');
jjj := substr(jj,3,1);
k := 10 - jjj;
/* แปลงค่าที่ได้จากตัวแปร k มาเป็นตัวอักษรให้ครบ 2 หลัก ถ้าไม่ครบให้เพิ่ม 0 ข้างหน้า */
l := lpad(k,2,'0');
/* this is check digit */
m := substr(l,2,1);
sid := sid||m;
insert into student (STD_ID ,P_ID , PRE_TNAME , T_NAME ,T_SURNAME ,SEX ,MAJOR_ID , ADVISOR_ID )
values (sid, r1.P_ID , r1.PRE_TNAME , r1.T_NAME , r1.T_SURNAME, r1.SEX , r1.MAJOR_ID , r1.ADVISOR_ID );
commit;
end loop;
close c_app;
------------------------------------------------------------------- end gen id
end loop;
close c2;
end;
/