數(shù)據(jù)庫課程設(shè)計機票預訂系統(tǒng)._第1頁
數(shù)據(jù)庫課程設(shè)計機票預訂系統(tǒng)._第2頁
數(shù)據(jù)庫課程設(shè)計機票預訂系統(tǒng)._第3頁
數(shù)據(jù)庫課程設(shè)計機票預訂系統(tǒng)._第4頁
數(shù)據(jù)庫課程設(shè)計機票預訂系統(tǒng)._第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、目 錄1 前言. . 12 需求分析 . . 12.1 課程設(shè)計目的 . 12.2 課程設(shè)計任務(wù) . 12.3 設(shè)計環(huán)境 . . 22.4 開發(fā)語言 . . 23 分析和設(shè)計 . . 23.1 系統(tǒng) E-R模型. 23.2 表空間及表的設(shè)計 . 33.3 視圖設(shè)計 . . 83.4 存儲過程、函數(shù)、包的設(shè)計 . 123.5 觸發(fā)器設(shè)計 . . 173.6 角色、用戶、權(quán)限設(shè)計 . 183.7 備份方案設(shè)計 . 194 課程設(shè)計總結(jié) . . 20參考文獻 . . 21致 謝. . 211 前言航空客運業(yè)務(wù)誕生已有近一個世紀了,作為現(xiàn)有交通工具中最方便快捷的一種,它確確實實地給民眾的生活、 出行帶

2、來了極大的方便。 隨著社會的進步, 人們的生活水平得到很大的提高, 民航的發(fā)展也很迅速, 乘坐飛機的旅客也大大增多。 假如現(xiàn)在沒有售票系統(tǒng),民航將也不會存在,人們的出行極大不便。換句話說,一個功能完善的機票預定信息管理系統(tǒng)對人們的日常生活已經(jīng)顯得尤其重要。現(xiàn)設(shè)計一個機票預定信息管理系統(tǒng)的數(shù)據(jù)庫。首先根據(jù)問題需求設(shè)計 E-R模型,包括幾個主要的實體,如航空公司、飛機、乘客、航班、機票、業(yè)務(wù)員等以及相關(guān)的聯(lián)系。然后再轉(zhuǎn)根據(jù) E-R模型設(shè)計出相應(yīng)的關(guān)系模型,對于關(guān)系模型的每一個關(guān)系,可以設(shè)計出相應(yīng)的表,接著分配表空間、創(chuàng)建視圖、設(shè)計存儲過程、函數(shù)和觸發(fā)器以及設(shè)計安全與備份策略。2 需求分析2.1 課

3、程設(shè)計目的通過專業(yè)課程設(shè)計, 即大型數(shù)據(jù)庫系統(tǒng)課程設(shè)計, 有助于培養(yǎng)學生綜合運用數(shù)據(jù)庫相關(guān)知識解決實際問題的能力。 本設(shè)計要求對實際問題進行需求分析, 提煉實際問題中的數(shù)據(jù), 建立關(guān)系模型, 并在大型數(shù)據(jù)庫中得以實現(xiàn)。 同時要求對數(shù)據(jù)庫的運營、管理及使用上進行必要的規(guī)劃和實現(xiàn)。2.2 課程設(shè)計任務(wù)系統(tǒng)需要管理以下主要信息:(1)航班基本信息,包括航班的編號、飛機名稱、機艙等級等。(2)機票信息,包括票價、折扣、當前預售狀態(tài)及經(jīng)手業(yè)務(wù)員等。(3)客戶基本信息,包括姓名、聯(lián)系方式、證件及號碼、付款情況等?;疽螅海?)根據(jù)需求,補充必要的數(shù)據(jù)庫實體,建立 E R模型,通過 ER圖表示。(2)在

