+ All Categories

doc

Date post: 25-Nov-2014
Category:
Upload: arul0709
View: 132 times
Download: 2 times
Share this document with a friend
22
COUNTRY BUS COMPANY A Country Bus Company owns a number of buses. Each bus is allocated to a particular route, although some routes may have several buses. Each route passes through a number of towns. One driver is allocated to each route, which corresponds to a journey through some or all of the towns on a route. Some of the towns have a garage where busses are kept and each of the buses is identified by the registration number and can carry different numbers of passengers, since the vehicles vary in size and can be single or double decked. Each route is identified by a route number and information is available on the average number of passengers carried per day for each route. Drivers have an employee number, name, address, and sometimes a telephone number. This database also serves for customer route enquiries. ER DIAGRAM 1
Transcript
Page 1: doc

COUNTRY BUS COMPANY

A Country Bus Company owns a number of buses. Each bus is allocated to a particular route, although some routes may have several buses. Each route passes through a number of towns. One driver is allocated to each route, which corresponds to a journey through some or all of the towns on a route. Some of the towns have a garage where busses are kept and each of the buses is identified by the registration number and can carry different numbers of passengers, since the vehicles vary in size and can be single or double decked. Each route is identified by a route number and information is available on the average number of passengers carried per day for each route. Drivers have an employee number, name, address, and sometimes a telephone number. This database also serves for customer route enquiries.

ER DIAGRAM

1

Page 2: doc

TRANSFORMING ENTITY RELATIONSHIP DIAGRAM TO TABLES

POSTGRESQL

DDL COMMANDS

CREATE TABLE TOWN(TNO VARCHAR(10)PRIMARY KEY,NAME VARCHAR(30));

CREATE TABLE ROUTE(RNO VARCHAR(10)PRIMARY KEY,SOURCE VARCHAR(30),DEST VARCHAR(30),DESCRIPTION VARCHAR(50),AVG_PASS REAL);

CREATE TABLE GARAGE(GNO VARCHAR(10) PRIMARY KEY,NAME VARCHAR(30),ADDR VARCHAR(50),TNO VARCHAR(10) REFERENCES TOWN(TNO));

CREATE TABLE BUS(REGNO VARCHAR(10) PRIMARY KEY,MAKE VARCHAR(30),

2

Page 3: doc

DECK CHAR(1) CHECK(DECK IN('S','D','T')),NO_OF_PASS INT,GNO VARCHAR(10) REFERENCES GARAGE(GNO),RNO VARCHAR(10) REFERENCES ROUTE(RNO));

CREATE TABLE SERVICES(RNO VARCHAR(10) REFERENCES ROUTE(RNO),TNO VARCHAR(10) REFERENCES TOWN(TNO),SEQ INT,PRIMARY KEY(RNO,TNO));

CREATE TABLE DRIVER(ENO VARCHAR(10) PRIMARY KEY,NAME VARCHAR(30),ADDR VARCHAR(50),PHONE NUMERIC(10),RNO VARCHAR(10) REFERENCES ROUTE(RNO));

FUNCTIONS

WRITE A FUNCTION TO DISPLAY THE ROUTE FOR A GIVEN BUS NUMBER

CREATE OR REPLACE FUNCTION GET_ROUTE (TEXT) RETURNS VOID AS$$DECLAREPTR CURSOR FOR SELECT TNO FROM SERVICES WHERE RNO=$1 ORDER BY SEQ;T SERVICES.TNO%TYPE;TMP TOWN.NAME%TYPE;DATA TEXT;C INT:=0;BEGIN

OPEN PTR;FETCH FIRST FROM PTR INTO T;IF T IS NOT NULL THEN

SELECT INTO TMP NAME FROM TOWN WHERE TNO=T;DATA:=TMP;FETCH LAST FROM PTR INTO T;SELECT INTO TMP NAME FROM TOWN WHERE TNO=T;RAISE NOTICE 'ROUTE % FROM % TO %',$1,DATA,TMP;CLOSE PTR;OPEN PTR;

ELSERAISE EXCEPTION 'ROUTE % DOESNT EXIST',$1;RETURN;

END IF;LOOP

FETCH PTR INTO T;EXIT WHEN T IS NULL;SELECT INTO TMP NAME FROM TOWN WHERE TNO=T;

3

