




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
數(shù)據(jù)庫(kù)開(kāi)發(fā)應(yīng)用實(shí)例一、系統(tǒng)分析和準(zhǔn)備1.1概述 通過(guò)計(jì)算機(jī)完成高等院校的招生錄取工作,是一個(gè)復(fù)雜而又有代表性的數(shù)據(jù)庫(kù)應(yīng)用。其中涉及到大量考生和院校數(shù)據(jù)的錄入、整理、存儲(chǔ)以及由數(shù)據(jù)庫(kù)應(yīng)用程序來(lái)實(shí)現(xiàn)錄取過(guò)程的自動(dòng)化等工作。因?yàn)樵谛W(xué)生對(duì)高考錄取過(guò)程都有一定程度的了解,所以我們選用這一工程來(lái)到達(dá)綜合運(yùn)用數(shù)據(jù)庫(kù)的訓(xùn)練目的。因?yàn)檫@個(gè)系統(tǒng)比擬復(fù)雜,所以我們通過(guò)設(shè)計(jì)和實(shí)現(xiàn)一個(gè)簡(jiǎn)化的“招生錄取系統(tǒng)”來(lái)模擬招生錄取的過(guò)程。系統(tǒng)首先要建立合理的數(shù)據(jù)結(jié)構(gòu)和關(guān)系,并輸入必要的根本數(shù)據(jù),然后根據(jù)院校的招生要求和學(xué)生填報(bào)的志愿,實(shí)現(xiàn)對(duì)符合要求的考生的錄取。通過(guò)對(duì)這一過(guò)程的模擬,我們可以比擬全面地應(yīng)用前面所學(xué)的知識(shí)和技能,并提高使用數(shù)據(jù)庫(kù)技術(shù)解決實(shí)際問(wèn)題的能力。1.2根本需求分析 先來(lái)做一個(gè)簡(jiǎn)單的需求分析。高考招生和錄取工作,一般是由招生部門(mén)和院校合作完成的。招生部門(mén)和院校是該應(yīng)用程序的使用者。該應(yīng)用程序?yàn)榭忌惶峁┮恍┖?jiǎn)單的查詢(xún)功能。院校 院校應(yīng)提供招生的要求,如招生的人數(shù)、最低錄取分?jǐn)?shù)線(xiàn)以及對(duì)考生的其他條件的限制。 院校需要在錄取結(jié)束后查詢(xún)?cè)盒5匿浫∶麊巍?2.招生部門(mén) 招生部門(mén)要收集和整理考生信息,建立考生信息庫(kù)和院校信息庫(kù)??忌畔?kù)用于存取考生的根本信息,包括考生的高考成績(jī)和報(bào)考志愿;院校信息庫(kù)用于存取院校的根本信息和招生信息。招生部門(mén)通過(guò)數(shù)據(jù)庫(kù)中的院校信息和考生信息,由相應(yīng)的數(shù)據(jù)庫(kù)應(yīng)用程序來(lái)完成一系列的數(shù)據(jù)加工處理過(guò)程,其中最主要的就是投檔錄取過(guò)程。所謂投檔,就是把滿(mǎn)足院校要求的考生檔案信息發(fā)送給院校,由院校審查檔案后決定考生的錄取與否。為了簡(jiǎn)化錄取過(guò)程,我們由系統(tǒng)投檔程序來(lái)完成考生的錄取工作,一旦考生滿(mǎn)足院校招生條件,即視為被錄取。被錄取的考生,在數(shù)據(jù)庫(kù)中要標(biāo)識(shí)成錄取狀態(tài),并記錄錄取院校的信息,在院校信息庫(kù)中要回填錄取人數(shù)的有關(guān)信息。 在錄取過(guò)程中或錄取結(jié)束后,招生部門(mén)要進(jìn)行查詢(xún)和統(tǒng)計(jì),主要是在錄取結(jié)束后統(tǒng)計(jì)所有院校的招生情況。3.考生 考生在錄取過(guò)程中需要查詢(xún)其高考分?jǐn)?shù)和錄取狀態(tài)。1.3功能分析設(shè)計(jì) 系統(tǒng)完成的主要功能有數(shù)據(jù)錄入、投檔和查詢(xún)統(tǒng)計(jì)。數(shù)據(jù)錄入 數(shù)據(jù)錄入要完成院校和學(xué)生信息表的數(shù)據(jù)輸入及修改工作。 在本系統(tǒng)中,為了完成錄取的模擬,可以虛擬10所院校,給出院校的根本信息和招生要求;虛擬至少50名考生,給出考生的根本信息以及考試成績(jī),并為每個(gè)考生填報(bào)2個(gè)院校志愿(一志愿和二志愿)。為了簡(jiǎn)化數(shù)據(jù)錄入,可直接由SQL語(yǔ)句或其他工具完成,比方可以使用TOAD軟件來(lái)完成。投檔過(guò)程 招生錄取的原那么是:一志愿要求優(yōu)先錄取,一志愿全部錄取完畢后,才能開(kāi)始二志愿的錄??;二志愿錄取對(duì)沒(méi)有到達(dá)方案招生人數(shù)的院校進(jìn)行補(bǔ)充錄取。 根據(jù)以上原那么,投檔可分為一志愿投檔和二志愿投檔。一志愿投檔是根據(jù)院校編號(hào)完成對(duì)一個(gè)學(xué)校的一志愿投檔的;二志愿投檔是根據(jù)院校編號(hào)完成對(duì)一個(gè)學(xué)校的二志愿投檔的,二志愿投檔應(yīng)該在一志愿投檔完成以后進(jìn)行。一次完成全部院校的投檔稱(chēng)為自動(dòng)投檔。自動(dòng)投檔一次完成對(duì)所有院校的一志愿或二志愿投檔。如果使用自動(dòng)投檔,只需為一志愿和二志愿分別投檔一次,即完成投檔過(guò)程。作為補(bǔ)充,可以設(shè)計(jì)一個(gè)調(diào)劑投檔功能,對(duì)一、二志愿沒(méi)有被錄取的考生,如果存在沒(méi)有招滿(mǎn)的院校,補(bǔ)充錄取同意調(diào)劑的考生。查詢(xún)統(tǒng)計(jì) 在投檔過(guò)程中或投檔結(jié)束之后,根據(jù)院校編號(hào)顯示院校的錄取結(jié)果,即錄取考生按分?jǐn)?shù)排序的名單,同時(shí)應(yīng)該顯示考生的分?jǐn)?shù)、錄取的志愿等信息。 在錄取結(jié)束之后,按院校的錄取平均分?jǐn)?shù)排名,顯示所有院校的招生統(tǒng)計(jì)信息。1.4開(kāi)發(fā)賬戶(hù)的創(chuàng)立和授權(quán) 在開(kāi)發(fā)之前,要為新的應(yīng)用創(chuàng)立模式賬戶(hù),并授予必要的權(quán)限,以便創(chuàng)立表和其他數(shù)據(jù)庫(kù)對(duì)象。為了能夠創(chuàng)立賬戶(hù)和授權(quán),必須使用具有足夠權(quán)限的管理賬戶(hù),可使用系統(tǒng)管理員賬戶(hù)來(lái)創(chuàng)立新的應(yīng)用賬戶(hù)。二、表和視圖的設(shè)計(jì)和實(shí)現(xiàn)2.1院校信息表院校信息表結(jié)構(gòu)設(shè)計(jì) 名稱(chēng):COLLEGE。 字段結(jié)構(gòu)如表1所示。表1院校信息表COLLEGE的結(jié)構(gòu)字段名稱(chēng)類(lèi)型寬度約束條件簡(jiǎn)要說(shuō)明院校編號(hào)number4主鍵院校的編號(hào)院校名稱(chēng)varchar230不允許為空院校的名稱(chēng)錄取分?jǐn)?shù)線(xiàn)number3在300~700之間院校最低錄取控制分?jǐn)?shù)線(xiàn)招生人數(shù)number3<=10方案招生總?cè)藬?shù)錄取人數(shù)number3默認(rèn)初值為0已經(jīng)錄取的人數(shù)字段含義說(shuō)明: 院校編號(hào):為該表的主鍵,是從1001開(kāi)始的4位數(shù)。 院校名稱(chēng):院校的全稱(chēng),必須填寫(xiě)。 錄取分?jǐn)?shù)線(xiàn):是院校確定的考生最低錄取分?jǐn)?shù)線(xiàn),低于錄取分?jǐn)?shù)線(xiàn)的考生不能被錄取。 招生人數(shù):是院校方案招生的人數(shù)。 錄取人數(shù):在某院校錄取過(guò)程中回填的已經(jīng)被錄取的一、二志愿人數(shù)的和。當(dāng)錄取人數(shù)等于招生人數(shù)時(shí)錄取結(jié)束。 有關(guān)數(shù)值型數(shù)據(jù)的范圍限定可以通過(guò)添加約束條件實(shí)現(xiàn)。2.表的創(chuàng)立 使用以下腳本創(chuàng)立院校信息表COLLEGE: CREATETABLE 院校編號(hào)NUMBER(4)PRIMARYKEY, 院校名稱(chēng)VARCHAR2(30)NOTNULL, 錄取分?jǐn)?shù)線(xiàn)NUMBER(3)CHECK(錄取分?jǐn)?shù)線(xiàn)BETWEEN300AND700), 招生人數(shù)NUMBER(3)CHECK(招生人數(shù)<=10), 錄取人數(shù)NUMBER(3)DEFAULT0 );3.?dāng)?shù)據(jù)的插入 使用以下腳本插入虛擬的10所院校數(shù)據(jù): INSERTINTOCOLLEGEVALUES(1001,'清華大學(xué)',620,5,0); INSERTINTOCOLLEGEVALUES(1002,'北京大學(xué)',600,4,0); INSERTINTOCOLLEGEVALUES(1003,'武漢大學(xué)',550,6,0); INSERTINTOCOLLEGEVALUES(1004,'華南科技大學(xué)',530,3,0); INSERTINTOCOLLEGEVALUES(1005,'復(fù)旦大學(xué)',580,4,0);INSERTINTOCOLLEGEVALUES(1006,'中山大學(xué)',560,5,0); INSERTINTOCOLLEGEVALUES(1007,'華南理工大學(xué)',520,4,0); INSERTINTOCOLLEGEVALUES(1008,'暨南大學(xué)',510,3,0); INSERTINTOCOLLEGEVALUES(1009,'深圳大學(xué)',500,6,0); INSERTINTOCOLLEGEVALUES(1010,'深圳職業(yè)技術(shù)學(xué)院',450,8,0); COMMIT; 說(shuō)明:以清華大學(xué)為例,院校編號(hào)為1001,錄取分?jǐn)?shù)線(xiàn)為620,招生人數(shù)為6,已錄取人數(shù)初值為0。 注意:插入的數(shù)據(jù)如果違反約束條件就會(huì)發(fā)生錯(cuò)誤。4.檢查插入的數(shù)據(jù) 使用以下查詢(xún)命令檢查插入結(jié)果: SELECT*FROMcollege; 執(zhí)行結(jié)果略。2.2學(xué)生信息表學(xué)生信息表的設(shè)計(jì) 名稱(chēng):STUDENT。 字段結(jié)構(gòu)如表2所示。表2學(xué)生信息表STUDENT的結(jié)構(gòu)字段名稱(chēng)類(lèi)型寬度約束條件簡(jiǎn)要說(shuō)明編號(hào)number5主鍵考生的編號(hào)姓名varchar215不允許為空考生的姓名性別varchar211-男,2-女考生的性別編碼總分number3<=700考生高考總分同意調(diào)劑varchar21默認(rèn)為0是否同意調(diào)劑,0-不同意,1-同意一志愿number4外鍵,參照COLLEGE表的院校編號(hào)一志愿的院校編號(hào)二志愿number4外鍵,參照COLLEGE表的院校編號(hào)二志愿的院校編號(hào)錄取狀態(tài)varchar21默認(rèn)為0狀態(tài),0-未錄取,1-錄取錄取院校number4外鍵,參照COLLEGE表的院校編號(hào)錄取院校的編號(hào)錄取志愿varchar21默認(rèn)為空表示考生被哪個(gè)志愿錄取,1-代表一志愿,2-代表二志愿,3-代表調(diào)劑錄取日期data默認(rèn)為空錄取的日期操作人varchar210默認(rèn)為空對(duì)考生投檔的賬戶(hù)字段含義說(shuō)明: 編號(hào):為該表主鍵,是從10001開(kāi)始的5位數(shù)值,可以使用序列自動(dòng)填充。 學(xué)生性別:只能是1或2,1代表男,2代表女,使用約束條件控制。 總分:為高考的總分?jǐn)?shù),約束條件是小于等于700分,假定總分值為700分。 同意調(diào)劑:默認(rèn)值為0,表示不同意調(diào)劑,值為1代表同意調(diào)劑。同意調(diào)劑的考生,在一志愿、二志愿錄取結(jié)束后,可以參加調(diào)劑錄取。一志愿:為考生填寫(xiě)的一志愿院校的編號(hào)。該字段參照院校表(COLLEGE)的院校編號(hào)。 二志愿:為考生填寫(xiě)的二志愿院校的編號(hào)。該字段參照院校表(COLLEGE)的院校編號(hào)。 錄取狀態(tài):默認(rèn)為0,代表沒(méi)有錄取,錄取時(shí)改為1,代表已經(jīng)錄取。錄取院校:默認(rèn)為空,在錄取時(shí)填入錄取院校的編號(hào)。該字段參照院校表(COLLEGE)的院校編號(hào)。錄取志愿:為1、2或3,代表考生被錄取的志愿,1代表一志愿錄取,2代表二志愿錄取,3代表通過(guò)調(diào)劑被錄取。 錄取日期:默認(rèn)為空,在考生被錄取時(shí),填入系統(tǒng)時(shí)間。 操作人:默認(rèn)為空,在考生被錄取時(shí),填入投檔賬戶(hù)名。 有關(guān)數(shù)值型數(shù)據(jù)的范圍限定可以通過(guò)添加約束條件實(shí)現(xiàn)。2.表的創(chuàng)立 以下腳本創(chuàng)立考生信息表STUDENT: CREATETABLESTUDENT( 編號(hào)NUMBER(5)PRIMARYKEY, 姓名VARCHAR2(15)NOTNULL, 性別VARCHAR2(1)CHECK(性別IN('1','2')), 總分NUMBER(3)CHECK(總分<=700), 同意調(diào)劑VARCHAR2(1)DEFAULT'0',一志愿NUMBER(4), 二志愿NUMBER(4), 錄取狀態(tài)VARCHAR2(1)DEFAULT'0', 錄取志愿VARCHAR2(1)DEFAULTNULLCHECK(錄取志愿IN('1','2','3')), 錄取院校NUMBER(4)DEFAULTNULL, 錄取日期DATE, 操作人VARCHAR2(10), CONSTRAINTFK_1FOREIGNKEY(一志愿)REFERENCESCOLLEGE(院校編號(hào)),CONSTRAINTFK_2FOREIGNKEY(二志愿)REFERENCESCOLLEGE(院校編號(hào)), CONSTRAINTFK_3FOREIGNKEY(錄取院校)REFERENCESCOLLEGE(院校編號(hào)) ); 3.?dāng)?shù)據(jù)的插入 在插入數(shù)據(jù)中使用序列,可自動(dòng)生成考生編號(hào)。 步驟1:創(chuàng)立序列STUNO_SQU: CREATESEQUENCESTUNO_SQU STARTWITH10001 INCREMENTBY1 NOCACHE NOCYCLE;步驟2:使用以下腳本插入50名虛擬考生數(shù)據(jù):INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'陳文政','1',598,1010,1001,'0');INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'李敏','2',460,1009,1010,'1');INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑)VALUES(STUNO_SQU.NEXTVAL,‘黃賓’,‘1’,627,1001,1002,‘0’);INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'張曉羽','2',615,1002,1003,'1');INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'許小猛','1',534,1008,1009,'0');INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,‘楊煌’,‘1’,555,1005,1007,‘0’); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'陳麗明','2',587,1006,1008,'0'); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'尹文哲','1',455,1004,1010,'1');INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'段然','1',325,1010,1006,'1'); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'袁慧瑤','2',477,1009,1010,'0');
INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'羅卓群','2',367,1003,1008,'1');INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'張婷','2',665,1001,1009,'0'); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'李婷','2',585,1002,1003,'1'); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑)VALUES(STUNO_SQU.NEXTVAL,'林樹(shù)金','1',600,1005,1006,'1'); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,‘吳岳’,‘2’,525,1009,1010,‘0’); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'周易','2',485,1010,1009,'0');INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'羅慣通','1',585,1007,1008,'1'); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'石海林','2',555,1005,1009,'0'); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑)VALUES(STUNO_SQU.NEXTVAL,'李旋','2',595,1002,1004,'1'); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,‘張建鋒’,‘1’,688,1001,1002,‘0’); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'何健飛','1',689,1001,1002,'0'); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑)VALUES(STUNO_SQU.NEXTVAL,'徐子釗','1',600,1001,1003,'0'); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,‘張慶旭’,‘1’,490,1008,1010,‘1’); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'張蠟','1',502,1008,1009,'1');NSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,‘李香’,‘2’,600,1003,1004,‘0’); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'陳襯歡','2',300,1009,1010,'0'); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'胡笛','2',610,1001,1002,'1'); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,‘舒娜’,‘2’,560,1003,1004,‘0’); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'普偉','1',519,1004,1009,'1'); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'國(guó)丹丹','2',415,1009,1010,'0'); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'李冠軍','1',610,1005,1007,'0'); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑)VALUES(STUNO_SQU.NEXTVAL,'郭亞軍','1',588,1004,1006,'0'); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'陳兵','1',498,1010,1008,'1'); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'洪智力','1',378,1003,1005,'1');INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'李麗','2',609,1002,1006,'0'); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'吳子俊','1',600,1002,1005,'1'); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑)VALUES(STUNO_SQU.NEXTVAL,'黃炎炎','1',507,1009,1008,'0'); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'黃源源','2',540,1008,1010,'1'); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'曹萬(wàn)吉','2',617,1003,1004,'0');INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,‘謝敏’,‘2’,348,1005,1006,‘1’); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'林晨曦','1',532,1007,1008,'1'); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑)VALUES(STUNO_SQU.NEXTVAL,'鄧樹(shù)林','2',485,1002,1009,'0'); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,‘邱雨林’,‘2’,608,1006,1008,‘0’); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'唐文文','1',582,1008,1009,'0');INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'張韋','2',555,1005,1007,'1'); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'胡月','2',557,1007,1009,'1'); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'高飛云','2',540,1005,1006,'0');INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'陸文浩','1',550,1006,1010,'1'); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'孫慶','2',630,1001,1002,'1'); INSERTINTOSTUDENT(編號(hào),姓名,性別,總分,一志愿,二志愿,同意調(diào)劑) VALUES(STUNO_SQU.NEXTVAL,'王聰','1',605,1003,1004,'0'); COMMIT;說(shuō)明:以第二個(gè)考生為例:編號(hào)由序列生成,為10002;姓名李敏;性別為2,表示女;總分460;一志愿1009,即深圳大學(xué);二志愿1010,即深圳職業(yè)技術(shù)學(xué)院。其他字段取默認(rèn)值。參照表10-2,那么錄取狀態(tài)默認(rèn)為0,表示未錄取。 注意:插入的數(shù)據(jù)如果違反約束條件就會(huì)發(fā)生錯(cuò)誤。
經(jīng)檢查發(fā)現(xiàn)考生10045的成績(jī)輸入錯(cuò)誤,不是555而應(yīng)該為553,通過(guò)以下查詢(xún)予以修改。 UPDATESTDUENTSET總分=553WHERE編號(hào)=10045; COMMIT; 執(zhí)行結(jié)果: 已更新1行。 提交完成。4.檢查插入的數(shù)據(jù) 使用以下查詢(xún)檢查插入的數(shù)據(jù): SELECT*fromSTUDENT 執(zhí)行結(jié)果略。5.通過(guò)聯(lián)合查詢(xún)檢查考生的志愿 由于填報(bào)志愿時(shí),考生信息表中填寫(xiě)的是院校編號(hào),需要通過(guò)相等連接才能顯示院校名稱(chēng)。以一志愿為例,顯示考生姓名和報(bào)考的一志愿院校名稱(chēng): SELECT姓名,總分,院校名稱(chēng)FROMstudents,collegecWHEREs.一志愿=c.院校編號(hào); 執(zhí)行結(jié)果: 姓名總分院校名稱(chēng) ----------------------------------------------------------------------陳文政598深圳職業(yè)技術(shù)學(xué)院 李敏460深圳大學(xué) 黃賓627清華大學(xué) 張曉羽615北京大學(xué) 許小猛534暨南大學(xué) 楊煌555復(fù)旦大學(xué) 陳麗明587中山大學(xué) 尹文哲455華南科技大學(xué) 段然325深圳職業(yè)技術(shù)學(xué)院 袁慧瑤477深圳大學(xué)創(chuàng)立視圖 一旦建立視圖,通過(guò)直接對(duì)視圖進(jìn)行查詢(xún)而不是對(duì)基表進(jìn)行查詢(xún),可以實(shí)現(xiàn)對(duì)數(shù)據(jù)的保護(hù),并簡(jiǎn)化操作。同時(shí)可建立視圖的同義詞,用于為復(fù)雜對(duì)象名生成一個(gè)簡(jiǎn)化和便于記憶的別名??紤]建立如表3所示的視圖。表3視圖序號(hào)視圖名稱(chēng)同義詞作用1考生成績(jī)SCORE查看學(xué)生的成績(jī)2錄取考生RESULT查看已錄取考生3錄取情況STATUS查看錄取沒(méi)有完成的院??忌煽?jī)視圖 基表:STUDENT。 結(jié)構(gòu):考生成績(jī)(編號(hào),姓名,總分),只讀視圖。 功能:為了方便查看學(xué)生的成績(jī),建立學(xué)生成績(jī)視圖,顯示全部學(xué)生的考號(hào)、姓名和成績(jī)。 步驟1:創(chuàng)立視圖: CREATEVIEW考生成績(jī)(編號(hào),姓名,總分) ASSELECT編號(hào),姓名,總分FROMstudent WITHREADONLY;步驟2:生成考生成績(jī)視圖的同義詞score: CREATESYNONYMSCOREFOR考生成績(jī); 2.錄取考生視圖 基表:STUDENT和COLLEGE。 結(jié)構(gòu):錄取考生(編號(hào),姓名,院校名稱(chēng)),條件是只顯示錄取的考生信息,只讀視圖。需要通過(guò)建立相等連接來(lái)實(shí)現(xiàn)。 功能:為了方便查看學(xué)生的錄取結(jié)果,建立錄取學(xué)生的視圖,顯示被錄取學(xué)生的考號(hào)、姓名和錄取院校名稱(chēng)。步驟1:建立視圖: CREATEVIEW錄取考生(編號(hào),姓名,錄取院校名稱(chēng)) ASSELECT編號(hào),姓名,院校名稱(chēng)FROMstudent,college WHERE錄取狀態(tài)='1'ANDstudent.錄取院校=college.院校編號(hào) WITHREADONLY; 步驟2:生成錄取考生視圖的同義詞RESULT: CREATESYNONYMRESULTFOR錄取考生;3.錄取情況視圖 基表:COLLEGE。 結(jié)構(gòu):錄取情況(院校編號(hào),院校名稱(chēng),狀態(tài),招生人數(shù),缺額),只讀視圖。 功能:顯示招生方案完成情況,方案招生人數(shù)和錄取的缺額。 步驟1:創(chuàng)立視圖: CREATEVIEW錄取情況(院校編號(hào),院校名稱(chēng),狀態(tài),招生人數(shù),缺額) ASSELECT院校編號(hào),院校名稱(chēng),DECODE(SIGN(招生人數(shù)-錄取人數(shù)),1,'未完成','完成'),招生人數(shù),招生人數(shù)-錄取人數(shù) FROMcollegeWITHREADONLY;步驟2:生成錄取情況視圖的同義詞STATUS: CREATESYNONYMSTATUSFOR錄取情況;
說(shuō)明:SIGN函數(shù)返回算術(shù)運(yùn)算結(jié)果的符號(hào),結(jié)果大于0返回1,等于0返回0,小于0返回-1。如果招生人數(shù)大于錄取人數(shù),那么表達(dá)式SIGN(招生人數(shù)-錄取人數(shù))的結(jié)果為1。此時(shí),DECODE函數(shù)返回“未完成”;否那么返回“完成”。3應(yīng)用程序的設(shè)計(jì)和實(shí)現(xiàn)3.1函數(shù)的創(chuàng)立 首先要建立一些函數(shù),以便其他模塊或查詢(xún)引用。設(shè)計(jì)如表4所示的函數(shù)。表4函數(shù)序號(hào)函數(shù)名稱(chēng)作用1GET_STUDENT_NAME通過(guò)考號(hào)獲得考生姓名,如不存在,那么返回“無(wú)”2GET_SCORE通過(guò)考號(hào)獲得考生成績(jī),如不存在,那么返回-13GET_COLLEGE_NAME通過(guò)院校編號(hào)獲得院校名稱(chēng),如不存在,那么返回“無(wú)”返回考生姓名函數(shù)GET_STUDENT_NAME 函數(shù)名和參數(shù):GET_STUDENT_NAME(P_BH)。 該函數(shù)的返回值類(lèi)型為VARCHAR2。其中,P_BH代表考生編號(hào)。 功能:通過(guò)考生的編號(hào)獲得考生的姓名。 返回考生名稱(chēng)函數(shù)如下:
CREATEFUNCTIONGET_STUDENT_NAME(P_BHNUMBER) RETURNVARCHAR2AS V_NAMEVARCHAR2(10); BEGIN SELECT姓名INTOV_NAMEFROMSTUDENTWHERE編號(hào)=P_BH; RETURN(V_NAME); EXCEPTION WHENOTHERSTHEN RETURN('無(wú)'); END;返回考生成績(jī)函數(shù)GET_SCORE 函數(shù)名和參數(shù):GET_SCORE(P_BH)。 該函數(shù)的返回值類(lèi)型為NUMBER。其中,P_BH代表考生編號(hào)。 功能:通過(guò)考生的編號(hào)獲得考生的總分。 返回考生成績(jī)函數(shù)如下: CREATEFUNCTIONGET_SCORE(P_BHNUMBER) RETURNNUMBER ASV_SCORENUMBER(3); BEGIN SELECT總分INTOV_SCOREFROMSCOREWHERE編號(hào)=P_BH; RETURN(V_SCORE); EXCEPTION WHENOTHERSTHEN RETURN(-1); END;
注意:分?jǐn)?shù)直接從考生成績(jī)視圖中取得,SCORE為考生成績(jī)視圖的同義詞。返回院校名稱(chēng)函數(shù)GET_COLLEGE_NAME 函數(shù)名和參數(shù):GET_COLLEGE_NAME(P_BH) 該函數(shù)的返回值類(lèi)型為VARCHAR2。其中,P_BH代表院校編號(hào)。 功能:通過(guò)院校的編號(hào)獲得院校名稱(chēng)。 返回院校名稱(chēng)函數(shù)如下:
CREATEFUNCTIONGET_COLLEGE_NAME(P_BHNUMBER) RETURNVARCHAR2AS V_NAMEVARCHAR2(30); BEGIN SELECT院校名稱(chēng)INTOV_NAMEFROMCOLLEGEWHERE院校編號(hào)=P_BH; RETURN(V_NAME); EXCEPTION WHENOTHERSTHEN RETURN('無(wú)'); END;3.2存儲(chǔ)過(guò)程的創(chuàng)立 系統(tǒng)的功能通過(guò)存儲(chǔ)過(guò)程來(lái)完成??紤]建立如表5所示的存儲(chǔ)過(guò)程。表5存儲(chǔ)過(guò)程序號(hào)過(guò)程名稱(chēng)作用1INPUT_COLLEGE輸入院校記錄到院校表2INPUT_STUDENT輸入考生記錄到考生表3CLEARSTATUS初始化、去除考生錄取狀態(tài)4PROC1一志愿投檔5PROC2二志愿投檔6AUTOPROC自動(dòng)投檔7SHOW_SCORE查詢(xún)考生分?jǐn)?shù)8SHOW_RESULT查詢(xún)考生錄取狀態(tài)9STUDENT_LIST院校錄取考生列表10COLLEGE_TOTAL統(tǒng)計(jì)院校錄取信息插入院校存儲(chǔ)過(guò)程INPUT_COLLEGE 過(guò)程名和參數(shù): INPUT_COLLEGE(P_YXBH,P_YXMC,P_LQFSX,P_ZSRS) 其中,P_YXBH代表院校編號(hào),P_YXMC代表院校名稱(chēng),P_LQFSX表示錄取分?jǐn)?shù)線(xiàn),P_ZSRS表示招生人數(shù)。功能:該過(guò)程用于建立院校信息。每次執(zhí)行時(shí)插入一個(gè)院校,局部字段的內(nèi)容通過(guò)參數(shù)傳遞,沒(méi)有指定參數(shù)的字段取字段的默認(rèn)值。插入院校程序如下: 步驟1:輸入和調(diào)試以下存儲(chǔ)過(guò)程: CREATEPROCEDUREINPUT_COLLEGE (V_YXBHINNUMBER,V_YXMCINVARCHAR2,V_LQFSXINNUMBER,V_ZSRSINNUMBER) AS RNUMBER; BEGINSELECTCOUNT(*)INTORFROMCOLLEGEWHERE院校編號(hào)=V_YXBH; IFR>0THEN DBMS_OUTPUT.PUT_LINE('院校'||V_YXBH||'已經(jīng)存在!'); ELSE INSERTINTOCOLLEGE VALUES(V_YXBH,V_YXMC,V_LQFSX,V_ZSRS,0); COMMIT; DBMS_OUTPUT.PUT_LINE('院校'||V_YXMC||'插入成功!'); ENDIF;EXCEPTION WHENOTHERSTHEN DBMS_OUTPUT.PUT_LINE('院校'||V_YXMC||'插入失敗!'); END; 步驟2:執(zhí)行該存儲(chǔ)過(guò)程: EXECUTEINPUT_COLLEGE(1011,'吉林大學(xué)',570,6); 執(zhí)行結(jié)果: 院校吉林大學(xué)插入成功! PL/SQL過(guò)程已成功完成。說(shuō)明:如果院校編號(hào)已經(jīng)存在,那么提示不能插入。通過(guò)存儲(chǔ)過(guò)程插入考生,可以正確顯示插入過(guò)程的錯(cuò)誤信息。插入考生存儲(chǔ)過(guò)程INPUT_STUDENT 過(guò)程名和參數(shù): INPUT_STUDENT(P_KSXM,P_XB,P_ZF,P_TYTJ,P_ZY1,P_ZY2) 其中,P_KSXM代表考生姓名,P_XB代表考生性別,P_ZF代表考生高考分?jǐn)?shù),P_TYTJ代表是否同意調(diào)劑,P_ZY1代表考生報(bào)考的一志愿院校編號(hào),P_ZY2代表考生報(bào)考的二志愿院校編號(hào)。功能:該過(guò)程用于輸入考生信息。每次執(zhí)行時(shí)插入一個(gè)考生,局部字段的內(nèi)容通過(guò)參數(shù)傳遞,沒(méi)有指定參數(shù)的字段取字段的默認(rèn)值,考生編號(hào)取自序列。 程序略,可以參照插入院校過(guò)程。投檔初始化過(guò)程CLEARSTATUS 過(guò)程名和參數(shù): CLEARSTATUS功能:該過(guò)程用于在每次開(kāi)始模擬錄取前對(duì)考生和院校表進(jìn)行狀態(tài)初始化。具體功能包括:清空COLLEGE表的錄取人數(shù);設(shè)置STUDENT表所有考生的錄取狀態(tài)為0(未錄取),錄取院校為空,錄取志愿為空,錄取日期為空,操作人為空。 初始化程序如下: CREATEPROCEDURECLEARSTATUS AS BEGINUPDATECOLLEGESET錄取人數(shù)=0; UPDATESTUDENTSET錄取狀態(tài)=0,錄取志愿=NULL,錄取院校=NULL,錄取日期=NULL,操作人=NULL; COMMIT; END;一志愿投檔存儲(chǔ)過(guò)程PROC1 過(guò)程名和參數(shù): PROC1(P_YXBH) 其中,參數(shù)P_YXBH代表要進(jìn)行一志愿投擋的院校編號(hào)。功能:該過(guò)程完成按照院校的要求對(duì)某院校進(jìn)行一志愿投檔錄取的過(guò)程。投檔時(shí)要指定院校編號(hào)作為參數(shù)。投檔過(guò)程是:對(duì)一志愿報(bào)考該院校的、分?jǐn)?shù)在最低錄取分?jǐn)?shù)線(xiàn)上的學(xué)生,按分?jǐn)?shù)進(jìn)行排序,根據(jù)招生人數(shù)取前幾名錄取。本次錄取的考生要回填狀態(tài)和錄取院校等信息,將考生信息表中錄取狀態(tài)改為錄取,并將院校編號(hào)和錄取志愿號(hào)(為1)填入考生表。同時(shí)將院校信息表中對(duì)應(yīng)的錄取人數(shù)做相應(yīng)的修改,將實(shí)際錄取的人數(shù)回填院校表的錄取人數(shù)字段。說(shuō)明:如果錄取沒(méi)有到達(dá)招生人數(shù),將由二志愿來(lái)補(bǔ)充。該過(guò)程一次完成一個(gè)院校的投檔。要一次完成所有院校的投檔,可使用后面的自動(dòng)投檔存儲(chǔ)過(guò)程。一志愿投檔程序如下: CREATEPROCEDUREPROC1(P_YXBHNUMBER) AS V_ZSRSNUMBER(3); V_LQFSXNUMBER(3); V_YXMCVARCHAR2(30); V_COUNTNUMBER(3); CURSORSTU_CURSORISSELECT*FROMSTUDENT WHERE一志愿=P_YXBHORDERBY總分DESC; BEGINSELECT招生人數(shù),錄取分?jǐn)?shù)線(xiàn),院校名稱(chēng)INTOV_ZSRS,V_LQFSX,V_YXMC FROMCOLLEGEWHERE院校編號(hào)=P_YXBH;--取院校信息 V_COUNT:=0; DBMS_OUTPUT.PUT_LINE('院校名稱(chēng):'||V_YXMC||'一志愿投檔開(kāi)始'); DBMS_OUTPUT.PUT_LINE('-------------------------------------------------'); FORSTU_RECINSTU_CURSORLOOP EXITWHENV_COUNT>=V_ZSRS; IF(STU_REC.總分>=V_LQFSX)THENUPDATESTUDENTSET錄取狀態(tài)='1',錄取志愿='1',錄取院校=P_YXBH,錄取日期=SYSDATE,操作人=USERWHERE編號(hào)=STU_REC.編號(hào); DBMS_OUTPUT.PUT_LINE('編號(hào):'||STU_REC.編號(hào)||'姓名:'||STU_REC.姓名||'總分:'||STU_REC.總分);V_COUNT:=V_COUNT+1; ENDIF; ENDLOOP; DBMS_OUTPUT.PUT_LINE('------------------------------------------------------------');UPDATECOLLEGESET錄取人數(shù)=V_COUNTWHERE院校編號(hào)=P_YXBH; COMMIT; END;
說(shuō)明:該過(guò)程按院校進(jìn)行一志愿投檔,游標(biāo)定義了一志愿報(bào)考該院校的按總分從高到低排序的所有考生信息。V_COUNT記錄錄取的人數(shù),初值為0,每當(dāng)錄取一個(gè)考生,那么加1。假設(shè)V_COUNT等于方案招生人數(shù),那么結(jié)束錄取。如果V_COUNT小于招生人數(shù),那么取游標(biāo)的下一個(gè)考生,判斷其分?jǐn)?shù)是否在該院校的最低錄取分?jǐn)?shù)線(xiàn)之上。如果滿(mǎn)足,那么標(biāo)記錄取狀態(tài)為1。錄取結(jié)束后,將錄取人數(shù)V_COUNT回填到院校表。二志愿投檔存儲(chǔ)過(guò)程PROC2 過(guò)程名和參數(shù): PROC2(P_YXBH) 其中,參數(shù)P_YXBH代表要進(jìn)行二志愿投檔的院校編號(hào)。 功能:該過(guò)程完成按照院校的要求對(duì)某院校進(jìn)行二志愿投檔和錄取的過(guò)程。投檔時(shí)要指定院校編號(hào)作為參數(shù)。過(guò)程是:對(duì)二志愿報(bào)考該院校且還沒(méi)有錄取的(去掉一志愿錄取的考生)、分?jǐn)?shù)在最低錄取分?jǐn)?shù)線(xiàn)上的學(xué)生,按分?jǐn)?shù)進(jìn)行排序,根據(jù)缺額(招生人數(shù)去掉錄取人數(shù))取前幾名錄取。本次錄取的考生要回填狀態(tài)和錄取院校等信息,將考生信息表中錄取狀態(tài)改為錄取,并將院校編號(hào)、錄取志愿號(hào)(為2)填入考生表。同時(shí)將院校信息表中對(duì)應(yīng)的錄取人數(shù)做相應(yīng)的修改,將實(shí)際錄取的人數(shù)回填院校表的錄取人數(shù)字段。 說(shuō)明:如果沒(méi)有到達(dá)招生人數(shù),將由調(diào)劑錄取來(lái)補(bǔ)充。該過(guò)程一次完成一個(gè)院校的投檔。要一次完成所有院校的投檔,可使用后面的自動(dòng)投檔存儲(chǔ)過(guò)程。二志愿投檔程序如下: CREATEPROCEDUREPROC2(P_YXBHNUMBER) AS V_ZSRSNUMBER(3); V_LQFSXNUMBER(3); V_YXMCVARCHAR2(30); V_LQRSNUMBER(3); V_COUNTNUMBER(3); CURSORSTU_CURSORISSELECT*FROMSTUDENT WHERE二志愿=P_YXBHAND錄取狀態(tài)=0 ORDERBY總分DESC; BEGIN SELECT招生人數(shù),錄取分?jǐn)?shù)線(xiàn),錄取人數(shù),院校名稱(chēng)INTOV_ZSRS,V_LQFSX,V_LQRS,V_YXMC FROMCOLLEGEWHERE院校編號(hào)=P_YXBH; V_COUNT:=V_LQRS; DBMS_OUTPUT.PUT_LINE('院校名稱(chēng):'||V_YXMC||'二志愿投檔開(kāi)始');DBMS_OUTPUT.PUT_LINE('-------------------------------------------------'); FORSTU_RECINSTU_CURSORLOOP EXITWHENV_COUNT>=V_ZSRS; IF(STU_REC.總分>=V_LQFSX)THEN UPDATESTUDENTSET錄取狀態(tài)='1',錄取志愿='2',錄取院校=P_YXBH,錄取日期=SYSDATE, 操作人=USERWHERE編號(hào)=STU_REC.編號(hào);DBMS_OUTPUT.PUT_LINE('編號(hào):'||STU_REC.編號(hào)||'姓名:'||STU_REC.姓名||'總分:'||STU_REC.總分); V_COUNT:=V_COUNT+1; ENDIF; ENDLOOP; DBMS_OUTPUT.PUT_LINE('------------------------------------------------------------'); UPDATECOLLEGESET錄取人數(shù)=V_COUNTWHERE院校編號(hào)=P_YXBH; COMMIT; END;說(shuō)明:該過(guò)程按院校進(jìn)行二志愿投檔,游標(biāo)定義了二志愿報(bào)考該院校且錄取狀態(tài)為0(未錄取)的、按總分從高到低排序的所有考生信息。V_COUNT記錄錄取的人數(shù),初值為一志愿已經(jīng)錄取的人數(shù),每當(dāng)錄取一個(gè)考生,那么V_COUNT加1。假設(shè)V_COUNT等于方案招生人數(shù),那么結(jié)束錄取。如果V_COUNT小于招生人數(shù),那么取游標(biāo)的下一個(gè)考生,判斷其分?jǐn)?shù)是否在該院校的最低錄取分?jǐn)?shù)線(xiàn)上。如果滿(mǎn)足,那么標(biāo)記錄取狀態(tài)為1。錄取結(jié)束后,將錄取人數(shù)V_COUNT回填到院校表。自動(dòng)投檔程序AUTOPROC 過(guò)程名和參數(shù): AUTOPROC(P_LQZY) 其中,P_LQZY代表要進(jìn)行錄取的志愿,只能是1或2,1代表一志愿,2代表二志愿。 功能:該過(guò)程根據(jù)選定志愿,循環(huán)對(duì)所有院校進(jìn)行投檔,即對(duì)所有院校循環(huán)調(diào)用PROC1或PROC2。一次完成所有院校的一志愿或二志愿投檔。自動(dòng)投檔程序如下: CREATEPROCEDUREAUTOPROC(P_LQZYNUMBER) AS CURSORCOLLEGE_CURSORISSELECT院校編號(hào)FROMCOLLEGE; BEGIN FORCOLLEGE_RECINCOLLEGE_CURSOR LOOP IF(P_LQZY=1)THEN PROC1(COLLEGE_REC.院校編號(hào));ELSIF(P_LQZY=2)THEN PROC2(COLLEGE_REC.院校編號(hào)); ENDIF; ENDLOOP; END;
說(shuō)明:定義一個(gè)取所有院校編號(hào)的游標(biāo)COLLEGE_CURSOR,根據(jù)志愿(參數(shù)為1或2),在游標(biāo)循環(huán)中以取得的院校編號(hào)為參數(shù),調(diào)用一志愿或二志愿投檔過(guò)程。查詢(xún)考生分?jǐn)?shù)過(guò)程SHOW_SCORE 過(guò)程名和參數(shù): SHOW_SCORE(P_BH) 其中,P_BH代表考生編號(hào)。 功能:給出考生的考號(hào),返回考生的高考成績(jī)。 查詢(xún)考生分?jǐn)?shù)程序如下: CREATEPROCEDURESHOW_SCORE(P_BHNUMBER) AS V_SCORENUMBER(3); BEGIN V_SCORE:=GET_SCORE(P_BH); IFV_SCORE=-1THEN DBMS_OUTPUT.PUT_LINE('考生編號(hào)錯(cuò)誤!'); ELSE DBMS_OUTPUT.PUT_LINE(''||GET_STUDENT_NAME(P_BH)||'總分'||V_SCORE); ENDIF; END;
說(shuō)明:本過(guò)程調(diào)用返回考生姓名和分?jǐn)?shù)的函數(shù)GET_STUDENT_NAME和GET_SCORE。查詢(xún)考生錄取狀態(tài)過(guò)程SHOW_RESULT 過(guò)程名和參數(shù): SHOW_RUSULT(P_BH) 其中,P_BH代表考生編號(hào)。 功能:給出考生的考號(hào),返回錄取院校名稱(chēng)。如果沒(méi)有錄取,那么返回“未被錄取”。 查詢(xún)考生錄取狀態(tài)程序如下: CREATEPROCEDURESHOW_RESULT(P_BHNUMBER)AS V_LQYXMCVARCHAR2(20); V_XMVARCHAR2(10); BEGIN V_XM:=GET_STUDENT_NAME(P_BH); IFV_XM='無(wú)'THEN DBMS_OUTPUT.PUT_LINE('考生編號(hào)錯(cuò)誤!'); ELSE SELECT錄取院校名稱(chēng)INTOV_LQYXMC FROMRESULTWHERE編號(hào)=P_BH;DBMS_OUTPUT.PUT_LINE('考生'||V_XM||'被'||V_LQYXMC||'錄??!'); ENDIF; EXCEPTION WHENOTHERSTHEN DBMS_OUTPUT.PUT_LINE('考生'||V_XM||'未被錄??!'); END;
說(shuō)明:查詢(xún)錄取考生視圖RESULT,如果考生在視圖中不存在,那么表示未被錄取。此過(guò)程中調(diào)用了前面定義的函數(shù)GET_STUDENT_NAME以獲得考生名稱(chēng)。9.顯示院校錄取名冊(cè)存儲(chǔ)過(guò)程STUDENT_LIST 過(guò)程名和參數(shù): STUDENT_LIST(P_YXBH) 其中,P_YXBH表示院校編號(hào)。 功能:指定院校編號(hào),顯示按分?jǐn)?shù)排序的統(tǒng)計(jì)報(bào)表: CREATEPROCEDURESTUDENT_LIST(P_YXBHNUMBER) AS V_SNAMEVARCHAR2(10); V_MAXNUMBER(3); V_MINNUMBER(3);COL_RECCOLLEGE%ROWTYPE; CURSORSTU_CURSORISSELECT*FROMSTUDENTWHERE錄取院校=P_YXBHORDERBY總分DESC; BEGIN SELECT*INTOCOL_RECFROMCOLLEGEWHERE院校編號(hào)=P_YXBH; DBMS_OUTPUT.PUT_LINE(GET_COLLEGE_NAME(P_YXBH)||'院校錄取統(tǒng)計(jì)表'); DBMS_OUTPUT.PUT_LINE('招生人數(shù):'||COL_REC.招生人數(shù)||'錄取人數(shù):'||COL_REC.錄取人數(shù)||'錄取分?jǐn)?shù)線(xiàn):'||COL_REC.錄取分?jǐn)?shù)線(xiàn));DBMS_OUTPUT.PUT_LINE('----------------------------------------------------------------------') DBMS_OUTPUT.PUT_LINE('序號(hào)考生編號(hào)姓名性別總分錄取志愿錄取日期'); FORSTU_RECINSTU_CURSORLOOP IFSTU_REC.性別=1THEN DBMS_OUTPUT.PUT_LINE(RPAD(STU_CURSOR%ROWCOUNT,8,'')||RPAD(STU_REC編號(hào),9,'')||RPAD(STU_REC.姓名,9,'')||'男||RPAD(STU_REC.總分,9,'')||RPAD(STU_REC.錄取志愿,9,'')||RPAD (STU_REC.錄取日期,9,''));ELSE DBMS_OUTPUT.PUT_LINE(RPAD(STU_CURSOR%ROWCOUNT,8,'')||RPAD(STU_REC.編號(hào),9,'')||RPAD(STU_REC.姓名,9,'')||'女'||RPAD(STU_REC.總分,9,'')||RPAD(STU_REC.錄取志愿,9,'')||RPAD (STU_REC.錄取日期,9,'')); ENDIF; ENDLOOP; DBMS_OUTPUT.PUT_LINE('--------------------------------------------------------------------'); SELECTMAX(總分),MIN(總分)INTOV_MAX,V_MINFROMSTUDENTWHERE錄取院校=P_YXBH; DBMS_OUTPUT.PUT_LINE('最高分'||V_MAX||'最低分:'||V_MIN); END;
說(shuō)明:把院校編號(hào)作為條件,檢索出被某個(gè)院校錄取的考生,并按分?jǐn)?shù)排序。其中,性別顯示需要進(jìn)行轉(zhuǎn)換。過(guò)程中,使用了RPAD函數(shù)產(chǎn)生相等的列寬。在列表之后,通過(guò)統(tǒng)計(jì)查詢(xún),顯示最高分和最低分。院校招生情況統(tǒng)計(jì)表COLLEGE_TOTAL 過(guò)程名和參數(shù): COLLEGE_TOTAL 功能:按照院校的平均錄取分?jǐn)?shù)排序所有院校,統(tǒng)計(jì)各院校的最高分?jǐn)?shù)、最低分?jǐn)?shù),招生人數(shù)、錄取人數(shù)、男生人數(shù)、女生人數(shù)等信息。 院校招生情況統(tǒng)計(jì)程序如下: CREATEPROCEDURECOLLEGE_TOTAL ASV_YXBHNUMBER(4); V_AVGNUMBER(4); V_MAXNUMBER(4); V_MINNUMBER(4); V_BOYNUMBER(3); V_GIRLNUMBER(3); V_ZSRSNUMBER(3); V_LQRSNUMBER(3); V_YXMCVARCHAR2(20); CURSORSTU_CURSORIS SELECT錄取院校,AVG(總分),MAX(總分),MIN(總分)FROMSTUDENTGROUPBY錄取院校ORDERBYAVG(總分)DESC;BEGIN DBMS_OUTPUT.PUT_LINE('院校編號(hào)院校名稱(chēng)招生人數(shù)錄取人數(shù)男生人數(shù)女生人數(shù)最高分?jǐn)?shù)最低分?jǐn)?shù)平均分?jǐn)?shù)'); OPENSTU_CURSOR; LOOP FETCHSTU_CURSORINTO V_YXBH,V_AVG,V_MAX,V_MIN; EXITWHENSTU_CURSOR%NOTFOUND; IFV_YXBHISNOTNULLTHEN SELECT院校名稱(chēng),招生人數(shù),錄取人數(shù)INTOV_YXMC,V_ZSRS,V_LQRSFROMCOLLEGEWHERE院校編號(hào)=V_YXBH; SELECTCOUNT(*)INTOV_BOYFROMSTUDENTWHERE錄取院校=V_YXBHAND性別=1; SELECTCOUNT(*)INTOV_GIRLFROMSTUDENTWHERE錄取院校=V_YXBHAND性別=2; DBMS_OUTPUT.PUT_LINE(RPAD(V_YXBH,8,'')||RPAD(V_YXMC,18,'')||RPAD(V_ZSRS,9,'')||RPAD(V_LQRS,9,'')||RPAD(V_BOY,9,'')||RPAD(V_GIRL,9,'')||RPAD(V_MAX,9,'')||RPAD(V_MIN,9,'')||RPAD(V_AVG,9,''));ENDIF; ENDLOOP; CLOSESTU_CURSOR; END; 說(shuō)明:統(tǒng)計(jì)工作主要是通過(guò)一個(gè)按錄取院校分組的查詢(xún)游標(biāo)來(lái)完成的。在分組查詢(xún)中統(tǒng)計(jì)院校的平均分?jǐn)?shù)、最高分和最低分,并按照平均分排序。其他信息在游標(biāo)循環(huán)中根據(jù)院校編號(hào)通過(guò)查詢(xún)語(yǔ)句得到。3.3觸發(fā)器的設(shè)計(jì) 通過(guò)觸發(fā)器可以為數(shù)據(jù)提供進(jìn)一步的保護(hù)。下面設(shè)計(jì)兩種常見(jiàn)類(lèi)型的觸發(fā)器。 1.分?jǐn)?shù)修改觸發(fā)器 如果要自動(dòng)記錄對(duì)數(shù)據(jù)庫(kù)的數(shù)據(jù)進(jìn)行的某些操作,可以通過(guò)創(chuàng)立觸發(fā)器來(lái)實(shí)現(xiàn)。在考生數(shù)據(jù)庫(kù)中,高考的分?jǐn)?shù)字段的內(nèi)容十分重要,是錄取的最重要依據(jù),應(yīng)該正確設(shè)置對(duì)其進(jìn)行操作的權(quán)限,并做好操作的記錄。權(quán)限可以通過(guò)設(shè)定特定權(quán)限的賬戶(hù)進(jìn)行控制,記錄操作可以通過(guò)觸發(fā)器來(lái)實(shí)現(xiàn)。通過(guò)觸發(fā)器來(lái)記錄對(duì)考生表高考分?jǐn)?shù)字段的插入、刪除和修改操作,記錄的內(nèi)容可以包括:操作時(shí)間、操作人賬戶(hù)、執(zhí)行的操作、考生編號(hào)、原分?jǐn)?shù)和修改后的分?jǐn)?shù)。以上內(nèi)容記錄到表OPERATION_LOG。表6OPERATION_LOG表的結(jié)構(gòu)字段名稱(chēng)類(lèi)型寬度約束條件簡(jiǎn)要說(shuō)明序號(hào)number10主鍵記錄編號(hào),從1開(kāi)始遞增,取自序列賬戶(hù)varchar215不允許為空操作人賬戶(hù)時(shí)間date操作時(shí)間,取自SYSDATE操作varchar210操作種類(lèi)考生編號(hào)number5考生編號(hào)原分?jǐn)?shù)number3修改前的分?jǐn)?shù)新分?jǐn)?shù)number3修改后的分?jǐn)?shù)步驟1:創(chuàng)立如下的記錄表OPERATION_LOGS: CREATETABLEOPERATION_LOG( 序號(hào)NUMBER(10)PRIMARYKEY, 賬戶(hù)VARCHAR2(15)NOTNULL, 時(shí)間DATE, 操作VARCHAR2(10), 考生編號(hào)NUMBER(5), 原分?jǐn)?shù)NUMBER(3), 新分?jǐn)?shù)NUMBER(3) );步驟2:創(chuàng)立一個(gè)主鍵序列OPERATION_ID: CREATESEQUENCEOPERATION_IDINCREMENTBY1 STARTWITH1MAXVALUE9999999NOCYCLENOCACHE; 步驟3:創(chuàng)立和編譯以下觸發(fā)器: CREATETRIGGEROPERATION BEFORE--觸發(fā)時(shí)間為操作前 DELETEORINSERTORUPDATEOF總分--由三種事件觸發(fā) ONSTUDENTFOREACHROW--行級(jí)觸發(fā)器 BEGIN IFINSERTINGTHEN INSERTINTOOPERATION_LOG VALUES(OPERATION_ID.NEXTVAL,USER,SYSDATE,'插入',:NEW.編號(hào),NULL,:NEW.總分); ELSIFDELETINGTHEN INSERTINTOOPERATION_LOGVALUES(OPERATION_ID.NEXTVAL,USER,SYSDATE,'刪除',:OLD.編號(hào),:OLD.總分,NULL); ELSE INSERTINTOOPERATION_LOG VALUES(OPERATION_ID.NEXTVAL,USER,SYSDATE,'修改',:OLD.編號(hào),:OLD.總分,:NEW.總分); ENDIF; END; 說(shuō)明:可參考觸發(fā)器一章的相同類(lèi)型觸發(fā)器。級(jí)聯(lián)修改觸發(fā)器 我們還可以創(chuàng)立級(jí)聯(lián)修改觸發(fā)器UPDATE_COLLEGE_NO,以實(shí)現(xiàn)如下的功能:當(dāng)修改院校的編號(hào)時(shí),自動(dòng)修改學(xué)生表中與院校編號(hào)關(guān)聯(lián)的字段內(nèi)容。學(xué)生表共有3個(gè)字段與院校編號(hào)關(guān)聯(lián),即一志愿,二志愿和錄取院校。 創(chuàng)立級(jí)聯(lián)修改觸發(fā)器:CREATETRIGGERUPDATE_COLLEGEAFTERUPDATEOF院校編號(hào)ONCOLLEGEFOREACHROW--行級(jí)觸發(fā)器BEGINUPDATESTUDENTSET一志愿=:NEW.院校編號(hào) WHERE一志愿=:OLD.院校編號(hào); UPDATESTUDENTSET二志愿=:NEW.院校編號(hào) WHERE二志愿=:OLD.院校編號(hào); UPDATESTUDENTSET錄取院校=:NEW.院校編號(hào)WHERE錄取院校=:OLD.院校編號(hào); END; 說(shuō)明:可參考觸發(fā)器一章的相同類(lèi)型觸發(fā)器。4系統(tǒng)的測(cè)試和運(yùn)行4.1運(yùn)行準(zhǔn)備 通過(guò)在SQL*Plus環(huán)境下使用SQL語(yǔ)句可以進(jìn)行多種查詢(xún),來(lái)輔助錄取過(guò)程獲得信息。如果有必要的話(huà),查詢(xún)也可以設(shè)計(jì)成為存儲(chǔ)過(guò)程,存儲(chǔ)在數(shù)據(jù)庫(kù)中,并可以進(jìn)行調(diào)用。在這里,比擬復(fù)雜不能通過(guò)SQL語(yǔ)句實(shí)現(xiàn)的查詢(xún)或統(tǒng)計(jì)將通過(guò)存儲(chǔ)過(guò)程或函數(shù)來(lái)實(shí)現(xiàn)。直接使用查詢(xún)是進(jìn)行測(cè)試的一種很好的方法,在這里也列出了一些可能用到的查詢(xún)。在投檔前可以進(jìn)行以下的查詢(xún)。 1.按姓名進(jìn)行模糊查詢(xún) 查找姓王的考生: SELECT編號(hào),姓名,性別,總分FROMSTUDENTWHERE姓名LIKE‘王%’;執(zhí)行結(jié)果: 編號(hào)姓名性總分 ---------------------------------------------------------- 10100王聰1605 說(shuō)明:姓王的考生只有王聰一個(gè)人。2.按分?jǐn)?shù)或分?jǐn)?shù)段進(jìn)行查詢(xún) 查詢(xún)分?jǐn)?shù)在600~650分之間的考生: SELECT編號(hào),姓名,性別,總分FROMSTUDENTWHERE總分>600AND總分<650; 執(zhí)行結(jié)果: 編號(hào)姓名性總分 -----------------------------------------------------------10053黃賓162710054張曉羽261510077胡笛261010081李冠軍161010085李麗260910089曹萬(wàn)吉2617 10093邱雨林2608 10099孫慶2630 10100王聰1605 已選擇9行。 說(shuō)明:在600~650分之間有9名考生。3.查詢(xún)分?jǐn)?shù)最高的考生報(bào)考的院校 查詢(xún)分?jǐn)?shù)最高的考生一志愿報(bào)考的院校: SELECT編號(hào),姓名,性別,總分,院校名稱(chēng)FROMSTUDENTS,COLLEGECWHERES.一志愿=C.院校編號(hào)ANDS.總分=(SELECTMAX(總分)FROMSTUDENT); 執(zhí)行結(jié)果: 編號(hào)姓名性總分院校名稱(chēng)--------------------------------------------------------------------------------- 10071何健飛1689清華大學(xué) 說(shuō)明:使用了統(tǒng)計(jì)查詢(xún)和相等連接。分?jǐn)?shù)最高的考生一志愿報(bào)考了清華大學(xué)。4.查詢(xún)招生人數(shù)最多的院校 查詢(xún)招生人數(shù)最多的院校: SELECT院校名稱(chēng),招生人數(shù)FROMCOLLEGEWHERE招生人數(shù)=(SELECTMAX(招生人數(shù))FROMCOLLEGE); 執(zhí)行結(jié)果: 院校名稱(chēng)招生人數(shù) ------------------------------------------------------------- 深圳職業(yè)技術(shù)學(xué)院8 說(shuō)明:使用了子查詢(xún)。招生人數(shù)最多的院校是深圳職業(yè)技術(shù)學(xué)院。5.查詢(xún)考生分?jǐn)?shù) 查詢(xún)考生分?jǐn)?shù): EXECSHOW_SCORE(10005); 執(zhí)行結(jié)果: 考生許小猛總分534 PL/SQL過(guò)程已成功完成。 說(shuō)明:調(diào)用存儲(chǔ)過(guò)程并返回結(jié)果。編號(hào)為10005的考生許小猛,總分為534分。 6.檢查OPERATION觸發(fā)器的記錄 檢查OPERATION觸發(fā)器的記錄: SELECT*FROMOPERATION_LOG;執(zhí)行結(jié)果: ...100STUDENT28-3月-04插入10048550101STUDENT28-3月-04插入10049630102STUDENT28-3月-04插入10050605103STUDENT28-3月-04修改10045555553 說(shuō)明:結(jié)果中顯示了最近對(duì)STUDENT表的局部修改。通過(guò)最后一行可見(jiàn),曾經(jīng)將考生10045的總分由555改為553。4.2投檔過(guò)程 1.初始化 初始化程序?yàn)椋? SETSERVEROUTPUTONSIZE10000; EXECCLEARSTATUS; 執(zhí)行結(jié)果: PL/SQL過(guò)程已成功完成。 說(shuō)明:在每次重新開(kāi)始模擬投檔時(shí),都要先調(diào)用該過(guò)程進(jìn)行初始化,去除原來(lái)的錄取信息。2.一志愿自動(dòng)投檔 一志愿自動(dòng)投檔程序?yàn)椋? EXECAUTOPROC(1); 執(zhí)行結(jié)果: 院校名稱(chēng):清華大學(xué)一志愿投檔開(kāi)始 -------------------------------------------------編號(hào):10021姓名:何健飛總分:689編號(hào):10020姓名:張建鋒總分:688編號(hào):10012姓名:張婷總分:665編號(hào):10049姓名:孫慶總分:630編號(hào):10003姓名:黃賓總分:627------------------------------------------------院校名稱(chēng):北京大學(xué)一志愿投檔開(kāi)始-----------------------------------------------編號(hào):10004姓名:張曉羽總分:615編號(hào):10035姓名:李麗總分:609編號(hào):10036姓名:吳子俊總分:600-------------------------------------------------- 說(shuō)明:使用自動(dòng)投檔AUTOPROC進(jìn)行一志愿投檔,參數(shù)1代表一志愿投檔。如果使用PROC1進(jìn)行投檔,那么一次只能投檔一個(gè)院校。通過(guò)執(zhí)行結(jié)果可以看到,清華大學(xué)錄取了5人,北京大學(xué)錄取了3人。3.查詢(xún)考生錄取狀態(tài) 查詢(xún)考生錄取狀態(tài)的程序?yàn)椋? EXECSHOW_RESULT(10005); 執(zhí)行結(jié)果: 考生許小猛被暨南大學(xué)錄??! PL/SQL過(guò)程已成功完成。 說(shuō)明:查詢(xún)編號(hào)為10005的考生錄取狀態(tài),返回結(jié)果是許小猛被暨南大學(xué)錄取。4.二志愿自動(dòng)投檔
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025貴州師范大學(xué)輔導(dǎo)員考試試題及答案
- 2025贛州職業(yè)技術(shù)學(xué)院輔導(dǎo)員考試試題及答案
- 夏季溺水急救措施
- 西安聯(lián)豐迅聲信息科技有限公司招聘筆試題庫(kù)2025
- 手衛(wèi)生在產(chǎn)科的重要性
- 2025年咨詢(xún)工程師職業(yè)考試題及答案詳解
- 綠城誠(chéng)園戶(hù)型設(shè)計(jì)
- 電擊傷急救知識(shí)
- 2025年醫(yī)學(xué)影像學(xué)研究生入學(xué)考試試卷及答案
- 2025年藝術(shù)設(shè)計(jì)專(zhuān)業(yè)研究生入學(xué)考試試卷及答案
- 公路工程項(xiàng)目環(huán)境保護(hù)措施及其可行性論證
- 普通車(chē)床的主軸箱設(shè)計(jì)機(jī)械外文文獻(xiàn)翻譯、中英文翻譯、外文翻譯
- 神經(jīng)外科各種引流管的護(hù)理精品課件
- 隧道CRD法施工工法
- 遞進(jìn)式流程通用模板PPT
- 腦損傷病情觀察意識(shí)狀態(tài)的分級(jí)
- 請(qǐng)假通用員工請(qǐng)假單模板
- 八年級(jí)音樂(lè)下冊(cè) 第7單元《當(dāng)兵的人》好男兒就是要當(dāng)兵課件1 湘教版
- 褲類(lèi)統(tǒng)一單價(jià)表-服裝工序工價(jià)表
- 我們是共產(chǎn)主義接班人歌詞--拼音版本
- 麥凱66客戶(hù)檔案管理表格
評(píng)論
0/150
提交評(píng)論