4、Oracle中創(chuàng)建該系統(tǒng)的數(shù)據(jù)庫,并在數(shù)據(jù)庫中實現(xiàn)各表,寫入一定的數(shù)據(jù)。(3)從實際查詢應(yīng)用出發(fā),為一些主要的應(yīng)用模塊設(shè)計至少 3 個參數(shù)化視圖。(4)從數(shù)據(jù)檢驗的角度出發(fā),為相關(guān)的表建立至少 1 個觸發(fā)器。(5)從數(shù)據(jù)更新或修改的角度出發(fā),設(shè)計至少 1 個存儲過程。(6)從安全的角度出發(fā),規(guī)劃系統(tǒng)的角色、用戶、權(quán)限,并通過相關(guān)的 SQL實現(xiàn)。(7)預計每個表的大致容量和增長速度,指定備份的方案,寫出相關(guān)的備份命令。2.3 設(shè)計環(huán)境(1)WINDOWS 20002/ 003/XP 系統(tǒng)(2)Oracle數(shù)據(jù)庫管理系統(tǒng)2.4 開發(fā)語言PL/SQL語言3 分析和設(shè)計3.1 系統(tǒng) E-R 模型經(jīng)過分

5、析可以知道, 機票預定信息管理系統(tǒng)一共有航空公司、 飛行、航班、機艙、機票、乘客和業(yè)務(wù)員這幾個實體,航空公司有公司編號、公司名、公司電話和公司地址這幾個屬性;飛機有飛機編號、飛機名稱兩個屬性;航班有航班號、出發(fā)地、目的地、起飛時刻和飛行時間這幾個屬性;機艙有機艙等級、座位數(shù)、定價和折扣這幾個屬性;機票有機票編號、 登機日期、 預定狀態(tài)、 座位號這幾個屬性; 乘客有身份證號、姓名、聯(lián)系電話、住址這幾個屬性;業(yè)務(wù)員有業(yè)務(wù)員編號、業(yè)務(wù)員姓名、業(yè)務(wù)員身份證號、聯(lián)系電話和住址這幾個屬性。一個航空公司有多架飛機和多名業(yè)務(wù)員, 一架飛機可有多個航班, 一個航班有多種機艙等級,一個機艙可有多張機票;乘客、業(yè)務(wù)

6、員和機票之間有售票聯(lián)系,售票聯(lián)系有售票日期這一屬性。根據(jù)以上分析可以畫出系統(tǒng) E-R圖,系統(tǒng) E-R圖如圖 3.1 所示: 登機日期 銷售日期 姓名機艙等級身份證號 聯(lián)系電話 機票編號 座位號航班號 座位數(shù)機艙 1 n n 1屬于 機票 購票 乘客 住址n定價 折扣 目的地屬于n出發(fā)地1航班號 航班 售票 銷售日期n n起飛時刻1 屬于 屬于飛行時間 住址 11n 1 1 屬于 n飛機 屬于 航空公司 業(yè)務(wù)員 聯(lián)系電話公司編號 公司地址飛機編號 飛機名稱 業(yè)務(wù)員編號 身份證號公司名 公司電話 姓名圖 3.1 系統(tǒng) E-R 圖3.2 表空間及表的設(shè)計(1)表空間的設(shè)計。經(jīng)過分析可知,乘客表、機票

7、信息表和機票銷售表數(shù)據(jù)量比較大,可單獨分配表空間,其他的表數(shù)據(jù)量較少,可一起使用一個表空間。創(chuàng)建表分配表空間和添加數(shù)據(jù)文件, SQL語句如下:CREATE SMALL PASSENGERDATAFILE F:APPORACLEORADATAORCLTICKETSALEpassenger.dbfSIZE 100M AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITEDLOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;CREATE SMALL TICKETDATAFILE F:APPORACLEORA

8、DATAORCLTICKETSALEticket.dbfSIZE 100M AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITEDLOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;CREATE SMALL TICKETSALEDATAFILE F:APPORACLEORADATAORCLTICKETSALEticketsale.dbfSIZE 100M AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITEDLOGGING EXTENT MANAGEMENT LOCAL SE