Page 4: doc

C:=C+1;RAISE NOTICE '%) % ',C, TMP;

END LOOP; END;$$LANGUAGE PLPGSQL;

OUTPUT:

bus=> SELECT GET_ROUTE('M21G');NOTICE: ROUTE M21G FROM BROADWAY TO GUINDY TVK ESTATENOTICE: 1) BROADWAYNOTICE: 2) SECRETARIATNOTICE: 3) CHEPAUKNOTICE: 4) QMCNOTICE: 5) CONVENTNOTICE: 6) MANDAVELINOTICE: 7) ADYAR GATENOTICE: 8) KOTTURPURAMNOTICE: 9) ENGINEERING COLLEGENOTICE: 10) GUINDY TVK ESTATE get_route-----------

(1 row)

WRITE A FUNCTION TO DISPLAY THE GARAGE NAME AND THE NUMBER OF BUSES IN EACH GARAGE

CREATE OR REPLACE FUNCTION GAR_DETAILS() RETURNS VOID AS$$DECLARE

PTR CURSOR FOR SELECT NAME,COUNT(BUS.GNO) FROM GARAGE,BUS WHERE GARAGE.GNO=BUS.GNO GROUP BY GARAGE.NAME;NAME GARAGE.NAME%TYPE;CNT INT;C INT:=0;

BEGINOPEN PTR;RAISE NOTICE 'SNO GARAGE NO_OF_BUSES';LOOP

FETCH PTR INTO NAME,CNT;EXIT WHEN NAME IS NULL;C:=C+1;RAISE NOTICE ' %) % %',C,NAME,CNT;

4

Page 5: doc

END LOOP;END;$$LANGUAGE PLPGSQL;

OUTPUT:

bus=> SELECT GAR_DETAILS();NOTICE: SNO GARAGE NO_OF_BUSESNOTICE: 1) BROADWAY 2NOTICE: 2) ADYAR 3NOTICE: 3) TAMBARAM 1NOTICE: 4) ICF 2NOTICE: 5) GUINDY 2 gar_details-------------

(1 row)

WRITE A FUNCTION TO DISPLAY THE BUSES FROM A GIVEN SOURCE TO DESTINATION

CREATE OR REPLACE FUNCTION GET_BUSES(TEXT,TEXT) RETURNS VOID AS$$DECLARE

T1 TOWN.TNO%TYPE;T2 TOWN.TNO%TYPE;PTR REFCURSOR; R SERVICES.RNO%TYPE;DATA ROUTE%ROWTYPE;C INT:=0;

BEGINSELECT TNO INTO T1 FROM TOWN WHERE NAME=$1;SELECT TNO INTO T2 FROM TOWN WHERE NAME=$2;OPEN PTR FOR SELECT RNO FROM SERVICES WHERE TNO=T1 INTERSECT SELECT RNO FROM SERVICES WHERE TNO=T2;RAISE NOTICE 'SNO BUS_NO SOURCE DESTINATION';LOOP

FETCH PTR INTO R;EXIT WHEN R IS NULL;SELECT * INTO DATA FROM ROUTE WHERE RNO=R;C:=C+1;RAISE NOTICE '%) % % %',C,R,DATA.SOURCE,DATA.DEST;

END LOOP;RAISE NOTICE 'TOTAL RESULTS: %',C;

5

Page 6: doc

END;$$LANGUAGE PLPGSQL;

OUTPUT:

bus=> SELECT GET_BUSES('ADYAR','BROADWAY');NOTICE: SNO BUS_NO SOURCE DESTINATIONNOTICE: 1) PP21 BROADWAY GUDUVANCHERINOTICE: 2) 21E BROADWAY NANDAMBAKKAMNOTICE: TOTAL RESULTS: 2 get_buses-----------

(1 row)

TRIGGERS

WRITE A TRIGGER TO CHECK WHETHER THE NO_OF_PASS FOR THE SPECIFIC DECK IS WITHIN RANGEDECK NO_OF_PASSS 1 TO 60D 1 TO 120T 1 TO 90

CREATE OR REPLACE FUNCTION CHECK_NO_OF_PASS() RETURNS TRIGGER AS$$BEGIN

IF NEW.DECK='S' AND NEW.NO_OF_PASS < 0 OR NEW.NO_OF_PASS > 60 THEN

