You are on page 1of 18

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
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
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


$$
DECLARE
PTR 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;
ELSE
RAISE 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
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 ESTATE
NOTICE: 1) BROADWAY
NOTICE: 2) SECRETARIAT
NOTICE: 3) CHEPAUK
NOTICE: 4) QMC
NOTICE: 5) CONVENT
NOTICE: 6) MANDAVELI
NOTICE: 7) ADYAR GATE
NOTICE: 8) KOTTURPURAM
NOTICE: 9) ENGINEERING COLLEGE
NOTICE: 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;
BEGIN
OPEN 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
END LOOP;
END;
$$
LANGUAGE PLPGSQL;

OUTPUT:

bus=> SELECT GAR_DETAILS();


NOTICE: SNO GARAGE NO_OF_BUSES
NOTICE: 1) BROADWAY 2
NOTICE: 2) ADYAR 3
NOTICE: 3) TAMBARAM 1
NOTICE: 4) ICF 2
NOTICE: 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;
BEGIN
SELECT 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
END;
$$
LANGUAGE PLPGSQL;

OUTPUT:

bus=> SELECT GET_BUSES('ADYAR','BROADWAY');


NOTICE: SNO BUS_NO SOURCE DESTINATION
NOTICE: 1) PP21 BROADWAY GUDUVANCHERI
NOTICE: 2) 21E BROADWAY NANDAMBAKKAM
NOTICE: TOTAL RESULTS: 2
get_buses
-----------

(1 row)

TRIGGERS

WRITE A TRIGGER TO CHECK WHETHER THE NO_OF_PASS FOR THE


SPECIFIC DECK IS WITHIN RANGE
DECK NO_OF_PASS
S 1 TO 60
D 1 TO 120
T 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
$$
LANGUAGE PLPGSQL;

CREATE FUNCTION

CREATE TRIGGER CHECK_NO_OF_PASS BEFORE INSERT OR UPDATE ON


BUS
FOR 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


$$
DECLARE
SRC 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 ROUTE


FOR 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
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
IF STATE=0 THEN
INSERT 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
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
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
Query OK, 0 rows affected (0.03 sec)

TRIGGERS

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

CREATE PROCEDURE ERROR(ERR TEXT)


BEGIN
INSERT 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 RANGE
DECK NO_OF_PASS
S 1 TO 60
D 1 TO 120
T 1 TO 90

CREATE TRIGGER CHECK_NO_OF_PASS BEFORE INSERT ON BUS


FOR EACH ROW
BEGIN
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
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 ROUTE


FOR EACH ROW
BEGIN
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 BROA
DWAY VIA PURASAIVAKAM',3000);
ERROR 1062 (23000): Duplicate entry 'SOURCE AND|OR DESTINATION NOT
VALID TOWNS' for key 'PRIMARY'

INGRES
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
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
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)) AS
DECLARE
FLAG INTEGER;
N,T TEXT(30);
S INTEGER;
BEGIN
FLAG=0;
FOR SELECT TNO,SEQ INTO :T,:S FROM SERVICES WHERE RNO=:RTE ORDER
BY SEQ
DO
FLAG=1;
SELECT NAME INTO :N FROM TOWN WHERE TNO=:T;
RETURN ROW(:S,:N);
ENDFOR;
IF FLAG=0 THEN
RETURN 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
| 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)AS


DECLARE
N TEXT(30);
C INTEGER;
BEGIN
FOR SELECT NAME,COUNT(BUS.GNO) INTO :N,:C FROM GARAGE,BUS
WHERE GARAGE.GNO=BUS.GNO GROUP BY GARAGE.NAME
DO
RETURN 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
+------------------------------+-------------+
(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)) AS
DECLARE
T1,T2 TEXT(10);
R,S,D TEXT(30);
FLAG INTEGER;
BEGIN
FLAG=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)
DO
FLAG=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 THEN
RETURN 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
TRIGGERS

WRITE A TRIGGER TO CHECK WHETHER THE NO_OF_PASS FOR THE


SPECIFIC DECK IS WITHIN RANGE
DECK NO_OF_PASS
S 1 TO 60
D 1 TO 120
T 1 TO 90

CREATE PROCEDURE CHECK_NO_OF_PASS(DK TEXT(10),NO INTEGER) AS


BEGIN
IF :DK='S' AND :NO < 0 OR :NO > 60 THEN
RAISE ERROR 121 'ALLOWED NO_OF_PASS FOR SINGLE DECK IS 1 TO 60';
ENDIF;
IF :DK='D' AND :NO < 0 OR :NO > 120 THEN
RAISE ERROR 122 'ALLOWED NO_OF_PASS FOR SINGLE DECK IS 1 TO 120';
ENDIF;
IF :DK='S' AND :NO < 0 OR :NO > 90 THEN
RAISE ERROR 123 'ALLOWED NO_OF_PASS FOR SINGLE DECK IS 1 TO 90';
ENDIF;
END;
CREATE TRIGGER CHECK_PASS BEFORE INSERT INTO BUS
EXECUTE 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)) AS


DECLARE
S,D TEXT(30);
BEGIN
SELECT TNO INTO :S FROM TOWN WHERE NAME=:SRC;
SELECT TNO INTO :D FROM TOWN WHERE NAME=:DST;

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

CREATE TRIGGER CHECK_TOWN BEFORE INSERT INTO ROUTE


EXECUTE 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

You might also like