9、GMENT SPACE MANAGEMENT AUTO;CREATE SMALL OTHERSDATAFILE F:APPORACLEORADATAORCLTICKETSALEothers .dbf SIZE 100M AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITEDLOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;表空間結(jié)構(gòu)如圖 3.2 所示:圖 3.2 表空間結(jié)構(gòu)圖(2)關(guān)系模型的設(shè)計。根據(jù) E-R 模型,可以得出相應(yīng)的關(guān)系模型,關(guān)系模型如下:company(cno,cname,ctel

10、,caddress)passenger(pID,pname,ptel,paddress)salesman(sno,sID,sname,stel,saddress,cno)airplane(ano,aname,cno)flight(fno,departure,arrival,time,flytime,ano)cabin(fno,cblevel,seats,price)ticket(tno,fno,cblevel,flydate,status,seat,discount)ticketsale(tno,pID,sno,saledate)(3)表的創(chuàng)建。對于關(guān)系模型的每一個關(guān)系,可以得出相應(yīng)的一張表,

11、創(chuàng)建表的 SQL 語句如下:CREATE TABLE SYSTEM.COMPANY (CNO VARCHAR2(10) NOT NULL ,CNAME VARCHAR2(20) NOT NULL ,CTEL VARCHAR2(20),CADDRESS VARCHAR2(50),PRIMARY KEY (CNO) VALIDATE) TABLESPACE OTHERS;CREATE TABLE SYSTEM.PASSENGER (PID VARCHAR2(20) NOT NULL ,PNAME VARCHAR2(20) NOT NULL ,PTEL VARCHAR2(20),PADDRESS V

12、ARCHAR2(50),PRIMARY KEY (PID) VALIDATE) TABLESPACE PASSENGER;CREATE TABLE SYSTEM.SALESMAN (SNO VARCHAR2(10) NOT NULL ,SID VARCHAR2(20) NOT NULL ,SNAME VARCHAR2(20) NOT NULL ,STEL VARCHAR2(20),SADDRESS VARCHAR2(50),CNO VARCHAR2(10) NOT NULL ,PRIMARY KEY (SNO) VALIDATE ,FOREIGN KEY (CNO) REFERENCES SY

13、STEM.COMPANY (CNO) VALIDATE) TABLESPACE OTHERS;CREATE TABLE SYSTEM.AIRPLANE (ANO VARCHAR2(10) NOT NULL ,ANAME VARCHAR2(20) NOT NULL ,CNO VARCHAR2(10) NOT NULL ,PRIMARY KEY (ANO) VALIDATE ,FOREIGN KEY (CNO) REFERENCES SYSTEM.COMPANY (CNO) VALIDATE) TABLESPACE OTHERS;CREATE TABLE SYSTEM.FLIGHT (FNO VA

14、RCHAR2(10) NOT NULL ,DEPARTURE VARCHAR2(20) NOT NULL ,ARRIVAL VARCHAR2(20) NOT NULL ,TIME DATE NOT NULL ,FLYTIME INTERVAL DAY TO SECOND NOT NULL ,ANO VARCHAR2(10) NOT NULL ,PRIMARY KEY (FNO) VALIDATE ,FOREIGN KEY (ANO) REFERENCES SYSTEM.AIRPLANE (ANO) VALIDATE) TABLESPACE OTHERS;CREATE TABLE SYSTEM.

15、CABIN (FNO VARCHAR2(10) NOT NULL ,CBLEVEL NUMBER(1) NOT NULL ,SEATS NUMBER(3) NOT NULL ,PRICE NUMBER(5) NOT NULL ,PRIMARY KEY (FNO, CBLEVEL) VALIDATE ,FOREIGN KEY (FNO) REFERENCES SYSTEM.FLIGHT (FNO) VALIDATE) TABLESPACE OTHERS;CREATE TABLE SYSTEM.TICKET (TNO NUMBER(10) NOT NULL ,FNO VARCHAR2(10) NO

16、T NULL ,CBLEVEL NUMBER(1) NOT NULL ,FLYDATE DATE NOT NULL ,STATUS NUMBER(1) DEFAULT 1 NOT NULL ,SEAT NUMBER(3) NOT NULL ,DISCOUNT NUMBER(3, 2) NOT NULL ,PRIMARY KEY (TNO) VALIDATE ,FOREIGN KEY (FNO, CBLEVEL) REFERENCES SYSTEM.CABIN (FNO, CBLEVEL)VALIDATE) TABLESPACE TICKET;CREATE TABLE SYSTEM.TICKET