RAISE EXCEPTION 'ALLOWED NO_OF_PASS FOR % IS 1 TO 60',NEW.DECK;

END IF; IF NEW.DECK='D' AND NEW.NO_OF_PASS < 0 OR NEW.NO_OF_PASS > 120 THEN

RAISE EXCEPTION 'ALLOWED NO_OF_PASS FOR % IS 1 TO 120',NEW.DECK;

END IF; IF NEW.DECK='S' AND NEW.NO_OF_PASS < 0 OR NEW.NO_OF_PASS > 90 THEN

RAISE EXCEPTION 'ALLOWED NO_OF_PASS FOR % IS 1 TO 90',NEW.DECK;

END IF; RETURN NEW;

END;

6

Page 7: doc

$$LANGUAGE PLPGSQL;

CREATE FUNCTION

CREATE TRIGGER CHECK_NO_OF_PASS BEFORE INSERT OR UPDATE ON BUSFOR EACH ROW EXECUTE PROCEDURE CHECK_NO_OF_PASS();

CREATE TRIGGER

OUTPUT:

INSERT INTO BUS VALUES('TN39A0030','ASHOK LEYLAND','S',63,'G001','47A');

ERROR: ALLOWED NO_OF_PASS FOR S IS 1 TO 60

WRITE A TRIGGER TO CHECK WHETHER THE SOURCE AND DESTINATION OF THE ROUTE ARE AVAILABLE IN TOWN NAME.

CREATE OR REPLACE FUNCTION CHECK_TOWN() RETURNS TRIGGER AS$$DECLARESRC TOWN.TNO%TYPE;DST TOWN.TNO%TYPE;BEGIN

SELECT TNO INTO SRC FROM TOWN WHERE NAME=NEW.SOURCE;SELECT TNO INTO DST FROM TOWN WHERE NAME=NEW.DEST;IF SRC IS NULL OR DST IS NULL THEN

RAISE EXCEPTION 'SOURCE AND|OR DESTINATION NOT VALID TOWNS';

END IF;RETURN NEW;

END;$$LANGUAGE PLPGSQL;

CREATE TRIGGER CHECK_TOWN BEFORE INSERT OR UPDATE ON ROUTEFOR EACH ROW EXECUTE PROCEDURE CHECK_TOWN();

OUTPUT:

bus=> INSERT INTO ROUTE VALUES('7F','ANNA NAGAR','BROADWAY','ANNA NAGAR TO BROADWAY THROUGH PURASAIVAKAM',3000);

ERROR: SOURCE AND|OR DESTINATION NOT VALID TOWNS

7

Page 8: doc

MYSQL

DDL COMMANDS

CREATE TABLE TOWN(TNO VARCHAR(10)PRIMARY KEY,NAME VARCHAR(30));

CREATE TABLE ROUTE(RNO VARCHAR(10)PRIMARY KEY,SOURCE VARCHAR(30),DEST VARCHAR(30),DESCRIPTION VARCHAR(50),AVG_PASS FLOAT);

CREATE TABLE GARAGE(GNO VARCHAR(10) PRIMARY KEY,NAME VARCHAR(30),ADDR VARCHAR(50),TNO VARCHAR(10) REFERENCES TOWN(TNO));

CREATE TABLE BUS(REGNO VARCHAR(10) PRIMARY KEY,MAKE VARCHAR(30),DECK CHAR(1) CHECK(DECK IN('S','D','T')),NO_OF_PASS INT,GNO VARCHAR(10)REFERENCES GARAGE(GNO),RNO VARCHAR(10) REFERENCES ROUTE(RNO));

CREATE TABLE SERVICES(RNO VARCHAR(10) REFERENCES ROUTE(RNO),TNO VARCHAR(10) REFERENCES TOWN(TNO),SEQ INT,PRIMARY KEY(RNO,TNO));

CREATE TABLE DRIVER(ENO VARCHAR(10) PRIMARY KEY,NAME VARCHAR(30),ADDR VARCHAR(50),PHONE BIGINT(10),RNO VARCHAR(10) REFERENCES ROUTE(RNO));

FUNCTIONS

WRITE A FUNCTION TO DISPLAY THE ROUTE FOR A GIVEN BUS NUMBER

CREATE PROCEDURE GET_ROUTE(RTE TEXT)BEGIN