17、SALE (TNO NUMBER (10) NOT NULL ,PID VARCHAR2(20) NOT NULL ,SNO VARCHAR2(10) NOT NULL ,SALEDATE DATE NOT NULL ,PRIMARY KEY (TNO, PID, SNO) VALIDATE ,FOREIGN KEY (TNO) REFERENCES SYSTEM.TICKET (TNO) VALIDATE ,FOREIGN KEY (PID) REFERENCES SYSTEM.PASSENGER (PID) VALIDATE ,FOREIGN KEY (SNO) REFERENCES SY

18、STEM.SALESMAN (SNO) VALIDATE) TABLESPACE TICKETSALE;(4)為表添加數(shù)據(jù)由于表 company、salesman、airplane、flight 和 cabin 是公司管理員通過應(yīng)用程序的管理端預先錄入的, 因此應(yīng)用程序需要為這些表添加一定數(shù)據(jù), 應(yīng)用程序?qū)?zhí)行INSERT語句對表進行插入數(shù)據(jù)。company 的數(shù)據(jù)如表 3.1 所示:CNO CNAME CTEL CADDRESSC0001 朝云航空 廣東省廣州市C0002 北京航空 北京市C0003 長沙航空 湖南省長沙市表 3.1 company 表的數(shù)據(jù)salesman的數(shù)據(jù)如表 3.

19、2 所示:SNO SID SNAME STEL SADDRESS CNOS0001 鄧春國 廣東省茂名市茂南區(qū) C0001S0002 王軍 福建省漳州市 C0002S0003 丁磊 湖南省邵陽市 C0003S0004 暮云 廣東省茂名市茂南區(qū) C0001表 3.2 salesman 表的數(shù)據(jù)airplane 的數(shù)據(jù)如表 3.3 所示:ANO ANAME CNOA0001 波音 737 C0001A0002 波音 777 C0001A0003 波音 737 C0002A0004 麥道 82 C0003表 3.3 airplane 表的數(shù)據(jù)flight 的數(shù)據(jù)如表 3.4 所示:FNO DEPAR

20、TURE ARRIVAL TO_CHAR(TIME,HH-MI-SS) FLYTIME ANOF0001 廣州 北京 07-50-00 0 3:30:0.0 A0001F0002 北京 廣州 12-30-00 0 3:30:0.0 A0001F0003 廣州 長沙 08-00-00 0 1:5:0.0 A0002F0004 長沙 廣州 10-20-00 0 1:5:0.0 A0002F0005 北京 長沙 09-10-00 0 2:50:0.0 A0003F0006 長沙 北京 12-50-00 0 2:50:0.0 A0003F0007 長沙 廣州 07-35-00 0 1:10:0.0 A

21、0004F0008 廣州 長沙 10-05-00 0 1:10:0.0 A0004表 3.4 flight 表的數(shù)據(jù)cabin 的數(shù)據(jù)如表 3.5 所示:FNO CBLEVEL SEATS PRICEF0001 1 50 900F0001 2 80 700F0002 1 50 900F0002 2 80 700F0003 1 30 500F0003 2 50 400F0003 3 70 300F0004 1 30 500F0004 2 50 400F0004 3 70 300F0005 1 50 800F0005 2 70 600F0006 1 50 800F0006 2 70 600F000

22、7 1 120 400F0008 1 120 400表 3.5 cabin 表的數(shù)據(jù)3.3 視圖設(shè)計應(yīng)用程序需要查詢航班信息, 因此需要創(chuàng)建一個航班信息的視圖, 根據(jù)參數(shù)航班號或者出發(fā)地以及目的地查詢航班信息, 顯示航班號、 公司名、飛機名稱、 出發(fā)時間、到達時間、 出發(fā)地和目的地。 由于 oracle 的視圖不支持參數(shù), 但可以利用臨時表作為參數(shù)進行傳遞,因此需要創(chuàng)建一個臨時表,創(chuàng)建臨時表的 SQL語句如下:CREATE GLOBAL TEMPORARY TABLE SYSTEM.INPUT_TO_FLIGHT (T_FNO VARCHAR2(10),T_DEPARTURE VARCHAR2

23、(20),T_ARRIVAL VARCHAR2(20),T_FLYDATE DATE) ON COMMIT PRESERVE ROWS;創(chuàng)建參數(shù)化視圖的 SQL語句如下:CREATE OR REPLACE VIEW SYSTEM.FLIGHT_VIEW_BYFNO(FNO,CNAME,ANAME,TIME,ARRIVAL_TIME,DEPARTURE,ARRIVAL)AS SELECT fno,cname,aname,time,time+flytime,departure,arrivalFROM flight,company,airplane,input_to_flightWHERE flig

24、ht.ano=airplane.anoAND o=oAND fno=input_to_flight.T_fno;CREATE OR REPLACE VIEW SYSTEM.FLIGHT_VIEW_BYSITE(FNO,CNAME,ANAME,TIME,ARRIVAL_TIME,DEPARTURE,ARRIVAL)AS SELECT fno,cname,aname,time,time+flytime,departure,arrivalFROM flight,company,airplane,input_to_flightWHERE flight.ano=airplane.anoAND o=oAN

25、D departure=input_to_flight.T_departureAND arrival=input_to_flight.T_arrival;應(yīng)用程序還可以根據(jù)航班號和航班日期查詢余票信息, 因此需要創(chuàng)建一個余票信息的視圖,顯示某一航班某一日期不同機艙等級的剩余座位數(shù)、定價和折扣等信息。因此創(chuàng)建一個參數(shù)化的視圖,其中計算余票使用函數(shù) count_ticket,創(chuàng)建視圖的 SQL語句如下:CREATE OR REPLACE VIEW SYSTEM.REMAIN_SEATS_VIEW(FNO,FLYDATE,CBLEVEL,COUNT)AS SELECT DISTINCT fno,fl

26、ydate,cblevel, count_ticket(fno,flydate,cblevel)FROM ticket,input_to_flightWHERE fno=input_to_flight.t_fnoAND flydate=input_to_flight.T_FLYDATE;假設(shè)應(yīng)用程序要查詢“茂名長沙”的航班信息時,應(yīng)用程序先執(zhí)行以下 SQL語句:INSERT INTO input_to_flight VALUES(, 茂名, 長沙 ,);SELECT * FROM flight_view_bysite;此時系統(tǒng)會返回查詢的結(jié)果如圖 3.3 所示:圖 3.3 flight_vie