DECLARE STATE INT DEFAULT 1;DECLARE TN TEXT;DECLARE TWN TEXT;DECLARE CNT INT DEFAULT 0;DECLARE PTR CURSOR FOR SELECT TNO FROM SERVICES WHERE RNO=RTE ORDER BY SEQ;DECLARE CONTINUE HANDLER FOR NOT FOUND SET STATE=0;OPEN PTR;TRUNCATE TABLE STR;FETCH PTR INTO TN;

8

Page 9: doc

IF STATE=0 THENINSERT INTO STR VALUES("INVALID BUS NUMBER");

END IF;WHILE STATE<>0 DO

SET CNT=CNT+1;SET TWN=(SELECT NAME FROM TOWN WHERE TNO=TN);INSERT INTO STR VALUES(CONCAT(CAST(CNT AS CHAR),RPAD(')',3,' ') ,TWN));FETCH PTR INTO TN;

END WHILE;SELECT * FROM STR;

END//

OUTPUT:

mysql> CALL GET_ROUTE('PP21');+---------------------------------+| RESULTS |+---------------------------------+| 1) BROADWAY || 2) SECRETARIAT || 3) CHEPAUK || 4) QMC || 5) FORE SHORE ESTATE || 6) AMS HOSPITAL || 7) ADYAR || 8) ENGINEERING COLLEGE || 9) GUINDY || 10) ST THOMAS MOUNT PO || 11) MEENAMBAKKAM/CARGO AIRPORT || 12) TIRUSULAM/AIRPORT || 13) PALLAVARAM || 14) CHROMEPET || 15) TAMBARAM SANATORIUM || 16) TAMBARAM || 17) IRUMBULIYUR || 18) PERUNGULATHUR || 19) VANDALUR || 20) VANDALUR ZOO || 21) URAPAKKAM SCHOOL || 22) PALAKKA COMPANY || 23) GUDUVANCHERI |+---------------------------------+23 rows in set (0.20 sec)

Query OK, 0 rows affected (0.25 sec)

9

Page 10: doc

WRITE A FUNCTION TO DISPLAY THE GARAGE NAME AND THE NUMBER OF BUSES IN EACH GARAGE

CREATE PROCEDURE GAR_DETAILS()BEGIN

DECLARE STATE INT DEFAULT 1;DECLARE NME TEXT;DECLARE CNT,C INT DEFAULT 0;DECLARE PTR CURSOR FOR SELECT NAME,COUNT(BUS.GNO) FROM GARAGE,BUS WHERE GARAGE.GNO=BUS.GNO GROUP BY GARAGE.NAME;DECLARE CONTINUE HANDLER FOR NOT FOUND SET STATE=0;OPEN PTR;TRUNCATE TABLE STR;FETCH PTR INTO NME,CNT;IF STATE=0 THEN

INSERT INTO STR VALUES("NO DATA");END IF;WHILE STATE<>0 DO

SET C=C+1;INSERT INTO STR VALUES(CONCAT(CAST(C AS CHAR),')',RPAD(NME,10,' ')," ",CAST(CNT AS CHAR)));FETCH PTR INTO NME,CNT;

END WHILE;SELECT * FROM STR;

END//

OUTPUT:

mysql> CALL GAR_DETAILS();+--------------------+| RESULTS |+--------------------+| 1) ADYAR 3 || 2) BROADWAY 2 || 3) GUINDY 2 || 4) ICF 2 || 5) TAMBARAM 1 |+--------------------+5 rows in set (0.04 sec)

Query OK, 0 rows affected (0.05 sec)

10

Page 11: doc

WRITE A FUNCTION TO DISPLAY THE BUSES FROM A GIVEN SOURCE TO DESTINATION

CREATE PROCEDURE GET_BUSES(SRC TEXT,DST TEXT)BEGIN

DECLARE T1 TEXT DEFAULT (SELECT TNO FROM TOWN WHERE NAME=SRC);DECLARE T2 TEXT DEFAULT (SELECT TNO FROM TOWN WHERE NAME=DST);DECLARE S,D,R TEXT;DECLARE STATE INT DEFAULT 1;DECLARE C INT DEFAULT 0;DECLARE PTR CURSOR FOR SELECT RNO FROM SERVICES WHERE TNO=T1 AND RNO IN(SELECT RNO FROM SERVICES WHERE TNO=T2);DECLARE CONTINUE HANDLER FOR NOT FOUND SET STATE=0;OPEN PTR;TRUNCATE TABLE STR;FETCH PTR INTO R;IF STATE=0 THEN

INSERT INTO STR VALUES(CONCAT("NO BUSES FROM ",SRC," TO ",DST));

END IF;WHILE STATE<>0 DO

SET C=C+1;SET S=(SELECT SOURCE FROM ROUTE WHERE RNO=R);SET D=(SELECT DEST FROM ROUTE WHERE RNO=R);INSERT INTO STR VALUES(CONCAT(CAST(C AS CHAR),') ',RPAD(R,5,' '),RPAD(S,20,' '),RPAD(R,20,' ')));FETCH PTR INTO R;

END WHILE;SELECT * FROM STR;

END//

OUTPUT:

mysql> CALL GET_BUSES('ADYAR','BROADWAY'); -> //+--------------------------------------------------+| RESULTS |+--------------------------------------------------+| 1) 21E BROADWAY NANDAMBAKKAM || 2) PP21 BROADWAY GUDUVANCHERI |+--------------------------------------------------+2 rows in set (0.01 sec)

11

Page 12: doc

Query OK, 0 rows affected (0.03 sec)

TRIGGERS

CREATE TABLE ERROR(ERR_MESSAGE VARCHAR(50)PRIMARY KEY);

CREATE PROCEDURE ERROR(ERR TEXT)BEGININSERT INTO ERROR VALUES(ERR);INSERT INTO ERROR VALUES(ERR);END//

WRITE A TRIGGER TO CHECK WHETHER THE NO_OF_PASS FOR THE SPECIFIC DECK IS WITHIN RANGEDECK NO_OF_PASSS 1 TO 60D 1 TO 120T 1 TO 90

CREATE TRIGGER CHECK_NO_OF_PASS BEFORE INSERT ON BUSFOR EACH ROWBEGIN

IF NEW.DECK='S' AND NEW.NO_OF_PASS < 0 OR NEW.NO_OF_PASS > 60 THEN

CALL ERROR('ALLOWED NO_OF_PASS FOR SINGLE DECK IS 1 TO 60');

END IF; IF NEW.DECK='D' AND NEW.NO_OF_PASS < 0 OR NEW.NO_OF_PASS > 120 THEN

CALL ERROR('ALLOWED NO_OF_PASS FOR SINGLE DECK IS 1 TO 120');

END IF; IF NEW.DECK='S' AND NEW.NO_OF_PASS < 0 OR NEW.NO_OF_PASS > 90 THEN

CALL ERROR('ALLOWED NO_OF_PASS FOR SINGLE DECK IS 1 TO 90');

END IF; END//

OUTPUT:

mysql> INSERT INTO BUS VALUES('TN39A1029','TATA','S',63,'G001','14');ERROR 1062 (23000): Duplicate entry 'ALLOWED NO_OF_PASS FOR SINGLE DECK IS 1 TO 60' for key 'PRIMARY'

12

Page 13: doc

WRITE A TRIGGER TO CHECK WHETHER THE SOURCE AND DESTINATION OF THE ROUTE ARE AVAILABLE IN TOWN NAME.

CREATE TRIGGER CHECK_TOWN BEFORE INSERT ON ROUTEFOR EACH ROWBEGIN

DECLARE SRC,DST TEXT;SELECT TNO INTO SRC FROM TOWN WHERE NAME=NEW.SOURCE;SELECT TNO INTO DST FROM TOWN WHERE NAME=NEW.DEST;IF SRC IS NULL OR DST IS NULL THEN

CALL ERROR('SOURCE AND|OR DESTINATION NOT VALID TOWNS');

END IF;END//

OUTPUT:

mysql> INSERT INTO ROUTE VALUES('7F','ANNA NAGAR','BROADWAY','ANNA NAGAR TO BROADWAY VIA PURASAIVAKAM',3000);ERROR 1062 (23000): Duplicate entry 'SOURCE AND|OR DESTINATION NOT VALID TOWNS' for key 'PRIMARY'

INGRESDDL COMMANDS

CREATE TABLE TOWN(TNO VARCHAR(10)PRIMARY KEY,NAME VARCHAR(30));