27、w_bysite 視圖查詢的數(shù)據(jù)這時候假設(shè)再想查詢航班 F0003、日期為 2011 年 6 月 1 日的余票信息,應(yīng)用程序會執(zhí)行以下 SQL語句:INSERT INTO input_to_flightVALUES(F0003, to_date(2011-6-1,yyyy-mm-dd);SELECT * FROM remain_seats_view ORER BY cblevel;此時系統(tǒng)會返回查詢的結(jié)果如圖 3.4 所示:圖 3.4 remain_seats_view 視圖查詢的數(shù)據(jù)在乘客確定好要預訂的機票的時候, 系統(tǒng)需要打印機票, 機票上需要顯示機票編號、航班號、公司名、飛機名稱、出發(fā)地

28、、目的地、機票日期、出發(fā)時間、到達時間、機艙等級、座位號、定價、折扣、售價以及乘客姓名、乘客身份證號和業(yè)務(wù)員姓名,因此可以創(chuàng)建一個視圖,創(chuàng)建視圖的 SQL語句如下:CREATE OR REPLACE VIEW SYSTEM.TICKET_INFO_VIEW(TNO,FNO,CNAME,ANAME,DEPARTURE,ARRIVAL,FLYDATE,TIME,ARRIVAL_TIME,CBLEVEL,SEAT,PRICE,DISCOUNT,FINAL_PRICE,PNAME,PID,SNAME)AS SELECTticket.tno, ticket.fno , cname , aname, de

29、parture, arrival, flydate, time,time+flytime, ticket.cblevel , seat , price , discount, price*discount , pname,passenger.pID, snameFROM ticket , flight , airplane, company, passenger,salesman,ticketsale, cabinWHERE ticket.fno =flight.fnoAND flight.ano=airplane.anoAND o=oAND ticketsale.tno=ticket.tno

30、AND ticketsale.pid=passenger.pidAND ticketsale.sno=salesman.snoAND ticket.fno=cabin.fnoAND ticket.cblevel=cabin.cblevel;應(yīng)用程序需要查詢售票記錄, 因此可以創(chuàng)建一個視圖來查詢機票編號、 乘客姓名、乘客身份證號、業(yè)務(wù)員編號、業(yè)務(wù)員姓名和購票日期,創(chuàng)建視圖的 SQL語句如下:CREATE OR REPLACE VIEW SYSTEM.SALERECORD_VIEW(TNO,PNAME,PID,SNO,SNAME,SALEDATE)AS SELECT ticketsale.tno,

31、pname,ticketsale.pID,ticketsale.sno,sname,saledateFROM ticket,passenger,salesman,ticketsaleWHERE ticket.tno=ticketsale.tnoAND ticketsale.pid=passenger.pidAND ticketsale.sno=salesman.sno;視圖 salerecord_view的查詢結(jié)果如圖所示 3.5:圖 3.5 salerecord_view 視圖查詢的數(shù)據(jù)應(yīng)用程序需要統(tǒng)計業(yè)務(wù)員的業(yè)績, 需要顯示業(yè)務(wù)員編號、 業(yè)務(wù)員姓名、 航空公司名和銷售總額。因此創(chuàng)建視圖 s

32、ale_grade_view來查詢銷售總額, SQL如下所示:CREATE OR REPLACE VIEW SYSTEM.SALE_GRADE_VIEW (SNO,SNAME,CNAME,SUM)AS SELECT ticketsale.sno,sname , cname , SUM(price*discount)FROM ticketsale , salesman , company ,ticket , cabinWHERE salesman.sno =ticketsale.snoAND o =oAND ticket.tno =ticketsale.tnoAND cabin.fno =tic

33、ket.fnoAND cabin.cblevel=ticket.cblevelGROUP BY ticketsale.sno, sname , cname視圖 sale_grade_view查詢結(jié)果如圖 3.6 所示:圖 3.6 sale_grade_view 視圖查詢的數(shù)據(jù)3.4 存儲過程、函數(shù)、包的設(shè)計(1)存儲過程設(shè)計管理員需要對機票信息的錄入, 由于機票信息的數(shù)據(jù)量龐大, 手工輸入是不現(xiàn)實的事情,因此需要采用存儲過程來進行對數(shù)據(jù)的錄入。 為了使機票編號有序且不重復,因此需要創(chuàng)建一個表,表存放當前機票編號,創(chuàng)建表和存儲過程 SQL語句如下:CREATE TABLE SYSTEM.T_NU

34、MBER (TNO NUMBER(10);CREATE OR REPLACE PROCEDURE SYSTEM.CREATE_TICKET( p_fno varchar2, p_flydate date, p_discount number )as v_cblevel_count number;v_ticket_count_by_cblevel number;v_tno number;beginSELECT count(1) INTO v_cblevel_count FROM cabin WHERE fno=p_fno;SELECT tno INTO v_tno FROM t_number;F

35、OR v_i in 1.v_cblevel_count loopSELECT seats INTO v_ticket_count_by_cblevel FROMcabin WHEREfno=p_fno ANDcblevel=v_i;FOR v_j IN 1.v_ticket_count_by_cblevel loopINSERT INTO ticketVALUES(v_tno,p_fno,v_i,p_flydate,1,v_j,p_discount);v_tno:=v_tno+1;END LOOP;END LOOP;UPDATE t_number SET tno=v_tno;END;假設(shè)管理員

36、需要插入航班號為 F0003、日期為 2011 年 6 月 10 日、折扣為 0.7 的機票,這需要執(zhí)行過程 CREATE_TICK,ET過程執(zhí)行的 SQL語句如下:CALL create_ticket(F0003,to_date(2011-6-10,yyyy-mm-dd),0.7);此時 ticket 表的數(shù)據(jù)就會更新, ticket 表的部分數(shù)據(jù)如表 3.6 所示:TNO FNO CBLEVEL TO_CHAR(FLYDATE,YYYY-MM-DD) STATUS SEAT DISCOUNT1 F0003 1 2011-6-10 1 1 0.72 F0003 1 2011-6-10 1 2

37、 0.73 F0003 1 2011-6-10 1 3 0.74 F0003 1 2011-6-10 1 4 0.75 F0003 1 2011-6-10 1 5 0.76 F0003 1 2011-6-10 1 6 0.77 F0003 1 2011-6-10 1 7 0.78 F0003 1 2011-6-10 1 8 0.7表 3.6 ticket 表的部分數(shù)據(jù)乘客在買票時,需要對售票( ticketsale)表進行插入數(shù)據(jù),因此可以創(chuàng)建一個存儲過程對售票這一過程進行操作, 并且打印機票的信息, 存儲過程把需要打印的票的信息存放在臨時表上,創(chuàng)建臨時表和存儲過程的 SQL語句如下所示:CR

38、EATE GLOBAL TEMPORARY TABLE SYSTEM.PRINT_TICKET (TNO VARCHAR2(10),FNO VARCHAR2(10),CNAME VARCHAR2(20),ANAME VARCHAR2(20),DEPARTURE VARCHAR2(20),ARRIVAL VARCHAR2(20), FLYDATE DATE,TIME DATE ,ARRIVAL_TIME DATE,CBLEVEL NUMBER(1),SEAT NUMBER(3),PRICE NUMBER(5),DISCOUNT NUMBER(3, 2),FINAL_PRICE NUMBER,PN

39、AME VARCHAR2(20),PID VARCHAR2(20),SNAME VARCHAR2(20) ON COMMIT PRESERVE ROWS;CREATE OR REPLACE PROCEDURE SYSTEM.CREATE_RECORD (p_fno ticket.fno%TYPE,p_flydate date,p_cblevel ticket.cblevel%TYPE,p_pid passenger.pid%TYPE,p_sno salesman.sno%TYPE)AS v_tno ticket.tno%TYPE; v_row ticket_info_view%ROWTYPE;

40、BEGINSELECT min(tno) INTO v_tno FROM ticket WHERE fno=p_fno AND flydate=p_flydateAND cblevel=p_cblevel AND status=1;INSERT INTO ticketsale VALUES(v_tno,p_pid,p_sno, sysdate);UPDATE ticket SET status=0 WHERE tno=v_tno;SELECT * INTO v_row FROM ticket_info_view WHERE tno=v_tno;INSERT INTO print_ticket

41、VALUES(v_row.tno,v_row.fno,v_ame,v_row.aname,v_row.departure,v_row.arrival,v_row.flydate,v_row.time,v_row.arrival_time,v_row.cblevel,v_row.seat,v_row.price,v_row.discount,v_row.final_price,v_row.pname,v_row.pid,v_row.sname);END;假設(shè)乘客鄧春國要購買一張航班號為 F0003、日期為 6 月 1 號的機票,售票員工號為 S0001,則系統(tǒng)先讓乘客輸入身份證號,查詢該乘客是否

42、存在,存在的話顯示乘客信息并提示是否需要更新, 否則添加一個乘客信息, 假設(shè)該乘客的記錄不存在, 則先進行插入操作, 然后執(zhí)行 CREATE_RECOR過D程并且查詢臨時表 PRINT_TICKE的T 數(shù)據(jù)用于打印機票, SQL語句如下:INSERT INTO passenger VALUES(4410855, 鄧春國 , , 廣東省茂名市茂南區(qū) );CALL create_record(F0003,to_date(2011-6-1,yyyy-mm-dd),1,4410855,S0001);SELECT * FROM print_ticket;查詢結(jié)果如圖 3.7 所示:圖 3.7 print

43、_ticket 表的數(shù)據(jù)(2)函數(shù)設(shè)計在售票的時候需要計算剩余票的數(shù)量, 因此可以創(chuàng)建一個函數(shù)來計算剩余票的數(shù)量,函數(shù)的參數(shù)為航班號、航班日期和機艙等級,函數(shù)的創(chuàng)建如下:CREATE OR REPLACE FUNCTION SYSTEM.COUNT_TICKET (p_fno flight.fno%TYPE,p_flydate date,p_cblevel cabin.cblevel%TYPE) RETURN numberAS v_count number;BEGINSELECTcount(1) INTO v_count from ticket WHEREfno=p_fno ANDflydat

44、e=p_flydateAND cblevel=p_cblevel AND status=1;RETURN v_count;END;(1)包設(shè)計可以把以上的存儲過程和函數(shù)封裝到包里面,創(chuàng)建包的 SQL語句如下:CREATE OR REPLACE PACKAGE SYSTEM.SALES_SYSTEM ASFUNCTION count_ticket(p_fno flight.fno%TYPE,p_flydate date,p_cblevel cabin.cblevel%TYPE )RETURN number;PROCEDURE create_ticket( p_fno varchar2, p_fl

45、ydate date, p_discount number );PROCEDUREcreate_record( p_fno ticket.fno%TYPE, p_flydate date, p_cblevelticket.cblevel%TYPE, p_pid passenger.pid%TYPE, p_sno salesman.sno%TYPE );END;創(chuàng)建包體的 SQL語句如下:CREATE OR REPLACE PACKAGE BODY SYSTEM.SALES_SYSTEMASPROCEDURE CREATE_RECORD( p_fno ticket.fno%TYPE,p_flyd

46、ate date,p_cblevelticket.cblevel%TYPE,p_pid passenger.pid%TYPE,p_sno salesman.sno%TYPE )AS v_tno ticket.tno%TYPE; v_row ticket_info_view%ROWTYPE;BEGINSELECT min(tno) INTO v_tno FROM ticket WHERE fno=p_fno AND flydate=p_flydateAND cblevel=p_cblevel AND status=1;INSERT INTO ticketsale VALUES(v_tno,p_p

47、id,p_sno, sysdate);UPDATE ticket SET status=0 WHERE tno=v_tno;SELECT * INTO v_row FROM ticket_info_view WHERE tno=v_tno;INSERT INTO print_ticket VALUES(v_row.tno,v_row.fno,v_ame,v_row.aname,v_row.departure,v_row.arrival,v_row.flydate,v_row.time,v_row.arrival_time,v_row.cblevel,v_row.seat,v_row.price

48、,v_row.discount,v_row.final_price,v_row.pname,v_row.pid,v_row.sname);END;FUNCTION COUNT_TICKET(p_fno flight.fno%TYPE,p_flydate date,p_cblevel cabin.cblevel%TYPE)RETURN numberAS v_count number;BEGINSELECTcount(1) INTO v_count from ticket WHEREfno=p_fno ANDflydate=p_flydateAND cblevel=p_cblevel AND st

49、atus=1;RETURN v_count;END;PROCEDURE CREATE_TICKET( p_fno varchar2, p_flydate date, p_discount number )AS v_cblevel_count number;v_ticket_count_by_cblevel number;v_tno number;BEGINSELECT count(1) INTO v_cblevel_count FROM cabin WHERE fno=p_fno;SELECT tno INTO v_tno FROM t_number;FOR v_i in 1.v_cbleve

50、l_count loopSELECTseats INTO v_ticket_count_by_cblevel FROMcabin WHEREfno=p_fno ANDcblevel=v_i;FOR v_j IN 1.v_ticket_count_by_cblevel loopINSERT INTO ticketVALUES(v_tno,p_fno,v_i,p_flydate,1,v_j,p_discount);v_tno:=v_tno+1;END LOOP;END LOOP;UPDATE t_number SET tno=v_tno;END;END;3.5 觸發(fā)器設(shè)計在輸入機票信息時, 需要保

51、證航班日期是在當前日期的下一天, 因此可以用觸發(fā)器來實現(xiàn),觸發(fā)器創(chuàng)建的 SQL語句如下:CREATE OR REPLACE TRIGGER SYSTEM.CHECK_FLYDATE BEFOREINSERT OR UPDATE OF FLYDATE ON SYSTEM.TICKET REFERENCING OLD AS OLD NEW ASNEW FOR EACH ROWBEGINIF :new.flydate=sysdate THENraise_application_error(-20000,out of range);END IF;END CHECK_FLYDATE;假如想要插入 5 月 1 號的機票,則系統(tǒng)會提示錯誤,如圖 3.8 所示:圖 3.8 觸發(fā)器返回結(jié)果圖3.6 角色、用戶、權(quán)限設(shè)計

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論