CREATE TABLE ROUTE(RNO VARCHAR(10)PRIMARY KEY,SOURCE VARCHAR(30),DEST VARCHAR(30),DESCRIPTION VARCHAR(50),AVG_PASS FLOAT);

CREATE TABLE GARAGE(GNO VARCHAR(10) PRIMARY KEY,NAME VARCHAR(30),ADDR VARCHAR(50),TNO VARCHAR(10) REFERENCES TOWN(TNO));

CREATE TABLE BUS(REGNO VARCHAR(10) PRIMARY KEY,MAKE VARCHAR(30),DECK CHAR(1) CHECK(DECK IN('S','D','T')),NO_OF_PASS INTEGER,GNO VARCHAR(10)REFERENCES GARAGE(GNO),RNO VARCHAR(10) REFERENCES ROUTE(RNO));

CREATE TABLE SERVICES(RNO VARCHAR(10) NOT NULL REFERENCES ROUTE(RNO),TNO VARCHAR(10) NOT NULL REFERENCES TOWN(TNO),SEQ INTEGER,PRIMARY KEY(RNO,TNO));

13

Page 14: doc

CREATE TABLE DRIVER(ENO VARCHAR(10) PRIMARY KEY,NAME VARCHAR(30),ADDR VARCHAR(50),PHONE BIGINT,RNO VARCHAR(10) REFERENCES ROUTE(RNO));

FUNCTIONS

WRITE A FUNCTION TO DISPLAY THE ROUTE FOR A GIVEN BUS NUMBER

CREATE PROCEDURE GET_ROUTE(RTE TEXT(10)) RESULT ROW(INTEGER,TEXT(30)) ASDECLAREFLAG INTEGER;N,T TEXT(30);S INTEGER;BEGINFLAG=0;FOR SELECT TNO,SEQ INTO :T,:S FROM SERVICES WHERE RNO=:RTE ORDER BY SEQDOFLAG=1;SELECT NAME INTO :N FROM TOWN WHERE TNO=:T;RETURN ROW(:S,:N);ENDFOR;IF FLAG=0 THENRETURN ROW(-1,'ROUTE NUMBER IS NOT VALID');ENDIF;END;

OUTPUT:

1> SELECT * FROM GET_ROUTE('PP21') +-------------+------------------------------+|result_column|result_column1 |+-------------+------------------------------+| 1|BROADWAY || 2|SECRETARIAT || 3|CHEPAUK || 4|QMC || 5|FORE SHORE ESTATE || 6|AMS HOSPITAL || 7|ADYAR || 8|ENGINEERING COLLEGE |

14

Page 15: doc

| 9|GUINDY || 10|ST THOMAS MOUNT PO || 11|MEENAMBAKKAM/CARGO AIRPORT || 12|TIRUSULAM/AIRPORT || 13|PALLAVARAM || 14|CHROMEPET || 15|TAMBARAM SANATORIUM || 16|TAMBARAM || 17|IRUMBULIYUR || 18|PERUNGULATHUR || 19|VANDALUR || 20|VANDALUR ZOO || 21|URAPAKKAM SCHOOL || 22|PALAKKA COMPANY || 23|GUDUVANCHERI |+-------------+------------------------------+(23 rows)End of Request

WRITE A FUNCTION TO DISPLAY THE GARAGE NAME AND THE NUMBER OF BUSES IN EACH GARAGE

CREATE PROCEDURE GAR_DETAILS RESULT ROW(TEXT(30),INTEGER)ASDECLAREN TEXT(30);C INTEGER;BEGINFOR SELECT NAME,COUNT(BUS.GNO) INTO :N,:C FROM GARAGE,BUS WHERE GARAGE.GNO=BUS.GNO GROUP BY GARAGE.NAMEDORETURN ROW(:N,:C);ENDFOR;END;

OUTPUT:

1> SELECT * FROM GAR_DETAILS() +------------------------------+-------------+|result_column0 |result_column|+------------------------------+-------------+|TAMBARAM | 1||GUINDY | 2||BROADWAY | 2||ADYAR | 3||ICF | 2|

15

Page 16: doc

+------------------------------+-------------+(5 rows)End of Request

WRITE A FUNCTION TO DISPLAY THE BUSES FROM A GIVEN SOURCE TO DESTINATION

CREATE PROCEDURE GET_BUSES(SRC TEXT(30),DST TEXT(30)) RESULT ROW(INTEGER,TEXT(50)) ASDECLARET1,T2 TEXT(10);R,S,D TEXT(30);FLAG INTEGER;BEGINFLAG=0;SELECT TNO INTO :T1 FROM TOWN WHERE NAME=:SRC;SELECT TNO INTO :T2 FROM TOWN WHERE NAME=:DST;FOR SELECT RNO INTO :R FROM SERVICES WHERE TNO=:T1 AND RNO IN(SELECT RNO FROM SERVICES WHERE TNO=:T2)DOFLAG=FLAG+1;SELECT SOURCE,DEST INTO :S,:D FROM ROUTE WHERE RNO=:R;RETURN ROW(FLAG,:R+' FROM '+:S+' TO '+:D);ENDFOR;IF FLAG=0 THENRETURN ROW(-1, 'NO BUSES FROM GIVEN SOURCE OR DESTINATION');ENDIF;END;

OUTPUT:

1> SELECT * FROM GET_BUSES('ADYAR','BROADWAY') +-------------+--------------------------------------------------+|result_column|result_column1 |+-------------+--------------------------------------------------+| 1|PP21 FROM BROADWAY TO GUDUVANCHERI || 2|21E FROM BROADWAY TO NANDAMBAKKAM |+-------------+--------------------------------------------------+(2 rows)End of Request

16

Page 17: doc

TRIGGERS

WRITE A TRIGGER TO CHECK WHETHER THE NO_OF_PASS FOR THE SPECIFIC DECK IS WITHIN RANGEDECK NO_OF_PASSS 1 TO 60D 1 TO 120T 1 TO 90

CREATE PROCEDURE CHECK_NO_OF_PASS(DK TEXT(10),NO INTEGER) ASBEGINIF :DK='S' AND :NO < 0 OR :NO > 60 THENRAISE ERROR 121 'ALLOWED NO_OF_PASS FOR SINGLE DECK IS 1 TO 60';ENDIF; IF :DK='D' AND :NO < 0 OR :NO > 120 THENRAISE ERROR 122 'ALLOWED NO_OF_PASS FOR SINGLE DECK IS 1 TO 120';ENDIF; IF :DK='S' AND :NO < 0 OR :NO > 90 THENRAISE ERROR 123 'ALLOWED NO_OF_PASS FOR SINGLE DECK IS 1 TO 90';ENDIF; END;CREATE TRIGGER CHECK_PASS BEFORE INSERT INTO BUSEXECUTE PROCEDURE CHECK_NO_OF_PASS(DK=NEW.DECK,NO=NEW.NO_OF_PASS);

INSERT INTO BUS VALUES('TN39A0032','ASHOK LEYLAND','S',157,'G001','14');

OUTPUT:

1> INSERT INTO BUS VALUES('TN39A1029','TATA','S',63,'G001','14') ALLOWED NO_OF_PASS FOR SINGLE DECK IS 1 TO 60

End of Request - Terminated by Errors

WRITE A TRIGGER TO CHECK WHETHER THE SOURCE AND DESTINATION OF THE ROUTE ARE AVAILABLE IN TOWN NAME.

CREATE PROCEDURE CHECK_TOWN(SRC TEXT(30),DST TEXT(30)) ASDECLARES,D TEXT(30);BEGINSELECT TNO INTO :S FROM TOWN WHERE NAME=:SRC;SELECT TNO INTO :D FROM TOWN WHERE NAME=:DST;

17

Page 18: doc

IF S IS NULL OR D IS NULL THENRAISE ERROR 124 'SOURCE AND|OR DESTINATION NOT VALID TOWNS';ENDIF;END;

CREATE TRIGGER CHECK_TOWN BEFORE INSERT INTO ROUTEEXECUTE PROCEDURE CHECK_TOWN(SRC=NEW.SOURCE,DST=NEW.DEST);

OUTPUT:

1> INSERT INTO ROUTE VALUES('7F','ANNA NAGAR','BROADWAY','ANNA NAGAR TO BROADWAY VIA PURASAIVAKAM',3000) SOURCE AND|OR DESTINATION NOT VALID TOWNS

End of Request - Terminated by Errors

18


Recommended