Vous êtes sur la page 1sur 212

A SUITE OF CASE STUDIES IN RELATIONAL

DATABASE DESIGN

Master Thesis Weiguang Zhang McMaster University- Computing and Software



Master Thesis Weiguang Zhang McMaster University- Computing and Software

A SUITE OF CASE STUDIES IN RELATIONAL DATABASE DESIGN





By
WEIGUANG ZHANG

Computer Science


A Thesis
Submitted to the School of Graduate Studies
In Partial Fulfillment of the Requirements
For the Degree
Master of Science

McMaster University

Copyright by Weiguang Zhang J anuary 2012
Master Thesis Weiguang Zhang McMaster University- Computing and Software
ii

MASTER OF SCIENCE (J an, 2012) McMaster University


(Computer Science) Hamilton, Ontario

TITLE: A SUITE OF CASE STUDIES IN RELATIONAL DATABASE
DESIGN

AUTHOR: WEIGUANG ZHANG
SUPERVISOR: Dr. Antoine Deza and Dr. Frantisek Franek


NUMBER OF PAGES: x & 107
Master Thesis Weiguang Zhang McMaster University- Computing and Software
iii

Abstract

Typical relational database design examples in textbooks and undergraduate courses are
small and do not provide any real opportunity to practice the design, they simply illustrate
and illuminate the principles. On the other end of the spectrum are typical industrial
databases whose designs are complex and extensive, and so not suitable as a project for a
one term database course. The objective of this thesis is to design and develop a
collection of ten projects that would be usable as term projects in relational database
system design for a typical undergraduate database course. To this end a suite of ten case
studies are presented. Each project is taken from its informal specification to a relational
schema using entity-relationship modeling and its translation to relational model, to
database schema, to implementation of the database, to interactive SQL querying of the
installed database and finished with a simple application programmed in C using the
installed database and accessing it via embedded SQL.
Master Thesis Weiguang Zhang McMaster University- Computing and Software
iv

Acknowledgments


I would like to express my gratitude to all of those who made it possible to complete this
thesis, in particular to my supervisors Dr. Antoine Deza and Dr. Frantisek Franek.
I appreciate the great aid and support from all the members of the Advanced Optimization
Laboratory.
I would also like to thank my family for their understanding and continuous support.

Master Thesis Weiguang Zhang McMaster University- Computing and Software
v

Abbreviations
IBM: International Business Machines
ACM: Association of Computing Machinery
DBMS: Database Management System
SQL: Structured Query Language
ODBC: Open Database Connectivity
J DBC: J ava Database Connectivity
ER: Entity Relationship
PHP: Personal Home Page
API: Application Programming Interface
CLI: Call Level Interface:
ESQL: Embedded Structured Query Language
IE: Information Engineering
IDEF1X: Integrated Definition for Information Modeling

Master Thesis Weiguang Zhang McMaster University- Computing and Software
vi

Terminologies and Symbols of ERwin IE Format


Identifying relationship: Shown with a solid line. An identifying relationship is a
relationship between two entities in which the child entity is dependent on its associated
parent entity, and the primary key of the parent entity is the part of the primary key of the
child entity.
Non-identifying Relationship: Shown with a dashed line. A non-identifying relationship
is a relationship between two entities in which the child entity is independent on its
associated parent entity, and the primary key of the parent entity is the non-key attribute
instead of the key attribute in the child entity.
Max relationship cardinality: Shown with a short perpendicular line across the
relationship near its line end to signify one and with a crows foot on the line end to
signify many.
Min relationship cardinality: Shown with a small circle near the end of the line to
signify zero (participation in the relationship is optional) or with a short perpendicular
line across the relationship line to signify one (participation in the relationship is
mandatory).

Dependent Entity:

Independent Entity:

Zero:

One:

Many:

Customer
CustomerEmail
Master Thesis Weiguang Zhang McMaster University- Computing and Software
vii

List of Figures

Figure 1: Summary of aspects of the Logical and Physical Models ................................. 7
Figure 2: The University System Logical Model ........................................................... 10
Figure 3: The University System Physical Model .......................................................... 11
Figure 4: The Airline Reservation Logical Model .......................................................... 27
Figure 5: The Airline Reservation Physical Model ........................................................ 28
Figure 6: The Movie Rental Logical Model ................................................................... 35
Figure 7: The Movie Rental Physical Model .................................................................. 36
Figure 8: The Car Rental Logic Model ........................................................................... 44
Figure 9: The Car Rental Physical Model....................................................................... 45
Figure 10: The Course Registration Logical Model ......................................................... 52
Figure 11: The Course Registration Physical Model ........................................................ 53
Figure 12: The Emergency Room Logical Model ............................................................ 61
Figure 13: The Emergency Room Physical Model ........................................................... 62
Figure 14: The Property Rental Logical Model ................................................................ 70
Figure 15: The Property Rental Physical Model............................................................... 71
Figure 16: The Software Project Logical Model .............................................................. 81
Figure 17: The Software Project Physical Model ............................................................. 82
Figure 18: The Tour Operator System Logical Model ..................................................... 89
Figure 19: The Tour Operator System Physical Model .................................................... 90
Figure 20: The Warehouse System Logical Model .......................................................... 99
Figure 21: The Warehouse System Physical Model ....................................................... 100
Master Thesis Weiguang Zhang McMaster University- Computing and Software
viii



Contents
Abstract ............................................................................................................................ iiii
Acknowledgments ........................................................................................................... ivv
Abbreviations .................................................................................................................. viv
Terminologies and Symbols of ERwin IE Format ........................................................ iv
List of Figures ................................................................................................................ viiii
Chapter 1: Introduction .................................................................................................... 1
Chapter 2: Objectives, Decisions, and Methods .............................................................. 4
Chapter 3: University System ........................................................................................... 8
3.1 UNIVERSITY SYSTEM INFORMAL DESCRIPTION....................................................................................8
3.2 UNIVERSITY SYSTEM LOGICAL MODEL..............................................................................................10
3.3 UNIVERSITY SYSTEM DB2 PHYSICAL MODEL....................................................................................11
3.4 UNIVERSITY SYSTEM DB2 SCHEMA...................................................................................................12
3.5 UNIVERSITY SYSTEM INTERACTIVE QUERIES.....................................................................................14
3.6 UNIVERSITY SYSTEM APPLICATION PROGRAM..................................................................................16
Chapter 4: Airline Reservation....................................................................................... 25
4.1 AIRLINE RESERVATION INFORMAL DESCRIPTION................................................................................25
4.2 AIRLINE RESERVATION LOGICAL MODEL..........................................................................................27
4.3 AIRLINE RESERVATION DB2 PHYSICAL MODEL................................................................................28
4.4 AIRLINE RESERVATION DB2 SCHEMA................................................................................................29
4.5 AIRLINE RESERVATION INTERACTIVE QUERIES..................................................................................31

Chapter 5: Movie Rental ................................................................................................. 34


Master Thesis Weiguang Zhang McMaster University- Computing and Software
ix

5.1 MOVIE RENTAL INFORMAL DESCRIPTION..........................................................................................34


5.2 MOVIE RENTAL LOGICAL MODEL......................................................................................................35
5.3 MOVIE RENTAL PHYSICAL DB2 MODEL............................................................................................36
5.4 MOVIE RENTAL DB2 SCHEMA...........................................................................................................37
5.5 MOVIE RENTAL INTERACTIVE QUERIES.............................................................................................39
Chapter 6: Car Rental ..................................................................................................... 42
6.1 CAR RENTAL INFORMAL DESCRIPTION..............................................................................................42
6.2 CAR RENTAL LOGICAL MODEL..........................................................................................................44
6.3 CAR RENTAL PHYSICAL DB2 MODEL................................................................................................45
6.4 CAR RENTAL DB2 SCHEMA...............................................................................................................46
6.5 CAR RENTAL INTERACTIVE QUERIES.................................................................................................48
Chapter 7: Course Registration ...................................................................................... 51
7.1 COURSE REGISTRATION INFORMAL DESCRIPTION..............................................................................51
7.2 COURSE REGISTRATION LOGICAL MODEL..........................................................................................52
7.3 COURSE REGISTRATION PHYSICAL DB2 MODEL................................................................................53
7.4 COURSE REGISTRATION DB2 SCHEMA...............................................................................................54
7.5 COURSE REGISTRATION INTERACTIVE QUERIES.................................................................................58
Chapter 8: Emergency Room ......................................................................................... 60
8.1 EMERGENCY ROOM INFORMAL DESCRIPTION....................................................................................60
8.2 EMERGENCY ROOM LOGICAL MODEL................................................................................................61
8.3 EMERGENCY ROOM PHYSICAL DB2 MODEL......................................................................................62
8.4 EMERGENCY ROOM DB2 SCHEMA.....................................................................................................63
8.5 EMERGENCY ROOM INTERACTIVE QUERIES.......................................................................................66
Chapter 9: Property Rental ............................................................................................ 69
9.1 PROPERTY RENTAL INFORMAL DESCRIPTION.....................................................................................69
9.2 PROPERTY RENTAL LOGICAL MODEL................................................................................................70
9.3 PROPERTY RENTAL PHYSICAL DB2 MODEL.......................................................................................71
9.4 PROPERTY RENTAL DB2 SCHEMA......................................................................................................72
9.5 PROPERTY RENTAL INTERACTIVE QUERIES........................................................................................77
Chapter 10: Software Project ......................................................................................... 80
10.1 SOFTWARE PROJ ECT INFORMAL DESCRIPTION.................................................................................80
10.2 SOFTWARE PROJ ECT LOGICAL MODEL.............................................................................................81
10.3 SOFTWARE PROJ ECT PHYSICAL DB2 MODEL...................................................................................82
10.4 SOFTWARE PROJ ECT DB2 SCHEMA..................................................................................................83
Master Thesis Weiguang Zhang McMaster University- Computing and Software
x

10.5 SOFTWARE PROJ ECT INTERACTIVE QUERIES....................................................................................85


Chapter 11:Tour Operator System ................................................................................ 87
11.1 TOUR OPERATOR SYSTEM INFORMAL DESCRIPTION........................................................................87
11.2 TOUR OPERATOR SYSTEM LOGICAL MODEL....................................................................................89
11.3TOUROPERATORSYSTEMPHYSICALDB2MODEL.......................................................................................90
11.4 TOUR OPERATOR SYSTEM DB2 SCHEMA..........................................................................................91
11.5 TOUR OPERATOR SYSTEM INTERACTIVE QUERIES...........................................................................94
Chapter 12: Warehouse System ..................................................................................... 97
12.1 WAREHOUSE SYSTEM INFORMAL DESCRIPTION................................................................................97
12.2 WAREHOUSE SYSTEM LOGICAL MODEL...........................................................................................99
12.3 WAREHOUSE SYSTEM PHYSICAL DB2 MODEL...............................................................................100
12.4 WAREHOUSE SYSTEM DB2 SCHEMA..............................................................................................101
12.5 WAREHOUSE SYSTEM INTERACTIVE QUERIES................................................................................103
Conclusion and Future Work ....................................................................................... 106
Bibliography ................................................................................................................... 107

Master Thesis Weiguang Zhang McMaster University- Computing and Software


1

Chapter 1: Introduction

Database Management Systems are really ubiquitous in this age of Internet commerce.
Although the development of relational database system theory and practice can be traced
to the 1970 seminal paper A Relational Model of Data for Large Shared Data Banks by
E.F. Codd [1], the explosive growth of the use of relational database management systems
came with the advent of Internet. Databases not only represent significant infrastructure
for computer applications, but they also process the transactions and exchanges that drive
most of the world economy. A significant and growing segment of the software industry,
known as the database industry includes IBM Corporation, Oracle Corporation, Informix
Corporation, Sybase Incorporated, Teradata Corporation and Microsoft Corporation.
E. F. Codd found the database technologies of the late 1960s taking the old-fashioned
view that the burden of finding information should be on users ... unsatisfactory. He
proposed what he called a relational model based on two fundamental premises: What
Codd called the "relational model" rested on two key points:
1. It provided means of describing data with its natural structure onlythat is,
without any formatting aspects, i.e. superimposing any additional structure for
machine representation purposes.

2. Between application programs on the one hand and the database system on the
other. Accordingly, it provided a natural and consistent basis for a high level
query language which facilitated maximal independence
These aspects are utilized every second all over the world as most of the Internet
traffic and most of the Internet commerce rely on database access of some form. The
relational databases allow various applications in various programming languages to
access and modify a databases.
There are many drawbacks to the relational model and in many ways it is quite
obsolete, see [2] or in particular the ACM blog by M. Stonebraker, one of the pioneers of
the relational database management systems, [3]. In general , the disadvantages of the
relational approach can be summarized by:
1. They are slow and cumbersome; in the early days they were slow - relational
DBMS (database management systems) have to employ many tables to conform
Master Thesis Weiguang Zhang McMaster University- Computing and Software
2

to the various normalization rules. This can make them slow and resource
inefficient. However most contemporary relational DBMS do not have
performance problems now.

2. Restricted attribute sizes. Attribute lengths are usually capped by a maximum
size. This can lead to occasional practical problems e.g. a company with a 400
character name - not frequent, but it can happen.

3. SQL does not provide an efficient way to browse alphabetically through an index.
Thus some systems cannot provide a simple title A-Z browse.

4. To fine-tune a SQL query is not a simple task and its performance may often
depend on the SQL query engine having up-to-date statistics of the database.

5. They do not storing of objects, in essence, objects must be disassembled
before storing them in a relational database, and assembled when they are
fetched.
Yet, despite these deficiencies an obsoleteness, the use of relational databases
proliferates. The major advantages could be summarized as follows:
1. Overwhelmingly, the most popular type of DBMS in use and as a result technical
development effort ensures that advances appear quickly and reliably.

2. A multitude of third party tools that are designed to work with the popular
relational DBMS via standards such as Open Database Connectivity (ODBC) or
J ava Database Connectivity (J DBC).

3. A multitude of third party design and modeling tools for the relational model, such
as ERwin

modeler used in this thesis.



4. Very well developed management tools and security with automatic data logging
and recovery.

5. Referential integrity controls ensuring data consistency.

6. Transactional processing ensuring that incomplete transactions do not occur.
Based on the robust demand for relational databases, all Canadian universities offer
database management course in their Computer Science programmes. A typical database
management course covers mostly the relational database systems and a significant
portion of the practical aspect of any such course deals with the modeling, design and
Master Thesis Weiguang Zhang McMaster University- Computing and Software
3

installation of relational databases, and querying of databases using SQL both


interactively and via application programs.
The majority of textbooks dealing with databases as well as the majority of on-line
database tutorials provide a comprehensive set of examples concerning all five aspects
mentioned above: modeling, design, and installation of a database, and interactive SQL
querying and SQL application programming. However, these examples are usually very
simple and very small, just to illustrate or illuminate a concept or principle. They are not
sufficient for practicing of these aspects. The real-world projects are on the other hand
rather complex and extensive, not suitable to a typical one-term undergraduate course in
database design and applications.
The objective of this thesis is to design and develop a suite of projects that are of
some substance to provide a real practice ground for modeling, design, and installation of
a relational database, and SQL interactive querying and SQL application programming,
yet be of a complexity and extent that would allow it to be used in a one-term
undergraduate course. To this end, a set of ten projects is presented, each leading to a
reasonably small database of 20 to 30 tables, yet exhibiting a comprehensiveness of larger
projects.
The structure of each project presented here is the same:
1. An informal specification of the project in simple English.
2. An Entity-Relationship (ER) model is constructed using Erwin

software
and presented in the form of what is called in Erwins terminology the Logical
and the Physical models.
3. The DB2 database schema is produced based on the ER model.
4. Several SQL queries that can be used to query of the installed database are
presented.
5. A simple application program in C is presented that utilize embedded SQL to
work with the installed database -- usually performing the same queries used in
the part 4.
Since the size of the thesis is already large enough and so only for the first project the
source code of the C application programs is presented, for all other projects the source
codes are listed in the Appendix.

Master Thesis Weiguang Zhang McMaster University- Computing and Software
4

Chapter 2: Objectives, Decisions,


and Methods

One of important decisions of this thesis was whether the classical ER modeling diagrams
were to be used, i.e. the diagrams as proposed by Peter Chen in his pivotal 1976 paper
The Entity-Relationship Model: Toward a Unified View of Data, see [4]. The typical
arguments in favour include the facts that majority of database textbooks present the
original diagrams and that the original diagrams facilitate better understanding of the
concepts and methods. They are simple to draw, so ER models can easily be done by
hand as long as the overall size is not too big.
On the other hand, the original diagrams are bulky and unwieldy, and so even a
simple design requires many pages. Moreover, the ER models must be translated to
relational model before a database schema can be produced. The industrial and
commercial software modelers typically use approach that is closer to the relational
model than to the ER model, and for good reasons. Graphically, such models are much
more compact and more wieldy and though conceptually a bit more challenging than the
ER approach, they are still relatively easy to learn and master. The arguments in favour of
employing the more industrial approach won and the models in this thesis were created
using a professional design software Erwin

.
A decision concerning application programming affected the selection of the DBMS
for our projects. Any application program must access a database, usually using a
software tool or an interface provided by the vendor of the DBMS. Among languages
popular for database application programming, Python and PHP stand out. Python
accesses the database using API -- application programming interface. If Python was just
chosen as the language of application programming, the students would have to know or
learn Python and learn the appropriate API -- a too steep requirement to fit into a single
term, database course that should be focused on the DBMS rather than Python or API of
the DBMS. PHP access the database using Microsoft ODBC. Similarly as for Python, the
students would have to know or learn PHP and learn the language of ODBC, moreover
the ODBC is a software that must be purchased independently from the DBMS. Another
popular language for database application is J ava that accesses a database using J DBC.
Even though this is a less stringent requirement than PHP and ODBC, it still is too
stringent.
Master Thesis Weiguang Zhang McMaster University- Computing and Software
5

Using embedded SQL in C programs is the least stringent requirement as the students
do not have to learn any new language as by the time they take the database course,
practically all students know enough of C, they cover SQL in the database course, so the
expenditure for learning both static embedded SQL and dynamic embedded SQL is
significantly less than learning ODBC, or J DBC, or API etc. Embedded SQL, though not
limited to C, works best with C as the CLI -- call level interface -- to which embedded
SQL are translated by the pre-processor is well defined in C as they are all actually
programmed in C. For these reasons, we opted for application programming based on
embedded SQL and C.
Another important decision concerned which of the concrete database management
systems (DBMS for short) should be used for thesis. The original idea to include several
major ones -- Oracle, DB2, and MySQL -- was rejected as the resulting thesis would be
just too large. For each system, we looked at several criteria:
How available it is to students, and McMaster students in particular?
How commercially successful and practical the system is?
Does ERwin provide modeling support for it?
Does the system provide a native support -- i.e. set of tools -- for embedded
SQL programming in C?
On availability to students, all three DBMS considered scored equally as they all offer
free versions: DB2 has a free student version, Oracle provided free Oracle Database
Express Edition, and MySQL that started as an Open Software is in public domain. On
particular availability to McMaster students DB2 scored the highest as it is the DBMS of
choice for the undergraduate database course and its graduate variant.
In commercial success and practicality, Oracle is a bit ahead of DB2 that is a bit ahead
of MySQL, however the differences were not significant enough for our purposes.
Contemporary version of ERwin provides modeling support for all three DBMS
considered equally.
For embedded SQL (ESQL for short), both DB2 and Oracle provide a very good
support, while MySQL lacks any native support for ESQL, third-party providers have
been promising ESQL tools (pre-processor) for some time, but none is still available.
Based on the above criteria and the fact that due to the size, for this thesis we had to
consider a single DBMS, DB2 was chosen over Oracle due to better availability in
particular to McMaster students. MySQL was rejected for the lack of ESQL support.
Master Thesis Weiguang Zhang McMaster University- Computing and Software
6

For the data modeling part of our projects, we decided to use ERwin modeling tool. In
real world, most data models are the form of ER diagrams that visually represent entities,
attributes, and relationships. As mentioned in the introduction, the original Chens format
is not very suitable as it is too bulky. Most of available software modeling tools thus
provide ER models that are closer to the relational model than to the pure ER model.
ERwin is no exception, and supports both the Information Engineering format (IE, most
popular format) and the IDEF1X format. Moreover ERwin is user friendly and easy to
learn, provides free Community Edition of Erwin Data Modeler, and for most of the
DBMS we considered generates database schemas automatically.
ERwin models have two forms, so-called Logical Model and Physical Model. The
Logical Model is a representation of an organizations data, organized in terms of entities
and relationships and independent of any particular data management technology. It
includes all entities and relationships among them, all primary keys for all entities are
specified, i.e. weak entities are resolved, all attributes for each entity are specified, all
foreign keys are specified. Normalization occurs at this level, if needed.
The basic steps in producing the Logical Model are:
Specify all entities.
Find attributes for each entity.
Specify primary keys for all entities.
Find the relationships between different entities.
Resolve many-to-many relationships.
Perform normalization.
The Physical Model represents how the model will be built/stored in the database. A
physical database model shows all table structures, including column names, column data
types, column constraints, primary keys, foreign keys, and relationships between tables .
The features of the Physical Model include the specification all tables and columns,
foreign keys are used to identify relationships between tables, intentional de-
normalization may occur at this level based on user requirements. The physical
considerations may cause the Physical Model to be quite different from the Logical
Model, thus the Physical Model will be different for different DBMS. For example, data
type for a column maybe different between DB2 and SQL Server.
The basic steps in producing the Physical Model are:
Convert entities into tables.
Convert relationships into foreign keys.
Master Thesis Weiguang Zhang McMaster University- Computing and Software
7

Convert attributes into columns.


Modify the physical data model based on physical constraints/requirements.


Figure 1: Summary of aspects of the Logical and Physical Models
Master Thesis Weiguang Zhang McMaster University- Computing and Software
8

Chapter 3: University System


3.1 University System Informal Description

ABC University is a large institution with several campuses. Each campus has a different
name, address, distance to the city center and the only bus running to the campus. Each
campus has one club. The name of the club, the building in which the club is located, the
phone number of the club and the multiple sports which club offers, should all be
recorded.
The University consists of a number of faculties, such as the Art Faculty, the
Science Faculty, and so on. Each faculty has a name, dean and building. A faculty may be
divided into a number of schools, for example, the Science Faculty has a School of
Physics and a School of Chemistry. Each school belongs to one faculty only and is
located on just one campus, but one campus maybe the location of many schools.
Every school has name and an building assigned to. Each school offers different
programmes and each programme can be offered by only one school. Each programme
has a unique code, title, level and duration. Each programme comprises several courses,
different programmes have different courses. Each course has a unique code and course
title. Some courses may have one or more prerequisite courses and one course can be the
prerequisite course of some other courses.
Each of the students is enrolled in a single programme of study which involves a
fixed core of courses specific to that programme as well as a number of electives taken
from other programmes. Students work on courses and are awarded a grade in any course
if he/she passes the course. Otherwise the student has to re-take the failed course. The
system needs to record the year and term in which the course was taken and the grade
awarded to the student. Every student has a unique ID. The system also keeps the student
name, birthday and the year he/she enrolled in the course.
The school employs lecturers to teach the students. A lecturer is allowed to work
for one school only. Each lecturer is assigned an ID which is unique across the whole
university. The system keeps the lecturers name, title and the office room. A supervisor
maybe in charge of several lecturers, but a lecturer, however reports to only one
supervisor. A lecturer can teach many different courses. A course may also have been
taught by many different lecturers.
Master Thesis Weiguang Zhang McMaster University- Computing and Software
9

The university is operated by committees. Each faculty has to have a number of


committees with the same titles across the university, such as the Faculty Executive, the
Post Graduate Studies Committee, the Health and Sanity Committee, and so on. The
committees meet regularly, such as weekly or monthly. The frequency is determined by
the faculty involved. A committees members are all lecturers. A lecturer may be a
member of several committees.
Master Thesis Weiguang Zhang McMaster University- Computing and Software
10

3.2 University System Logical Model



Figure 2: The University System Logical Model
Master Thesis Weiguang Zhang McMaster University- Computing and Software
11

3.3 University System DB2 Physical Model

Figure 3: The University System Physical Model


Master Thesis Weiguang Zhang McMaster University- Computing and Software
12

3.4 University System DB2 Schema

CREATE TABLE CAMPUS(


CMPSNM VARCHAR( 20) NOT NULL,
CMPSADDR VARCHAR( 50) ,
DI ST NUMERI C( 8, 2) ,
BUSNO VARCHAR( 10) ,
PRI MARY KEY ( CMPSNM)
)
CREATE TABLE FACULTY(
FACNM VARCHAR( 30) NOT NULL,
DEANNM VARCHAR( 20) ,
FACBLD VARCHAR( 20) ,
PRI MARY KEY ( FACNM)
)
CREATE TABLE SCHOOL(
SCHLNM VARCHAR( 30) NOT NULL,
CMPSNM VARCHAR( 20) NOT NULL,
FACNM VARCHAR( 30) NOT NULL,
SCHLBLD VARCHAR( 20) ,
PRI MARY KEY ( SCHLNM) ,
FOREI GN KEY ( CMPSNM) REFERENCES CAMPUS ( CMPSNM) ,
FOREI GN KEY ( FACNM) REFERENCES FACULTY ( FACNM)
)
CREATE TABLE PROGRAMME(
PROGCD CHAR( 11) NOT NULL,
SCHLNM VARCHAR( 30) NOT NULL,
PROGTI TL VARCHAR( 20) ,
PROGLVL VARCHAR( 10) ,
PROGLEN VARCHAR( 20) ,
PRI MARY KEY ( PROGCD) ,
FOREI GN KEY ( SCHLNM) REFERENCES SCHOOL ( SCHLNM)
)
CREATE TABLE STUDENT(
STUI D I NTEGER NOT NULL,
PROGCD CHAR( 11) NOT NULL,
STUNM VARCHAR( 30) ,
STUBRTH DATE,
YRENRL I NTEGER,
PRI MARY KEY ( STUI D) ,
FOREI GN KEY ( PROGCD) REFERENCES PROGRAMME ( PROGCD)
)
CREATE TABLE COURSE(
CRSECD CHAR( 10) NOT NULL,
PROGCD CHAR( 11) NOT NULL,
CRSETI TL VARCHAR( 20) ,
PRI MARY KEY ( CRSECD) ,
FOREI GN KEY ( PROGCD) REFERENCES PROGRAMME ( PROGCD)
)

Master Thesis Weiguang Zhang McMaster University- Computing and Software
13

CREATE TABLE COURSE_STUDENT(


CRSECD CHAR( 10) NOT NULL,
STUI D I NTEGER NOT NULL,
YRTKN CHAR( 4) ,
SEMTKN VARCHAR( 20) ,
GRDAWRD VARCHAR( 10) ,
PRI MARY KEY ( CRSECD, STUI D) ,
FOREI GN KEY ( STUI D) REFERENCES STUDENT ( STUI D) ,
FOREI GN KEY ( CRSECD) REFERENCES COURSE ( CRSECD)
)
CREATE TABLE CLUB(
CLBNM VARCHAR( 20) NOT NULL,
CMPSNM VARCHAR( 20) NOT NULL,
CLBBLD VARCHAR( 20) ,
PHNNO CHAR( 12) ,
PRI MARY KEY ( CLBNM) ,
FOREI GN KEY ( CMPSNM) REFERENCES CAMPUS ( CMPSNM)
)
CREATE TABLE SPORT(
SPRTNM VARCHAR( 20) NOT NULL,
CLBNM VARCHAR( 20) NOT NULL,
PRI MARY KEY ( SPRTNM, CLBNM) ,
FOREI GN KEY ( CLBNM) REFERENCES CLUB ( CLBNM)
)
CREATE TABLE PRE_COURSE(
CRSECD CHAR( 10) NOT NULL,
PRECRSECD CHAR( 10) NOT NULL,
PRI MARY KEY ( CRSECD, PRECRSECD) ,
FOREI GN KEY ( CRSECD) REFERENCES COURSE ( CRSECD) ,
FOREI GN KEY ( PRECRSECD) REFERENCES COURSE ( CRSECD)
)
CREATE TABLE LECTURER(
STFI D I NTEGER NOT NULL,
SCHLNM VARCHAR( 30) NOT NULL,
SUPI D I NTEGER,
LECTNM VARCHAR( 20) ,
LECTTI TL VARCHAR( 30) ,
OFFROOM VARCHAR( 10) ,
PRI MARY KEY ( STFI D) ,
FOREI GN KEY ( SCHLNM) REFERENCES SCHOOL ( SCHLNM) ,
FOREI GN KEY ( SUPI D) REFERENCES LECTURER ( STFI D)
)
CREATE TABLE LECTURER_COURSE(
STFI D I NTEGER NOT NULL,
CRSECD CHAR( 10) NOT NULL,
PRI MARY KEY ( STFI D, CRSECD) ,
FOREI GN KEY ( CRSECD) REFERENCES COURSE ( CRSECD) ,
FOREI GN KEY ( STFI D) REFERENCES LECTURER ( STFI D)
)
CREATE TABLE COMMI TTEE(
COMMTI TL VARCHAR( 30) NOT NULL,
FACNM VARCHAR( 30) NOT NULL,
MTFREQ VARCHAR( 10) ,
PRI MARY KEY ( COMMTI TL, FACNM) ,
Master Thesis Weiguang Zhang McMaster University- Computing and Software
14

FOREI GN KEY ( FACNM) REFERENCES FACULTY ( FACNM)


)
CREATE TABLE COMMI TTEE_LECTURER(
STFI D I NTEGER NOT NULL,
COMMTI TL VARCHAR( 30) NOT NULL,
FACNM VARCHAR( 30) NOT NULL,
PRI MARY KEY ( STFI D, COMMTI TL, FACNM) ,
FOREI GN KEY ( STFI D) REFERENCES LECTURER ( STFI D) ,
FOREI GN KEY ( COMMTI TL, FACNM) REFERENCES COMMI TTEE ( COMMTI TL,
FACNM)
)
3.5 University System Interactive Queries

Query 1: List all the schools are located in 'Toronto Campus', and sort them by school
name.

SELECT SCHLNM AS SCHOOL_NAME
FROM SCHOOL
WHERE CMPSNM = ' Tor ont o Campus'
ORDER BY SCHLNM

Query 2: List all the programmes provided by 'science faculty'.

SELECT P. PROGCD AS PROGRAMME_CODE
FROM PROGRAMME P
I NNER J OI N SCHOOL S ON P. SCHLNM = S. SCHLNM
I NNER J OI N FACULTY F ON S. FACNM = F. FACNM
WHERE F. FACNM = ' sci ence f acul t y'

Query 3: Give all the names of the lecturers who are the members of the committee and
sort by their name.

SELECT DI STI NCT L. LECTNM AS LECTURER_NAME
FROM COMMI TTEE_LECTURER CL
J OI N LECTURER L ON CL. STFI D = L. STFI D
ORDER BY L. LECTNM

Query 4: List all supervisor's name and the name of the lecturer they manage. Please sort
by supervisor name and lecturer name.

SELECT SUP. LECTNM AS SUPERVI SOR_NAME, L. LECTNM AS LECTURER_NAME
FROM LECTURER SUP
I NNER J OI N LECTURER L ON SUP. STFI D = L. SUPI D
ORDER BY SUP. LECTNM, L. LECTNM


Query 5: Give all the lecturers who are not the member of the committee.

Master Thesis Weiguang Zhang McMaster University- Computing and Software
15

SELECT STFI D AS STAFF_I D


FROM LECTURER
WHERE STFI D NOT I N ( SELECT DI STI NCT STFI D FROM COMMI TTEE_LECTURER)

Query 6: Give the total number of courses for each programme.

SELECT PROGCD AS PROGRAMME_CODE, COUNT( CRSECD) AS NUMBER_OF_COURSE
FROM COURSE
GROUP BY PROGCD

Query 7: Give all the lecturers with the courses they are teaching. Sort by lecturer name.

SELECT L. LECTNM AS LECTURER_NAME, C. CRSETI TL AS COURSE_TI TLE
FROM LECTURER_COURSE LC
I NNER J OI N LECTURER L ON LC. STFI D = L. STFI D
I NNER J OI N COURSE C ON LC. CRSECD = C. CRSECD
ORDER BY L. LECTNM

Query 8: Give all the course titles and their corresponding prerequisite course titles.

SELECT C1. CRSETI TL AS COURSE_TI TLE, C2. CRSETI TL AS PRE_COURSE_TI TLE
FROM PRE_COURSE PC
I NNER J OI N COURSE C1 ON PC. CRSECD = C1. CRSECD
I NNER J OI N COURSE C2 ON PC. PRECRSECD = C2. CRSECD

Query 9: Give the top 5 courses which have more students involved.

SELECT C. CRSECD AS COURSE_CODE, COUNT( SS. STUI D) AS NUMBER_OF_STUDENTS
FROM COURSE_STUDENT SS
LEFT J OI N COURSE S ON SS. SUBJ CD = S. SUBJ CD
LEFT J OI N COURSE C ON S. CRSECD = C. CRSECD
GROUP BY C. CRSECD
ORDER BY NUMBER_OF_STUDENTS DESC
FETCH FI RST 5 ROWS ONLY

Query 10: Give any of the prerequisite courses was not took by any of the students who
enrolled into the university in 2010, and were taking the courses in 2011.

SELECT DI STI NCT STUI D, PC. PRECRSECD AS PRE_COURSE
FROM COURSE_STUDENT CS
RI GHT J OI N PRE_COURSE PC ON CS. CRSECD = PC. CRSECD
WHERE STUI D I N ( SELECT STUI D FROM STUDENT WHERE YRENRL = 2010)
AND YRTKN = 2011
EXCEPT
SELECT STUI D, CRSECD
FROM COURSE_STUDENT
WHERE STUI D I N ( SELECT STUI D FROM STUDENT WHERE YRENRL = 2010)
AND YRTKN = 2010




Master Thesis Weiguang Zhang McMaster University- Computing and Software
16

3.6 University System Application Program



Write a simple C program using embedded SQL. The program is to excute and display
the results on the screen in the same format as the DB2. It is to execute any of the ten
queries listed in the previous section based on what action the user chooses, or all ten
queries together. Assume the name of the databse is OURDB.

#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>
#i ncl ude <st r i ng. h>

EXEC SQL I NCLUDE SQLCA;

voi d quer y1( ) ;
voi d quer y2( ) ;
voi d quer y3( ) ;
voi d quer y4( ) ;
voi d quer y5( ) ;
voi d quer y6( ) ;
voi d quer y7( ) ;
voi d quer y8( ) ;
voi d quer y9( ) ;
voi d quer y10( ) ;
voi d do_al l ( ) ;

i nt connect ed=0;

voi d sql er r ( char * x) {
i f ( SQLCODE! =0) {
pr i nt f ( " er r or %s ( %d) \ n" , x, SQLCODE) ;
i f ( connect ed) {
EXEC SQL CONNECT RESET;
pr i nt f ( " di sconnect ed f r omOURDB\ n" ) ;
}
exi t ( 1) ;
}
}

voi d connect ( ) {
EXEC SQL CONNECT TO OURDB;
sql er r ( " CONNECT TO OURDB" ) ;
pr i nt f ( " Connect ed t o OURDB\ n" ) ;
connect ed = 1;
}

voi d di sconnect ( ) {
EXEC SQL CONNECT RESET;
sql er r ( " CONNECT RESET" ) ;
pr i nt f ( " Di sconnect ed f r omCS3DB3\ n" ) ;
connect ed = 0;
}
Master Thesis Weiguang Zhang McMaster University- Computing and Software
17


voi d depad( char * s) {
i nt i ;
i =st r l en( s) - 1;
whi l e( s[ i ] ==' ' ) s[ i - - ] =' \ 0' ;
}

char buf f er [ 300] ;

i nt mai n( ) {
i nt i , j ;
connect ( ) ;
whi l e( 1) {
A: pr i nt f ( " ent er number of quer y you want t o execut e "
" ( 1- 10) , \ n 0 t o qui t , anyt hi ng el se al l quer i es\ n" ) ;
f get s( buf f er , 300, st di n) ;
i f ( buf f er [ 0] ==' \ n' ) {
pr i nt f ( " not hi ng ent er ed\ n" ) ;
cont i nue;
}
i =j =0;
whi l e( buf f er [ j ] ! =' \ n' ) {
i f ( buf f er [ j ] >=' 0' && buf f er [ j ] <=' 9' )
i = 10*i +buf f er [ j ] - ' 0' ;
el se{
pr i nt f ( " i ncor r ect ent r y\ n" ) ;
got o A;
}
j ++;
}
i f ( i == 0) br eak;
el se i f ( i == 1) quer y1( ) ;
el se i f ( i == 2) quer y2( ) ;
el se i f ( i == 3) quer y3( ) ;
el se i f ( i == 4) quer y4( ) ;
el se i f ( i == 5) quer y5( ) ;
el se i f ( i == 6) quer y6( ) ;
el se i f ( i == 7) quer y7( ) ;
el se i f ( i == 8) quer y8( ) ;
el se i f ( i == 9) quer y9( ) ;
el se i f ( i == 10) quer y10( ) ;
el se {
do_al l ( ) ;
br eak;
}
}

di sconnect ( ) ;
r et ur n 0;
}
i nt count , l en, l en1;
char buf 1[ 80] ;

EXEC SQL BEGI N DECLARE SECTI ON;
Master Thesis Weiguang Zhang McMaster University- Computing and Software
18

char school _name[ 30] ;


char pr ogr amme_code[ 11] ;
char l ect ur er _name[ 20] ;
char super vi sor _name[ 20] ;
sql i nt 32 st af f _i d;
sql i nt 16 number _of _cour se;
char cour se_t i t l e[ 20] ;
char pr e_cour se_t i t l e[ 20] ;
sql i nt 16 number _of _st udent s;
sql i nt 32 st udent _i d;
char pr e_cour se[ 10] ;
EXEC SQL END DECLARE SECTI ON;

voi d quer y1( ) {
pr i nt f ( " di spl ayi ng r esul t of quer y 1\ n" ) ;
EXEC SQL DECLARE cur 1 CURSOR FOR
SELECT SCHLNM AS SCHOOL_NAME
FROM SCHOOL
WHERE CMPSNM = ' Tor ont o Campus'
ORDER BY SCHLNM;
sql er r ( " OPEN cur 1" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 1 I NTO : school _name;

i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " SCHOOL_NAME\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( school _name) ;
pr i nt f ( " %s\ n" , school _name) ;
count ++;
}

EXEC SQL CLOSE cur 1;
sql er r ( " CLOSE cur 1" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y2( ) {
pr i nt f ( " di spl ayi ng r esul t of quer y 2\ n" ) ;
EXEC SQL DECLARE cur 2 CURSOR FOR
SELECT P. PROGCD AS PROGRAMME_CODE
FROM PROGRAMME P
I NNER J OI N SCHOOL S ON P. SCHLNM = S. SCHLNM
I NNER J OI N FACULTY F ON S. FACNM = F. FACNM
WHERE F. FACNM = ' sci ence f acul t y' ;
sql er r ( " DECLARE cur 2" ) ;

EXEC SQL OPEN cur 2;
sql er r ( " OPEN cur 2" ) ;
Master Thesis Weiguang Zhang McMaster University- Computing and Software
19

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 2 I NTO : pr ogr amme_code;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " PROGRAMME_CODE\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - \ n" ) ;
}
depad( pr ogr amme_code) ;
pr i nt f ( " %s\ n" , pr ogr amme_code) ;
count ++;
}

EXEC SQL CLOSE cur 2;
sql er r ( " CLOSE cur 2" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y3( ) {
pr i nt f ( " di spl ayi ng r esul t of quer y 3\ n" ) ;
EXEC SQL DECLARE cur 3 CURSOR FOR
SELECT DI STI NCT L. LECTNM AS LECTURER_NAME
FROM COMMI TTEE_LECTURER CL
J OI N LECTURER L ON CL. STFI D = L. STFI D
ORDER BY L. LECTNM;
sql er r ( " DECLARE cur 3" ) ;

EXEC SQL OPEN cur 3;
sql er r ( " OPEN cur 3" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 3 I NTO : l ect ur er _name;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " LECTURER_NAME\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - \ n" ) ;
}
pr i nt f ( " %s\ n" , l ect ur er _nam) ;
count ++;
}

EXEC SQL CLOSE cur 3;
sql er r ( " CLOSE cur 3" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y4( ) {
i nt i ;
pr i nt f ( " di spl ayi ng r esul t of quer y 4\ n" ) ;

EXEC SQL DECLARE cur 4 CURSOR FOR
Master Thesis Weiguang Zhang McMaster University- Computing and Software
20

SELECT SUP. LECTNM AS SUPERVI SOR_NAME, L. LECTNM AS LECTURER_NAME


FROM LECTURER SUP
I NNER J OI N LECTURER L ON SUP. STFI D = L. SUPI D
ORDER BY SUP. LECTNM, L. LECTNM;
sql er r ( " DECLARE cur 4" ) ;

EXEC SQL OPEN cur 4;
sql er r ( " OPEN cur 4" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 4 I NTO : super vi sor _name,
: l ect ur er _name;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " SUPERVI SOR_NAME LECTURER_NAME\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( super vi sor _name) ;
depad( l ect ur er _name) ;
pr i nt f ( " %s" , super vi sor _name) ;
f or ( i = 20- st r l en( super vi sor _name) ; i >=0; i - - ) f put c( ' ' , st dout ) ;
pr i nt f ( " %s\ n" , l ect ur er _name) ;
count ++;
}
EXEC SQL CLOSE cur 4;
sql er r ( " CLOSE cur 4" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y5( ) {
pr i nt f ( " di spl ayi ng r esul t of quer y 5\ n" ) ;
EXEC SQL DECLARE cur 5 CURSOR FOR
SELECT STFI D AS STAFF_I D
FROM LECTURER
WHERE STFI D NOT I N
( SELECT DI STI NCT STFI D FROM COMMI TTEE_LECTURER) ;
sql er r ( " DECLARE cur 5" ) ;

EXEC SQL OPEN cur 5;
sql er r ( " OPEN cur 5" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 5 I NTO : st af f _i d;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " STAFF_I D\ n" ) ;
pr i nt f ( " - - - - - - - - - - - \ n" ) ;
}
depad( st af f _i d) ;
pr i nt f ( " %s\ n" , st af f _i d) ;
count ++;
Master Thesis Weiguang Zhang McMaster University- Computing and Software
21

}

EXEC SQL CLOSE cur 5;
sql er r ( " CLOSE cur 5" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y6( ) {
i nt i ;
pr i nt f ( " di spl ayi ng r esul t of quer y 6\ n" ) ;
EXEC SQL DECLARE cur 6 CURSOR FOR
SELECT PROGCD AS PROGRAMME_CODE, COUNT( CRSECD) AS NUMBER_OF_COURSE
FROM COURSE
GROUP BY PROGCD;
sql er r ( " DECLARE cur 6" ) ;

EXEC SQL OPEN cur 6;
sql er r ( " OPEN cur 6" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 6 I NTO : pr ogr amme_code,
: number _of _cour se;

i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " PROGRAMME_CODE NUMBER_OF_COURSE\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( pr ogr amme_code) ;
depad( number _of _cour se) ;
pr i nt f ( " %s" , pr ogr amme_code) ;
f or ( i = st r l en( pr ogr amme_code) ; i <11; put char ( ' ' ) , i ++) ;
pr i nt f ( " %s" , number _of _cour se) ;
count ++;
}

EXEC SQL CLOSE cur 6;
sql er r ( " CLOSE cur 6" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y7( ) {
i nt i ;
pr i nt f ( " di spl ayi ng r esul t of quer y 7\ n" ) ;
EXEC SQL DECLARE cur 7 CURSOR FOR
SELECT L. LECTNM AS LECTURER_NAME, C. CRSETI TL AS COURSE_TI TLE
FROM LECTURER_COURSE LC
I NNER J OI N LECTURER L ON LC. STFI D = L. STFI D
I NNER J OI N COURSE C ON LC. CRSECD = C. CRSECD
ORDER BY L. LECTNM;
sql er r ( " DECLARE cur 7" ) ;
Master Thesis Weiguang Zhang McMaster University- Computing and Software
22

EXEC SQL OPEN cur 7;


sql er r ( " OPEN cur 7" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 7 I NTO : l ect ur er _name,
: cour se_t i t l e;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " LECTURER_NAME COURSE_TI TLE\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( l ect ur er _name) ;
depad( cour se_t i t l e) ;
pr i nt f ( " %s" , l ect ur er _name) ;
f or ( i = st r l en( l ect ur er _name) ; i <9; put char ( ' ' ) , i ++) ;
pr i nt f ( " %s" , cour se_t i t l e) ;
count ++;
}

EXEC SQL CLOSE cur 7;
sql er r ( " CLOSE cur 7" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y8( ) {
i nt i ;
pr i nt f ( " di spl ayi ng r esul t of quer y 8\ n" ) ;
EXEC SQL DECLARE cur 8 CURSOR FOR
SELECT C1. CRSETI TL AS COURSE_TI TLE, C2. CRSETI TL AS
PRE_COURSE_TI TLE
FROM PRE_COURSE PC
I NNER J OI N COURSE C1 ON PC. CRSECD = C1. CRSECD
I NNER J OI N COURSE C2 ON PC. PRECRSECD = C2. CRSECD;
sql er r ( " DECLARE cur 8" ) ;

EXEC SQL OPEN cur 8;
sql er r ( " OPEN cur 8" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 8 I NTO : cour se_t i t l e,
: pr e_cour se_t i t l e;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " COURSE_TI TLE PRE_COURSE_TI TLE\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}

depad( cour se_t i t l e) ;
pr i nt f ( " %s" , cour se_t i t l e) ;
f or ( i = st r l en( cour se_t i t l e) ; i <10; put char ( ' ' ) , i ++) ;
pr i nt f ( " %. 24f \ n" , pr e_cour se_t i t l e) ;
Master Thesis Weiguang Zhang McMaster University- Computing and Software
23

count ++;
}

EXEC SQL CLOSE cur 8;
sql er r ( " CLOSE cur 8" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y9( ) {
i nt i ;
pr i nt f ( " di spl ayi ng r esul t of quer y 9\ n" ) ;
EXEC SQL DECLARE cur 9 CURSOR FOR
SELECT P. PROGCD AS PROGRAMME_CODE, COUNT( CS. STUI D) AS
NUMBER_OF_STUDENTS
FROM COURSE_STUDENT CS
LEFT J OI N COURSE C ON CS. CRSECD = C. CRSECD
LEFT J OI N PROGRAMME P ON P. PROGCD = C. PROGCD
GROUP BY P. PROGCD
ORDER BY NUMBER_OF_STUDENTS DESC
FETCH FI RST 5 ROWS ONLY;
sql er r ( " DECLARE cur 9" ) ;

EXEC SQL OPEN cur 9;
sql er r ( " OPEN cur 9" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 9 I NTO : pr ogr amme_code,
: number _of _st udent s;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " PROGRAMME_CODE NUMBER_OF_STUDENTS\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( pr ogr amme_code) ;
depad( number _of _st udent s) ;

pr i nt f ( " %s" , pr ogr amme_code) ;
f or ( i = st r l en( pr ogr amme_code) ; i <12; put char ( ' ' ) , i ++) ;
pr i nt f ( " %s\ n" , number _of _st udent s) ;
count ++;
}

EXEC SQL CLOSE cur 9;
sql er r ( " CLOSE cur 9" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y10( ) {
i nt i ;
pr i nt f ( " di spl ayi ng r esul t of quer y 10\ n" ) ;

Master Thesis Weiguang Zhang McMaster University- Computing and Software
24

EXEC SQL DECLARE cur 10 CURSOR FOR


SELECT DI STI NCT STUI D, PC. PRECRSECD AS PRE_COURSE
FROM COURSE_STUDENT CS
RI GHT J OI N PRE_COURSE PC ON CS. CRSECD = PC. CRSECD
WHERE STUI D I N ( SELECT STUI D FROM STUDENT WHERE YRENRL = 2010)
AND YRTKN = 2011
EXCEPT
SELECT STUI D, CRSECD
FROM COURSE_STUDENT
WHERE STUI D I N ( SELECT STUI D FROM STUDENT WHERE YRENRL = 2010)
AND YRTKN = 2010;
sql er r ( " DECLARE cur 10" ) ;

EXEC SQL OPEN cur 10;
sql er r ( " OPEN cur 10" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 10 I NTO : st udent _i d,
: pr e_cour se;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " STUDENT_I D PRE_COURSE\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}

depad( st udent _i d) ;

pr i nt f ( " %s" , st udent _i d) ;
f or ( i = st r l en( st udent _i d) ; i <10; put char ( ' ' ) , i ++) ;
pr i nt f ( " %d\ n" , pr e_cour se) ;
count ++;
}

EXEC SQL CLOSE cur 10;
sql er r ( " CLOSE cur 10" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d do_al l ( ) {
quer y1( ) ;
quer y2( ) ;
quer y3( ) ;
quer y4( ) ;
quer y5( ) ;
quer y6( ) ;
quer y7( ) ;
quer y8( ) ;
quer y9( ) ;
quer y10( ) ;
}
Master Thesis Weiguang Zhang McMaster University- Computing and Software
25

Chapter 4: Airline Reservation


4.1 Airline Reservation informal description

There are 6 different airlines in 6 different countries: Canada AirCan, USA - USAir,
UK - BritAir, France - AirFrance, Germany - LuftAir, Italy - ItalAir. Their flights involve
the following 12 cities: Toronto and Montreal in Canada, New York and Chicago in US,
London and Edinburgh in UK, Paris and Nice in France, Bonn and Berlin in Germany,
Rome and Naples in Italy. In each of the 12 cities, there is a (single) booking office. You
are going to design a central air-reservation database to be used by all booking offices.
The flight has a unique flight number, air line code, business class indicator,
smoking allowed indicator. Flight availability has flight number, date +time of departure,
number of total seats available in business class, number of booked seats in business
class, number of total seats available in economy class, and number of booked seats in
economy class.
The customers may come from any country, not just the 6 above, and from any
province/state, and from any city. Customer has first & last name, mailing address, zero
or more phone numbers, zero or more fax numbers, and zero or more email addresses.
Mailing address has street, city, province or state, postal code and country. Phone/fax
number has country code, area code and local number. Email address has only one string,
and no structure is assumed. A customer can book one or more flights. Two or more
customers may have same mailing address and/or same phone number(s) and/or same fax
number(s). But the email address is unique for each customer. First and last names do not
have to be unique.
Booking has an unique booking number, booking city, booking date, flight
number, date +time of departure (in local time, and time is always in hours and minutes),
date +time of arrival (in local time), class indicator, total price (airport tax in origin +
airport tax in destination +flight price in local currency. The flight price for business
class is 1.5 times of the listed flight price), status indicator (three types: booked. Canceled
the customer canceled the booking, scratched the customer had not paid in full 30
days prior to the departure), customer who is responsible for payment, amount-paid-so far
(in local currency), outstanding balance (in local currency), the first & last names to be
printed on the ticket. The airport taxes must be stored in local currencies (i.e. Canadian
Master Thesis Weiguang Zhang McMaster University- Computing and Software
26

dollars, US dollars, British Pounds, French francs, German marks, and Italian Liras).
Since the exchange rates change daily, they also must be stored for calculations of all
prices involved.
Though France, Germany, and Italy have had a common currency for a while, we
used the names of their original currencies to involve in this exercise currency exchange
rates and their changes.
Master Thesis Weiguang Zhang McMaster University- Computing and Software
27

4.2 Airline Reservation Logical Model

Figure 4: The Airline Reservation Logical Model


Master Thesis Weiguang Zhang McMaster University- Computing and Software
28

4.3 Airline Reservation DB2 Physical Model



Figure 5: The Airline Reservation Physical Model
Master Thesis Weiguang Zhang McMaster University- Computing and Software
29

4.4 Airline Reservation DB2 Schema

CREATE TABLE CUSTOMER (


CUSTI D I NT NOT NULL,
FNAME VARCHAR( 20) NOT NULL,
LNAME VARCHAR( 20) NOT NULL,
STREET VARCHAR( 50) NOT NULL,
CI TY VARCHAR( 30) NOT NULL,
PROVI NCE VARCHAR( 30) NOT NULL,
COUNTRY VARCHAR( 30) NOT NULL,
POSTCODE VARCHAR( 20) NOT NULL,
PRI MARY KEY ( CUSTI D)
)
CREATE TABLE PHONE (
PCRTYCODE CHAR( 2) NOT NULL,
PAREACODE CHAR( 3) NOT NULL,
PNUMBER CHAR( 7) NOT NULL,
CUSTI D I NT NOT NULL,
PRI MARY KEY ( CUSTI D, PCRTYCODE, PAREACODE, PNUMBER) ,
FOREI GN KEY ( CUSTI D) REFERENCES CUSTOMER ( CUSTI D)
)
CREATE TABLE FAX (
FAREACODE CHAR( 3) NOT NULL,
FCTRYCODE CHAR( 2) NOT NULL,
FNUMBER CHAR( 7) NOT NULL,
CUSTI D I NT NOT NULL,
PRI MARY KEY ( CUSTI D, FCTRYCODE, FAREACODE, FNUMBER) ,
FOREI GN KEY ( CUSTI D) REFERENCES CUSTOMER ( CUSTI D)
)
CREATE TABLE EMAI L (
EMAI L VARCHAR( 50) NOT NULL,
CUSTI D I NT NOT NULL,
PRI MARY KEY ( CUSTI D, EMAI L) ,
UNI QUE ( EMAI L) ,
FOREI GN KEY ( CUSTI D) REFERENCES CUSTOMER ( CUSTI D)
)
CREATE TABLE COUNTRY (
CTRYCD CHAR( 2) NOT NULL,
CTRYNM VARCHAR( 30) ,
PRI MARY KEY ( CTRYCD)
)
CREATE TABLE AI RLI NE (
AI RLI NECD VARCHAR( 10) NOT NULL,
CTRYCD CHAR( 2) NOT NULL,
PRI MARY KEY ( AI RLI NECD) ,
FOREI GN KEY ( CTRYCD) REFERENCES COUNTRY ( CTRYCD)
)
CREATE TABLE FLI GHT (
FNO VARCHAR( 10) NOT NULL,
SMALLOW CHAR( 1) NOT NULL,
BCAVL CHAR( 1) ,
AI RLI NECD VARCHAR( 10) NOT NULL,
Master Thesis Weiguang Zhang McMaster University- Computing and Software
30

PRI MARY KEY ( FNO) ,


FOREI GN KEY ( AI RLI NECD) REFERENCES AI RLI NE ( AI RLI NECD)
)
CREATE TABLE CURRENCY (
FCURR CHAR( 3) NOT NULL,
TCURR CHAR( 3) NOT NULL,
EXCHRATE DECI MAL( 8, 4) NOT NULL,
PRI MARY KEY ( FCURR, TCURR)
)
CREATE TABLE CI TY (
CI TYNM VARCHAR( 30) ,
CI TYI D I NT NOT NULL,
CTRYCD CHAR( 2) NOT NULL,
PRI MARY KEY ( CI TYI D) ,
FOREI GN KEY ( CTRYCD) REFERENCES COUNTRY ( CTRYCD)
)
CREATE TABLE AI RPORT (
CI TYI D I NT NOT NULL,
AI RPORTCD CHAR( 3) NOT NULL,
AI RPORTNM VARCHAR( 50) ,
AI RPORTTAX DECI MAL( 6, 2) NOT NULL,
PRI MARY KEY ( AI RPORTCD) ,
FOREI GN KEY ( CI TYI D) REFERENCES CI TY ( CI TYI D)
)
CREATE TABLE CI TY_CURRENCY (
CI TYI D I NT NOT NULL,
FCURR CHAR( 3) NOT NULL,
TCURR CHAR( 3) NOT NULL,
PRI MARY KEY ( CI TYI D, FCURR, TCURR) ,
FOREI GN KEY ( CI TYI D) REFERENCES CI TY ( CI TYI D) ,
FOREI GN KEY ( FCURR, TCURR) REFERENCES CURRENCY ( FCURR, TCURR)
)
CREATE TABLE FLI GHT_AVAI LABI LI TY (
FLEN VARCHAR( 30) NOT NULL,
DEPTTI ME VARCHAR( 30) NOT NULL,
ARRTI ME VARCHAR( 30) NOT NULL,
FNO VARCHAR( 10) NOT NULL,
BBUSSEAT I NT NOT NULL,
BECOSEAT I NT NOT NULL,
TBUSSEAT I NT NOT NULL,
TECOSEAT I NT NOT NULL,
DEST CHAR( 3) NOT NULL,
ORI G CHAR( 3) NOT NULL,
PRI MARY KEY ( FNO, ORI G, DEST, DEPTTI ME, ARRTI ME) ,
FOREI GN KEY ( FNO) REFERENCES FLI GHT ( FNO) ,
FOREI GN KEY ( DEST) REFERENCES AI RPORT ( AI RPORTCD) ,
FOREI GN KEY ( ORI G) REFERENCES AI RPORT ( AI RPORTCD)
)
CREATE TABLE CLASS (
CLASSI D I NT NOT NULL,
CLASS VARCHAR( 10) ,
PRI MARY KEY ( CLASSI D)
)
CREATE TABLE STATUS (
Master Thesis Weiguang Zhang McMaster University- Computing and Software
31

STATUSI D I NT NOT NULL,


STATUS VARCHAR( 10) ,
PRI MARY KEY ( STATUSI D)
)
CREATE TABLE BOOKI NG (
BKGNO I NT NOT NULL,
BKGDATE dat e NOT NULL,
BAL DECI MAL( 8, 2) ,
TOTPRI CE DECI MAL( 8, 2) ,
PAI DAMT DECI MAL( 8, 2) NOT NULL,
FPRI CE DECI MAL( 8, 2) NOT NULL,
FNO VARCHAR( 10) NOT NULL,
DEPTTI ME VARCHAR( 30) NOT NULL,
ARRTI ME VARCHAR( 30) NOT NULL,
DEST CHAR( 3) NOT NULL,
ORI G CHAR( 3) NOT NULL,
BKGCI TY I NT NOT NULL,
CUSTI D I NT NOT NULL,
PAI DBY I NT NOT NULL,
CLASSI D I NT NOT NULL,
STATUSI D I NT NOT NULL,
PRI MARY KEY ( BKGNO) ,
FOREI GN KEY ( FNO, ORI G, DEST, DEPTTI ME, ARRTI ME) REFERENCES
FLI GHT_AVAI LABI LI TY ( FNO, ORI G, DEST, DEPTTI ME, ARRTI ME) ,
FOREI GN KEY ( BKGCI TY) REFERENCES CI TY ( CI TYI D) ,
FOREI GN KEY ( CUSTI D) REFERENCES CUSTOMER ( CUSTI D) ,
FOREI GN KEY ( PAI DBY) REFERENCES CUSTOMER ( CUSTI D) ,
FOREI GN KEY ( CLASSI D) REFERENCES CLASS ( CLASSI D) ,
FOREI GN KEY ( STATUSI D) REFERENCES STATUS ( STATUSI D)
)
4.5 Airline Reservation Interactive Queries
Query 1: Give all the customers who lives in Canada and sort by customer_id.

SELECT CUSTI D AS CUSTOMER_I D
FROM CUSTOMER
WHERE COUNTRY = ' Canada'
ORDER BY CUSTI D

Query 2: List all different customers who made bookings.

SELECT DI STI NCT CUSTI D AS CUSTOMER_I D
FROM BOOKI NG

Query 3: Display all currency exchange rate is greater than 1. Please sort them by
from_currency and to_currency.

SELECT FCURR AS FROM_CURRENCY, TCURR AS TO_CURRENCY, EXCHRATE AS
EXCHANGE_RATE
FROM CURRENCY
WHERE EXCHRATE > 1
Master Thesis Weiguang Zhang McMaster University- Computing and Software
32

ORDER BY FCURR, TCURR



Query 4: List all the flight availabilities between Toronto (airport code is 'YYZ') and New
York (airport code is 'J FK'). Please display flight_no, origin, destinatin,
depature_time, and arrival_time. Please sort them by flight_no.

SELECT FNO AS FLI GHT_NO, ORI G AS ORI GI N, DEST AS DESTI NATI ON, DEPTTI ME
ASDEPATURE_TTI ME, ARRTI ME AS ARRI VAL_TI ME
FROM FLI GHT_AVAI LABI LI TY
WHERE ORI G = ' YYZ' AND DEST = ' J FK'
OR ORI G = ' J FK' AND DEST = ' YYZ'
ORDER BY FNO

Query 5: List all customers who did not place any booking. Please display customer_id
only, and sort records by customer_id.

SELECT CUSTI D AS CUSTOMER_I D
FROM CUSTOMER
WHERE CUSTI D NOT I N ( SELECT DI STI NCT CUSTI D FROM BOOKI NG)
ORDER BY CUSTI D

Query 6: Display all customer's first_name, last_name, phone_no (format like 416-111-
2222) and email. Please sort them by customer_id.

SELECT C. CUSTI D AS CUSTOMER_I D,
C. FNAME AS FI RST_NAME,
C. LNAME AS LAST_NAME,
P. PCRTYCODE| | ' - ' | | P. PAREACODE| | ' - ' | | P. PNUMBER AS PHONE_NO,
E. EMAI L AS EMAI L
FROM CUSTOMER C
RI GHT J OI N PHONE P ON C. CUSTI D = P. CUSTI D
RI GHT J OI N EMAI L E ON C. CUSTI D = E. CUSTI D
ORDER BY C. CUSTI D

Query 7: List all canceled bookngs. please display booking_no, customer_id, flight_no,
origin, destination, class, status, and booking_city. Please also sort by
booking_no, customer_id and flight_no.

SELECT BKGNO AS BOOKI NG_NO, CUSTI D AS CUSTOMER_I D, FNO AS FLI GHT_NO,
ORI G AS ORI GI N, DEST AS DESTI NATI ON, C. CLASS AS CLASS,
S. STATUS AS STATUS, CI TY. CI TYNM AS BOOKI NG_CI TY
FROM BOOKI NG B
I NNER J OI N STATUS S ON B. STATUSI D = S. STATUSI D
I NNER J OI N CLASS C ON B. CLASSI D = C. CLASSI D
I NNER J OI N CI TY ON B. BKGCI TY = CI TY. CI TYI D
WHERE S. STATUS = ' Cancel ed'
ORDER BY BKGNO, CUSTI D, FNO

Query 8: List total_price, total_payment and total_balance for each city. Please exclude
canceled bookings and sort records by city_name.

Master Thesis Weiguang Zhang McMaster University- Computing and Software
33

SELECT C. CI TYNM AS CI TY, SUM( TOTPRI CE) AS TOTAL_PRI CE,


SUM( PAI DAMT) AS TOTAL_PAYMENT, SUM( BAL) AS TOTAL_BALANCE
FROM BOOKI NG B
I NNER J OI N CI TY C ON B. BKGCI TY = C. CI TYI D
WHERE STATUSI D <> 2
GROUP BY C. CI TYNM
ORDER BY C. CI TYNM

Query 9: Calculate new total_price for each booking if origin airport tax increase by 0.01
and destination airport tax decrease by 0.005. Please display booking_no,
origin, destination, flight_price, previous_total_price and new_total_price.

SELECT BKGNO AS BOOKI NG_NO, ORI G AS ORI GI N,
DEST AS DESTI NATI ON, FPRI CE AS FLI GHT_PRI CE,
TOTPRI CE AS PREVI OUS_TOTAL_PRI CE,
FPRI CE*( 1+( O. AI RPORTTAX+0. 01) +( D. AI RPORTTAX- 0. 005) ) AS
NEW_TOTAL_PRI CE
FROM BOOKI NG B
I NNER J OI N AI RPORT O ON B. ORI G = O. AI RPORTCD
I NNER J OI N AI RPORT D ON B. DEST = D. AI RPORTCD

Query 10: List number_of_bookings, number_of_emails, number_of_phones and
mumber_of_faxs for each customer.

SELECT C. CUSTI D AS CUSTOMER_I D
, ( SELECT COUNT( CUSTI D) FROM BOOKI NG WHERE CUSTI D=C. CUSTI D) AS
NUMBER_OF_BOOKI NGS
, ( SELECT COUNT( CUSTI D) FROM EMAI L WHERE CUSTI D=C. CUSTI D) AS
NUMBER_OF_EMAI LS
, ( SELECT COUNT( CUSTI D) FROM PHONE WHERE CUSTI D=C. CUSTI D) AS
NUMBER_OF_PHONES
, ( SELECT COUNT( CUSTI D) FROM FAX WHERE CUSTI D=C. CUSTI D) AS
NUMBER_OF_FAXS
FROM CUSTOMER C
Master Thesis Weiguang Zhang McMaster University- Computing and Software
34

Chapter 5: Movie Rental


5.1 Movie Rental Informal Description

The movies are rented out in stores and there are several stores. Each store has a unique
distributor that supplies the store with tapes. A distributor may supply more than one
store. Each distributor has a name, an address, and a phone number. Each store has a
name, an address, and a phone number. For each employee we must keep the following
information: working store, a name, a supervisor, an address , a phone number, SIN
(social insurance number) and the date when the employee was hired. For each customer
we have to keep the following information: a name, an address, and a phone number (if
any).
For each rental, we must keep track of which employee served the customer,
which movie and which copy (i.e. type) the customer rented, information about payment,
the date and the time of the rental, the status (rented, returned_in_time, returned_late), the
rate (i.e. the price), and if applicable, due date and overdue charges. About the payment
we have to keep which of the employees accepted the payment (does not have to be the
same employee who rented the tape), the type of payment (i.e. cash, check, credit card,
direct debit for each type you must provide for relevant information to be kept, e.g.
credit card number if credit card is used), the amount of the payment, date +time of the
payment, payment status (completed if cash or the money have been received, approved if
debit or credit card go through, pending if the check has not cleared yet). About each tape
we have to keep information in what condition the tape is and what movie is on the tape.
About each movie we have to keep its title, directors name, simple description, the name
of a (single) major star, the movies rating (use numbers 1-5).


Master Thesis Weiguang Zhang McMaster University- Computing and Software


35

5.2 Movie Rental Logical Model

Figure 6: The Movie Rental Logical Model


Master Thesis Weiguang Zhang McMaster University- Computing and Software
36

5.3 Movie Rental Physical DB2 Model

Figure 7: The Movie Rental Physical Model


Master Thesis Weiguang Zhang McMaster University- Computing and Software
37

5.4 Movie Rental DB2 Schema

CREATE TABLE DI STRI BUTOR(


DI STI D I NTEGER NOT NULL,
DI STNM VARCHAR( 20) ,
DI STSTR VARCHAR( 30) ,
DI STCI TY VARCHAR( 20) ,
DI STPRVN CHAR( 2) ,
DI STPC CHAR( 6) ,
DI STPNO CHAR( 12) ,
PRI MARY KEY ( DI STI D)
)
CREATE TABLE STORE(
STORENM VARCHAR( 20) ,
STORESTR VARCHAR( 30) ,
STORECI TY VARCHAR( 20) ,
STOREPVN CHAR( 2) ,
STOREPC CHAR( 6) ,
STOREPNO CHAR( 12) ,
STOREI D I NTEGER NOT NULL,
DI STI D I NTEGER NOT NULL,
PRI MARY KEY ( STOREI D) ,
FOREI GN KEY ( DI STI D) REFERENCES DI STRI BUTOR ( DI STI D)
)
CREATE TABLE EMPLOYEE(
EMPSI N CHAR( 9) NOT NULL,
MGRSI N CHAR( 9) ,
EMPNM VARCHAR( 20) ,
EMPSTR VARCHAR( 30) ,
EMPCI TY VARCHAR( 20) ,
EMPPVN CHAR( 2) ,
EMPPC CHAR( 6) ,
EMPPNO CHAR( 12) ,
EMPHI REDT DATE,
STOREI D I NTEGER NOT NULL,
PRI MARY KEY ( EMPSI N) ,
FOREI GN KEY ( MGRSI N) REFERENCES EMPLOYEE ( EMPSI N) ,
FOREI GN KEY ( STOREI D) REFERENCES STORE ( STOREI D)
)
CREATE TABLE CUSTOMER(
CUSTI D I NTEGER NOT NULL,
CUSTNM VARCHAR( 20) ,
CUSTSTR VARCHAR( 30) ,
CUSTCI TY VARCHAR( 20) ,
CUSTPVN CHAR( 2) ,
CUSTPC CHAR( 6) ,
CUSTPNO CHAR( 12) ,
PRI MARY KEY ( CUSTI D)
)
CREATE TABLE MOVI E(
MOVI ETI TL VARCHAR( 20) ,
MOVI EDESC VARCHAR( 50) ,
Master Thesis Weiguang Zhang McMaster University- Computing and Software
38

DI RECTOR VARCHAR( 20) ,


RATI NG I NTEGER,
STARNM VARCHAR( 20) ,
MOVI EI D I NTEGER NOT NULL,
PRI MARY KEY ( MOVI EI D)
)
CREATE TABLE STORE_MOVI E(
MOVI EI D I NTEGER NOT NULL,
STOREI D I NTEGER NOT NULL,
PRI MARY KEY ( MOVI EI D, STOREI D) ,
FOREI GN KEY ( MOVI EI D) REFERENCES MOVI E ( MOVI EI D) ,
FOREI GN KEY ( STOREI D) REFERENCES STORE ( STOREI D)
)
CREATE TABLE TAPE(
TAPEI D I NTEGER NOT NULL,
CONDI TI ON VARCHAR( 20) ,
MOVI EI D I NTEGER NOT NULL,
STOREI D I NTEGER NOT NULL,
PRI MARY KEY ( TAPEI D, MOVI EI D, STOREI D) ,
FOREI GN KEY ( MOVI EI D, STOREI D) REFERENCES STORE_MOVI E ( MOVI EI D,
STOREI D)
)
CREATE TABLE PAYMENT_STATUS(
PSTATUSI D I NTEGER NOT NULL,
PDESC VARCHAR( 20) ,
PRI MARY KEY ( PSTATUSI D)
)
CREATE TABLE PAYMENT_TYPE(
PTI D I NTEGER NOT NULL,
PTDESC VARCHAR( 10) ,
PRI MARY KEY ( PTI D)
)
CREATE TABLE PAYMENT(
PAYI D I NTEGER NOT NULL,
AMT DECI MAL( 8, 2) ,
PAYDTTM TI MESTAMP,
EMPSI N CHAR( 9) NOT NULL,
CUSTI D I NTEGER NOT NULL,
PSTATUSI D I NTEGER NOT NULL,
PTI D I NTEGER NOT NULL,
PRI MARY KEY ( PAYI D) ,
FOREI GN KEY ( EMPSI N) REFERENCES EMPLOYEE ( EMPSI N) ,
FOREI GN KEY ( CUSTI D) REFERENCES CUSTOMER ( CUSTI D) ,
FOREI GN KEY ( PSTATUSI D) REFERENCES PAYMENT_STATUS ( PSTATUSI D) ,
FOREI GN KEY ( PTI D) REFERENCES PAYMENT_TYPE ( PTI D)
)
CREATE TABLE RENTAL_STATUS(
RSTATUSI D I NTEGER NOT NULL,
RDESC VARCHAR( 20) ,
PRI MARY KEY ( RSTATUSI D)
)
CREATE TABLE MOVI E_RENTAL(
DUEDT DATE,
OVERDUECRG DECI MAL( 8, 2) ,
Master Thesis Weiguang Zhang McMaster University- Computing and Software
39

RDTTM TI MESTAMP NOT NULL,


EMPSI N CHAR( 9) NOT NULL,
CUSTI D I NTEGER NOT NULL,
TAPEI D I NTEGER NOT NULL,
RRATE DECI MAL( 8, 2) ,
PAYI D I NTEGER,
MOVI EI D I NTEGER NOT NULL,
STOREI D I NTEGER NOT NULL,
RSTATUSI D I NTEGER NOT NULL,
PRI MARY KEY ( TAPEI D, MOVI EI D, STOREI D, RDTTM) ,
FOREI GN KEY ( EMPSI N) REFERENCES EMPLOYEE ( EMPSI N) ,
FOREI GN KEY ( CUSTI D) REFERENCES CUSTOMER ( CUSTI D) ,
FOREI GN KEY ( TAPEI D, MOVI EI D, STOREI D) REFERENCES TAPE ( TAPEI D,
MOVI EI D, STOREI D) ,
FOREI GN KEY ( PAYI D) REFERENCES PAYMENT ( PAYI D) ,
FOREI GN KEY ( RSTATUSI D) REFERENCES RENTAL_STATUS ( RSTATUSI D)
)
CREATE TABLE DEBI T_CARD(
DNO I NTEGER,
DTYPE VARCHAR( 20) ,
DEXPR CHAR( 5) ,
PAYI D I NTEGER NOT NULL,
PRI MARY KEY ( PAYI D) ,
FOREI GN KEY ( PAYI D) REFERENCES PAYMENT ( PAYI D)
)
CREATE TABLE CREDI T_CARD(
CNO I NTEGER,
CTYPE VARCHAR( 20) ,
CEXPR CHAR( 5) ,
PAYI D I NTEGER NOT NULL,
PRI MARY KEY ( PAYI D) ,
FOREI GN KEY ( PAYI D) REFERENCES PAYMENT ( PAYI D)
)
CREATE TABLE CHECK(
CHECKNO VARCHAR( 30) ,
BANKNO VARCHAR( 20) ,
BANKNM VARCHAR( 30) ,
PAYI D I NTEGER NOT NULL,
PRI MARY KEY ( PAYI D) ,
FOREI GN KEY ( PAYI D) REFERENCES PAYMENT ( PAYI D)
)
5.5 Movie Rental Interactive Queries

Query 1: Give all the customers who lives in Hamilton. Display customer_id and
customer_name.

SELECT CUSTI D AS CUSTOMER_I D, CUSTNM AS CUSTOMER_NAME
FROM CUSTOMER
WHERE CUSTCI TY=' Hami l t on'

Master Thesis Weiguang Zhang McMaster University- Computing and Software
40

Query 2: Display the total payment are received by each employee, and sort by empsin.

SELECT EMPSI N AS EMPLOYEE_SI N, SUM( AMT) AS TOTAL_AMT
FROM PAYMENT
GROUP BY EMPSI N
ORDER BY EMPSI N

Query 3: Display the total movies are rented out by each store, and sort by storeid.

SELECT STOREI D, COUNT( TAPEI D) AS MOVI E_RENTED
FROM MOVI E_RENTAL
GROUP BY STOREI D
ORDER BY STOREI D

Query 4: Display all the tapes are never rented out in every store, and sort by movieid
& tapeid.

SELECT DI STI NCT T. MOVI EI D, T. TAPEI D
FROM TAPE T
LEFT J OI N MOVI E_RENTAL R ON T. MOVI EI D=R. MOVI EI D AND T. TAPEI D=R. TAPEI D
WHERE R. MOVI EI D I S NULL
ORDER BY T. MOVI EI D, T. TAPEI D

Query 5: Display all customers who did not rent any movie so far and sort by custid.

SELECT CUSTI D, CUSTNM
FROM CUSTOMER
WHERE CUSTI D NOT I N ( SELECT DI STI NCT CUSTI D FROM MOVI E_RENTAL)
ORDER BY CUSTI D

Query 6: Display the total amount received by different payment type, and sort by
ptdesc.

SELECT TP. PTDESC AS PAYMENT_TYPE, SUM( AMT) AS TOTAL_AMT
FROM PAYMENT P
I NNER J OI N PAYMENT_TYPE TP ON P. PTI D = TP. PTI D
GROUP BY TP. PTDESC
ORDER BY TP. PTDESC

Query 7. Display the number of movies rented out based on the movie rating, and sort by
rating.

SELECT M. RATI NG, COUNT( MR. MOVI EI D) AS NO_OF_MOVI ES
FROM MOVI E_RENTAL MR
I NNER J OI N MOVI E M ON MR. MOVI EI D = M. MOVI EI D
GROUP BY M. RATI NG

Query 8: Display top 5 customers based on their total payment, and sort their total
payment decreased.

SELECT CUSTI D, SUM( AMT) AS TOTAL_AMT
Master Thesis Weiguang Zhang McMaster University- Computing and Software
41

FROM PAYMENT
GROUP BY CUSTI D
ORDER BY TOTAL_AMT DESC
FETCH FI RST 5 ROWS ONLY

Query 9: List all the movies customer rented. Please display the columns: movie_title,
rental_status, rental_rate, rental_employee, the employ accept the
payment, payment_type and payment_status.

SELECT M. MOVI ETI TL AS MOVI E_TI TLE,
RS. RDESC AS RENTAL_STATUS,
MR. RRATE AS RENTAL_RATE,
E1. EMPNM AS RENTAL_EMPLOYEE,
E2. EMPNM AS CASHI ER_EMPLOYEE,
PT. PTDESC AS PAYMENT_TYPE,
PS. PDESC AS PAYMENT_STATUS
FROM MOVI E_RENTAL MR
I NNER J OI N CUSTOMER C ON MR. CUSTI D = C. CUSTI D
I NNER J OI N MOVI E M ON MR. MOVI EI D = M. MOVI EI D
I NNER J OI N RENTAL_STATUS RS ON MR. RSTATUSI D = RS. RSTATUSI D
I NNER J OI N EMPLOYEE E1 ON MR. EMPSI N = E1. EMPSI N
LEFT J OI N PAYMENT P ON MR. PAYI D = P. PAYI D
LEFT J OI N EMPLOYEE E2 ON P. EMPSI N = E2. EMPSI N
LEFT J OI N PAYMENT_STATUS PS ON P. PSTATUSI D = PS. PSTATUSI D
LEFT J OI N PAYMENT_TYPE PT ON P. PTI D = PT. PTI D
WHERE C. CUSTNM = ' cust omer 1'

Query 10: List all the manager's name and the name of employee they manage.
Please sort by manager sin & employee sin.

SELECT MGR. EMPNM AS MANAGER_NAME, E. EMPNM AS EMPLOYEE_NAME
FROM EMPLOYEE E
I NNER J OI N EMPLOYEE MGR ON E. MGRSI N = MGR. EMPSI N
ORDER BY MGR. EMPSI N, E. EMPSI N



Master Thesis Weiguang Zhang McMaster University- Computing and Software
42

Chapter 6: Car Rental


6.1 Car Rental Informal Description

Our company does car rental business and has several locations with different address
(address consist of street or rural route with the number, city, province and postal code).
The cars are classified as subcompacts, compacts, sedans, or luxury. Each car has a
particular make, model, year made, and color. Each car has a unique identification
number and a unique license plate.
The cars rented in a particular location may be returned to a different location (so-
called drop off). For every car we keep the odometer reading before it is rented and after
it is returned. Since we trust our customers, we do not record the defect when the car is
rent out and returned back. However, we rent the car with full tank and record the volume
of gas in the tank when the car is returned, but we only indicate if the tank is empty,
quarter full, half full, three quarters full, or full.
We keep track of which day a car was rented, but not of the time, similarly for car
returning. If a customer requests a specific class (say sedan), we may rent the customer a
higher-class car if we do not have the requested class in the stock, but we will price it at
the level the customer requested (so-called upgrade). Each car class has its own pricing,
but all cars in the same class are priced the same. We have rental policies for 1 day, 1
week, 2 weeks, and 1 month. Thus, if a customer rents a car for 8 days, it will be priced as
1 week +1 day. The drop-off charge only depends on the class of the rented car, the
location it was rented from and the location it is returned to.
About our customers, we keep their names, addresses, possibly all phone
numbers, and the number of the drivers license (we assume a unique license per person).
About our employees we keep the same information (we require that all our employees
have a drivers license). We have several categories of workers, drivers, cleaners, clerks,
and managers. Any of our employees can rent a car from our company for a 50%
discount, if the rental is less than 2 weeks. However, for any longer rental they must pay
90% of the regular price. Every employee works in one location only. We have
headquarters in Hamilton. The people who work there are all classified as managers, one
of them is the president, two of them are the vice-presidents, one for operation, the other
for marketing).
Master Thesis Weiguang Zhang McMaster University- Computing and Software
43

For certain weeks we have promotional rentals that are usually 60% of the regular
price, but may be also of different percentage. They always affect only a single class of
cars i.e. we may have a promotion for subcompacts, but during that week we do not
have any promotions for compacts, sedans or luxury cars. During some years we can have
many promotions, in some we have none. The promotions cannot be applied to the
employees.

Master Thesis Weiguang Zhang McMaster University- Computing and Software
44

6.2 Car Rental Logical Model



Figure 8: The Car Rental Logic Model
Master Thesis Weiguang Zhang McMaster University- Computing and Software
45

6.3 Car Rental Physical DB2 Model

Figure 9: The Car Rental Physical Model


Master Thesis Weiguang Zhang McMaster University- Computing and Software
46

6.4 Car Rental DB2 Schema



CREATE TABLE ADDRESS (
ADDRESSI D I NTEGER NOT NULL,
SNUMBER CHAR( 10) NOT NULL,
STREET CHAR( 100) NOT NULL,
CI TY CHAR( 20) NOT NULL,
PROVI NCE CHAR( 2) NOT NULL,
PCODE CHAR( 6) NOT NULL,
I S_HQUARTERS CHAR( 1) NOT NULL,
PRI MARY KEY ( ADDRESSI D) ,
UNI QUE ( SNUMBER, STREET, CI TY, PROVI NCE) ,
CHECK( ADDRESSI D > 0) ,
CHECK( PROVI NCE I N ( ' AL' , ' BC' , ' MA' , ' NB' , ' NL' , ' NT' , ' NS' , ' NU' ,
' ON' , ' PE' , ' QU' , ' SA' , ' YT' ) ) ,
CHECK ( I S_HQUARTERS I N ( ' H' , ' 0' ) )
)
CREATE TABLE CLASSTABLE (
CLASS CHAR( 1) NOT NULL,
CDESC VARCHAR( 20) NOT NULL,
PRI MARY KEY ( CLASS) ,
CHECK ( CLASS I N ( ' B' , ' C' , ' S' , ' L' ) )
)
CREATE TABLE CAR (
CARI D I NTEGER NOT NULL,
MAKE CHAR( 10) NOT NULL,
MODEL CHAR( 20) NOT NULL,
YEAR CHAR( 4) NOT NULL,
COLOUR CHAR( 10) NOT NULL,
LPLATE CHAR( 8) NOT NULL,
CLOCATI ON I NTEGER,
CLASS CHAR( 1) ,
PRI MARY KEY ( car i d) ,
FOREI GN KEY ( CLOCATI ON) REFERENCES ADDRESS ( ADDRESSI D) ,
FOREI GN KEY ( CLASS) REFERENCES CLASSTABLE,
CHECK ( CARI D > 0)
)
CREATE TABLE PERSON (
DLI CENSE CHAR( 20) NOT NULL,
FNAME CHAR( 50) NOT NULL,
LNAME CHAR( 50) NOT NULL,
ADDRESSI D I NTEGER NOT NULL,
PRI MARY KEY ( DLI CENSE) ,
FOREI GN KEY ( ADDRESSI D) REFERENCES ADDRESS
)
CREATE TABLE PHONE (
DLI CENSE CHAR( 20) NOT NULL,
PHONE CHAR( 20) NOT NULL,
PRI MARY KEY ( DLI CENSE, PHONE) ,
FOREI GN KEY ( DLI CENSE) REFERENCES PERSON
)
CREATE TABLE ETYPETABLE (
ETYPE CHAR( 1) NOT NULL,
Master Thesis Weiguang Zhang McMaster University- Computing and Software
47

PRI MARY KEY ( ETYPE) ,


CHECK ( ETYPE I N ( ' D' , ' C' , ' K' , ' M' ) )
)
CREATE TABLE EMPLOYEE (
DLI CENSE CHAR( 20) NOT NULL,
LOCATI ON I NTEGER NOT NULL,
ETYPE CHAR( 1) NOT NULL,
I S_PRES CHAR( 1) NOT NULL,
I S_VI P CHAR( 1) NOT NULL,
PRI MARY KEY ( DLI CENSE) ,
FOREI GN KEY ( DLI CENSE) REFERENCES PERSON,
FOREI GN KEY ( LOCATI ON) REFERENCES ADDRESS ( ADDRESSI D) ,
FOREI GN KEY ( ETYPE) REFERENCES ETYPETABLE,
CHECK ( I S_PRES I N ( ' P' , ' 0' ) ) ,
CHECK ( I S_VI P I N ( ' M' , ' P' , ' 0' ) ) ,
CHECK ( ( I S_PRES=' P' AND ETYPE=' M' ) OR
( I S_VI P=' M' AND ETYPE=' M' ) OR
( I S_VI P=' P' AND ETYPE=' M' ) OR
( I S_VI P=' 0' AND I S_PRES=' 0' ) ) ,
CHECK ( ( I S_PRES=' P' AND I S_VI P=' 0' ) OR
( I S_PRES=' 0' AND I S_VI P=' M' ) OR
( I S_PRES=' 0' AND I S_VI P=' P' ) OR
( I S_PRES=' 0' AND I S_VI P=' 0' ) )
)
CREATE TABLE CUSTOMER (
DLI CENSE CHAR( 20) NOT NULL,
PRI MARY KEY ( DLI CENSE) ,
FOREI GN KEY ( DLI CENSE) REFERENCES PERSON
)
CREATE TABLE PRATE (
DURATI ON CHAR( 1) NOT NULL,
CLASS CHAR( 1) NOT NULL,
AMOUNT DECI MAL( 8, 2) NOT NULL,
PRI MARY KEY ( DURATI ON, CLASS) ,
FOREI GN KEY ( CLASS) REFERENCES CLASSTABLE,
CHECK ( DURATI ON I N ( ' D' , ' W' , ' T' , ' M' ) )
)
CREATE TABLE PROMO (
DURATI ON CHAR( 1) NOT NULL,
CLASS CHAR( 1) NOT NULL,
FROM_DATE DATE NOT NULL,
PERCENTAGE DECI MAL( 4, 2) NOT NULL,
PRI MARY KEY ( DURATI ON, CLASS) ,
FOREI GN KEY ( DURATI ON, CLASS) REFERENCES PRATE
)
CREATE TABLE RENTAL (
RENTALI D I NTEGER NOT NULL,
DLI CENSE CHAR( 20) NOT NULL,
CARI D I NTEGER NOT NULL,
FROM_LOCATI ON I NTEGER NOT NULL,
DROPOFF_LOCATI ON I NTEGER NOT NULL,
FROM_DATE DATE NOT NULL,
TO_DATE DATE,
TANK CHAR( 1) NOT NULL,
Master Thesis Weiguang Zhang McMaster University- Computing and Software
48

I NI T_ODO I NTEGER NOT NULL,


RETURN_ODO I NTEGER,
PRI MARY KEY ( RENTALI D) ,
UNI QUE ( CARI D, FROM_DATE) ,
FOREI GN KEY ( CARI D) REFERENCES CAR,
FOREI GN KEY ( DLI CENSE) REFERENCES CUSTOMER,
FOREI GN KEY ( FROM_LOCATI ON) REFERENCES ADDRESS ( ADDRESSI D) ,
FOREI GN KEY ( DROPOFF_LOCATI ON) REFERENCES ADDRESS ( ADDRESSI D) ,
CHECK ( RENTALI D > 0) ,
CHECK ( TANK I N ( ' F' , ' T' , ' H' , ' Q' , ' E' ) ) ,
CHECK ( ( FROM_DATE < TO_DATE) OR ( TO_DATE I S NULL) ) ,
CHECK ( ( I NI T_ODO < RETURN_ODO) OR ( RETURN_ODO I S NULL) )
)
CREATE TABLE RENTALRATE (
RENTALI D I NTEGER NOT NULL,
DURATI ON CHAR( 1) NOT NULL,
CLASS CHAR( 1) NOT NULL,
COUNT I NTEGER NOT NULL,
PRI MARY KEY ( RENTALI D, DURATI ON, CLASS) ,
FOREI GN KEY ( RENTALI D) REFERENCES RENTAL,
FOREI GN KEY ( DURATI ON, CLASS) REFERENCES PRATE,
CHECK ( COUNT > 0)
)
CREATE TABLE DROPOFFCHARGE (
CLASS CHAR( 1) NOT NULL,
FROM_LOCATI ON I NTEGER NOT NULL,
TO_LOCATI ON I NTEGER NOT NULL,
CHARGE DECI MAL( 4, 2) NOT NULL,
PRI MARY KEY ( CLASS, FROM_LOCATI ON, TO_LOCATI ON) ,
FOREI GN KEY ( CLASS) REFERENCES CLASSTABLE,
FOREI GN KEY ( FROM_LOCATI ON) REFERENCES ADDRESS ( ADDRESSI D) ,
FOREI GN KEY ( TO_LOCATI ON) REFERENCES ADDRESS ( ADDRESSI D)
)

6.5 Car Rental Interactive Queries

Query 1: Give last name of all customers who are now renting a car from our company.

SELECT LNAME
FROM CUSTOMER, PERSON, RENTAL
WHERE CUSTOMER. DLI CENSE=RENTAL. DLI CENSE AND CUSTOMER. DLI CENSE =
PERSON. DLI CENSE AND TO_DATE I S NULL

Query 2: Give make and color of all cars currently rented out.

SELECT MAKE, COLOUR
FROM CAR, RENTAL
WHERE CAR. CARI D=RENTAL. CARI D AND TO_DATE I S NULL

Query 3: For each completed rental, give the rental price and rental_id.

Master Thesis Weiguang Zhang McMaster University- Computing and Software
49

SELECT SUM( CHARGE) , RENTALI D


FROM ( SELECT RENTALI D, AMOUNT*COUNT
FROM RENTALRATE, PRATE
WHERE RENTALRATE. DURATI ON=PRATE. DURATI ON
AND RENTALRATE. CLASS=PRATE. CLASS) AS T( RENTALI D, CHARGE)
GROUP BY RENTALI D

Query 4: List last name of all managers.

SELECT LNAME
FROM EMPLOYEE, PERSON
WHERE ETYPE=' M' AND EMPLOYEE. DLI CENSE=PERSON. DLI CENSE

Query 5: List last and first names of all customers.

SELECT LNAME, FNAME
FROM CUSTOMER, PERSON
WHERE CUSTOMER. DLI CENSE=PERSON. DLI CENSE

Query 6: Give a query that answers the question "Is any of our employee also our
customer"?

SELECT *
FROM EMPLOYEE, CUSTOMER
WHERE EMPLOYEE. DLI CENSE=CUSTOMER. DLI CENSE

Query 7: Does our president work in the headquarters?

SELECT *
FROM EMPLOYEE, ADDRESS
WHERE I S_PRES=' P' AND LOCATI ON=ADDRESSI D AND ADDRESS. I S_HQUARTERS=' H'

Query 8: Find rental_id of all shortest (completed) rentals.

SELECT RENTALI D
FROM RENTAL
WHERE TO_DATE I S NOT NULL AND ( DAYS( TO_DATE) - DAYS( FROM_DATE) ) I N
( SELECT MI N( DAYS( TO_DATE) - DAYS( FROM_DATE) )
FROM RENTAL
WHERE TO_DATE I S NOT NULL)

Query 9: Find the value of the cheapest (completed) rental. We will utilize query 3 as the
inner query.

SELECT MI N( CHARGE)
FROM ( SELECT SUM( CHARGE) , RENTALI D
FROM ( SELECT RENTALI D, AMOUNT*COUNT
FROM RENTALRATE, PRATE
WHERE RENTALRATE. DURATI ON=PRATE. DURATI ON
AND RENTALRATE. CLASS=PRATE. CLASS) AS T( RENTALI D, CHARGE)
Master Thesis Weiguang Zhang McMaster University- Computing and Software
50

GROUP BY RENTALI D) AS T1( CHARGE, RENTALI D)



Query 10: Give makes of the cars that have never been rented.

SELECT DI STI NCT MAKE FROM CAR
EXCEPT
SELECT DI STI NCT MAKE FROM CAR, RENTAL WHERE CAR. CARI D=RENTAL. CARI D








Master Thesis Weiguang Zhang McMaster University- Computing and Software
51

Chapter 7: Course Registration


7.1 Course Registration Informal Description

In our college, students need to register for courses before new semester start. All of
programs in our college take four years to finish.
Each course has a unique designation, title, description, year (in which year of
study the course is to be taken, for instance 2
nd
year course), and classroom. A course can
have no or many tutorial sections, and no or many lab sections. Each course is taught by
exactly one instructor. Each instructor has a unique id, name, departmental affiliation,
office room, phone extension, and a unique email address. Each student has a unique id,
name, and the year of his/her study. A student cannot be an instructor. A course can have
zero or many tutorial sections unique to the course (i.e. tutorial sections are not shared by
different courses). Each tutorial section has exactly one TA assigned. A TA can tutor
more than one tutorial section for the same course, and any number of tutorials for
different courses. A TA cannot be an instructor, however a student can work as a TA (in
that case his/her student id is used as TA id). A course can have zero or many lab sections
unique to the course (i.e. lab sections are not shared by different courses). Each lab
section has exactly one LA assigned. An LA can oversee more than one lab section for
the same course, and any number of labs for different courses. An LA cannot be an
instructor, however a student can work as a LA (in which case his/her student id is used
as the LA id). In fact, a student can work as a TA and an LA simultaneously. Thus, a TA
may or may not be a student, an LA may or may not be a student. A person can work as
both, a TA and a LA. TA has the same attributes as instructor, the same goes for LA.
Each course has zero to many courses designated as its prerequisites and zero to
many courses designated as its anti-requisites. Prerequisite courses are of the same or
lower year, anti-requisite courses are of the same year. In the system we keep information
of what courses a student has taken and what courses the student is registering. All
courses are either Pass or Fail. A student can register a course only if he/she has passed
all the prerequisites and has not passed any or is not registered in any of the anti-
requisites. A student can only register a course of the appropriate year, i.e. a student in
year X of study can only register and take course of year X.

Master Thesis Weiguang Zhang McMaster University- Computing and Software


52

7.2 Course Registration Logical Model



Figure 10:The Course Registration Logical Model
Master Thesis Weiguang Zhang McMaster University- Computing and Software
53

7.3 Course Registration Physical DB2 Model



Figure 11: The Course Registration Physical Model
Master Thesis Weiguang Zhang McMaster University- Computing and Software
54

7.4 Course Registration DB2 Schema

CREATE TABLE COURSE (


DESI G CHAR( 5) NOT NULL,
TI TLE CHAR( 30) NOT NULL,
DESCR CHAR( 150) NOT NULL,
CLASSROOM CHAR( 5) NOT NULL,
PRI MARY KEY( DESI G)
)
CREATE TABLE Y1COURSE (
DESI G CHAR( 5) NOT NULL,
PRI MARY KEY( DESI G)
)
CREATE TABLE Y2COURSE (
DESI G CHAR( 5) NOT NULL,
PRI MARY KEY( DESI G)
)
CREATE TABLE Y3COURSE (
DESI G CHAR( 5) NOT NULL,
PRI MARY KEY( DESI G)
)
CREATE TABLE Y4COURSE (
DESI G CHAR( 5) NOT NULL,
PRI MARY KEY( DESI G)
)
CREATE TABLE PREREQ11 (
DESI G1 CHAR( 5) NOT NULL,
DESI G2 CHAR( 5) NOT NULL,
PRI MARY KEY( DESI G1, DESI G2)
)
CREATE TABLE PREREQ12 (
DESI G1 CHAR( 5) NOT NULL,
DESI G2 CHAR( 5) NOT NULL,
PRI MARY KEY( DESI G1, DESI G2) ,
FOREI GN KEY ( DESI G1) REFERENCES Y1COURSE ( DESI G) ,
FOREI GN KEY ( DESI G2) REFERENCES Y2COURSE ( DESI G) ,
CONSTRAI NT PREREQ12_C3 CHECK ( DESI G1<>DESI G2)
)
CREATE TABLE PREREQ13 (
DESI G1 CHAR( 5) NOT NULL,
DESI G2 CHAR( 5) NOT NULL,
PRI MARY KEY( DESI G1, DESI G2) ,
FOREI GN KEY ( DESI G1) REFERENCES Y1COURSE ( DESI G) ,
FOREI GN KEY ( DESI G2) REFERENCES Y3COURSE ( DESI G) ,
CONSTRAI NT PREREQ13_C3 CHECK ( DESI G1<>DESI G2)
)
CREATE TABLE PREREQ14 (
DESI G1 CHAR( 5) NOT NULL,
DESI G2 CHAR( 5) NOT NULL,
PRI MARY KEY( DESI G1, DESI G2) ,
FOREI GN KEY ( DESI G1) REFERENCES Y1COURSE ( DESI G) ,
FOREI GN KEY ( DESI G2) REFERENCES Y4COURSE ( DESI G) ,
Master Thesis Weiguang Zhang McMaster University- Computing and Software
55

CONSTRAI NT PREREQ14_C3 CHECK ( DESI G1<>DESI G2)


)
CREATE TABLE PREREQ22 (
DESI G1 CHAR( 5) NOT NULL,
DESI G2 CHAR( 5) NOT NULL,
PRI MARY KEY( DESI G1, DESI G2) ,
FOREI GN KEY ( DESI G1) REFERENCES Y2COURSE ( DESI G) ,
FOREI GN KEY ( DESI G2) REFERENCES Y2COURSE ( DESI G) ,
CONSTRAI NT PREREQ22_C3 CHECK ( DESI G1<>DESI G2)
)
CREATE TABLE PREREQ23 (
DESI G1 CHAR( 5) NOT NULL,
DESI G2 CHAR( 5) NOT NULL,
PRI MARY KEY( DESI G1, DESI G2) ,
FOREI GN KEY ( DESI G1) REFERENCES Y2COURSE ( DESI G) ,
FOREI GN KEY ( DESI G2) REFERENCES Y3COURSE ( DESI G) ,
CONSTRAI NT PREREQ23_C3 CHECK ( DESI G1<>DESI G2)
)
CREATE TABLE PREREQ24 (
DESI G1 CHAR( 5) NOT NULL,
DESI G2 CHAR( 5) NOT NULL,
PRI MARY KEY( DESI G1, DESI G2) ,
FOREI GN KEY ( DESI G1) REFERENCES Y2COURSE ( DESI G) ,
FOREI GN KEY ( DESI G2) REFERENCES Y4COURSE ( DESI G) ,
CONSTRAI NT PREREQ24_C3 CHECK ( DESI G1<>DESI G2)
)
CREATE TABLE PREREQ33 (
DESI G1 CHAR( 5) NOT NULL,
DESI G2 CHAR( 5) NOT NULL,
PRI MARY KEY( DESI G1, DESI G2) ,
FOREI GN KEY ( DESI G1) REFERENCES Y3COURSE ( DESI G) ,
FOREI GN KEY ( DESI G2) REFERENCES Y3COURSE ( DESI G) ,
CONSTRAI NT PREREQ33_C3 CHECK ( DESI G1<>DESI G2)
)
CREATE TABLE PREREQ34 (
DESI G1 CHAR( 5) NOT NULL,
DESI G2 CHAR( 5) NOT NULL,
PRI MARY KEY( DESI G1, DESI G2) ,
FOREI GN KEY ( DESI G1) REFERENCES Y3COURSE ( DESI G) ,
FOREI GN KEY ( DESI G2) REFERENCES Y4COURSE ( DESI G) ,
CONSTRAI NT PREREQ34_C3 CHECK ( DESI G1<>DESI G2)
)
CREATE TABLE PREREQ44 (
DESI G1 CHAR( 5) NOT NULL,
DESI G2 CHAR( 5) NOT NULL,
PRI MARY KEY( DESI G1, DESI G2) ,
FOREI GN KEY ( DESI G1) REFERENCES Y4COURSE ( DESI G) ,
FOREI GN KEY ( DESI G2) REFERENCES Y4COURSE ( DESI G) ,
CONSTRAI NT PREREQ44_C3 CHECK ( DESI G1<>DESI G2)
)
CREATE TABLE ANTI REQ1 (
DESI G1 CHAR( 5) NOT NULL,
DESI G2 CHAR( 5) NOT NULL,
PRI MARY KEY( DESI G1, DESI G2) ,
Master Thesis Weiguang Zhang McMaster University- Computing and Software
56

FOREI GN KEY ( DESI G1) REFERENCES Y1COURSE ( DESI G) ,


FOREI GN KEY ( DESI G2) REFERENCES Y1COURSE ( DESI G) ,
CONSTRAI NT ANTI REQ1_C3 CHECK ( DESI G1<>DESI G2)
)
CREATE TABLE ANTI REQ2 (
DESI G1 CHAR( 5) NOT NULL,
DESI G2 CHAR( 5) NOT NULL,
PRI MARY KEY( DESI G1, DESI G2) ,
FOREI GN KEY ( DESI G1) REFERENCES Y2COURSE ( DESI G) ,
FOREI GN KEY ( DESI G2) REFERENCES Y2COURSE ( DESI G) ,
CONSTRAI NT ANTI REQ2_C3 CHECK ( DESI G1<>DESI G2)
)
CREATE TABLE ANTI REQ3 (
DESI G1 CHAR( 5) NOT NULL,
DESI G2 CHAR( 5) NOT NULL,
PRI MARY KEY( DESI G1, DESI G2) ,
FOREI GN KEY ( DESI G1) REFERENCES Y3COURSE ( DESI G) ,
FOREI GN KEY ( DESI G2) REFERENCES Y3COURSE ( DESI G) ,
CONSTRAI NT ANTI REQ3_C3 CHECK ( DESI G1<>DESI G2)
)
CREATE TABLE ANTI REQ4 (
DESI G1 CHAR( 5) NOT NULL,
DESI G2 CHAR( 5) NOT NULL,
PRI MARY KEY( DESI G1, DESI G2) ,
FOREI GN KEY ( DESI G1) REFERENCES Y4COURSE ( DESI G) ,
FOREI GN KEY ( DESI G2) REFERENCES Y4COURSE ( DESI G) ,
CONSTRAI NT ANTI REQ4_C3 CHECK ( DESI G1<>DESI G2)
)
CREATE TABLE PERSON (
I D CHAR( 7) NOT NULL,
NAME CHAR( 20) NOT NULL,
PRI MARY KEY( I D)
)
CREATE TABLE STUDENT (
I D CHAR( 7) NOT NULL,
YEAR I NTEGER NOT NULL,
PRI MARY KEY( I D) ,
FOREI GN KEY ( I D) REFERENCES PERSON ( I D)
)
CREATE TABLE I NSTRUCTOR (
I D CHAR( 7) NOT NULL,
DEPT CHAR( 4) NOT NULL,
ROOM CHAR( 5) NOT NULL,
EXTENSI ON CHAR( 5) NOT NULL,
EMAI L CHAR( 20) NOT NULL,
PRI MARY KEY( I D) ,
FOREI GN KEY ( I D) REFERENCES PERSON ( I D) ,
CONSTRAI NT I NSTRUCTOR_C2 UNI QUE ( EMAI L)
)
CREATE TABLE STAFF (
I D CHAR( 7) NOT NULL,
DEPT CHAR( 4) NOT NULL,
ROOM CHAR( 5) NOT NULL,
EXTENSI ON CHAR( 5) NOT NULL,
Master Thesis Weiguang Zhang McMaster University- Computing and Software
57

EMAI L CHAR( 20) NOT NULL,


PRI MARY KEY( I D) ,
FOREI GN KEY ( I D) REFERENCES PERSON ( I D) ,
CONSTRAI NT STAFF_C2 UNI QUE ( EMAI L)
)
CREATE TABLE LAB (
DESI G CHAR( 5) NOT NULL,
SECTI ON I NTEGER NOT NULL,
LABROOM CHAR( 5) NOT NULL,
PRI MARY KEY( DESI G, SECTI ON) ,
FOREI GN KEY ( DESI G) REFERENCES COURSE ( DESI G)
)
CREATE TABLE TUTORI AL (
DESI G CHAR( 5) NOT NULL,
SECTI ON I NTEGER NOT NULL,
CLASSROOM CHAR( 5) NOT NULL,
PRI MARY KEY( DESI G, SECTI ON) ,
FOREI GN KEY ( DESI G) REFERENCES COURSE ( DESI G)
)
CREATE TABLE TA (
I D CHAR( 7) NOT NULL,
PRI MARY KEY( I D) ,
FOREI GN KEY ( I D) REFERENCES STAFF ( I D)
)
CREATE TABLE LA (
I D CHAR( 7) NOT NULL,
PRI MARY KEY( I D) ,
FOREI GN KEY ( I D) REFERENCES STAFF ( I D)
)
CREATE TABLE HASTA (
DESI G CHAR( 5) NOT NULL,
SECTI ON I NTEGER NOT NULL,
I D CHAR( 7) NOT NULL,
PRI MARY KEY( DESI G, SECTI ON) ,
FOREI GN KEY ( DESI G, SECTI ON) REFERENCES TUTORI AL ( DESI G, SECTI ON) ,
FOREI GN KEY ( I D) REFERENCES TA ( I D)
)
CREATE TABLE HASLA (
DESI G CHAR( 5) NOT NULL,
SECTI ON I NTEGER NOT NULL,
I D CHAR( 7) NOT NULL,
PRI MARY KEY( DESI G, SECTI ON) ,
FOREI GN KEY ( DESI G, SECTI ON) REFERENCES LAB ( DESI G, SECTI ON) ,
FOREI GN KEY ( I D) REFERENCES LA ( I D)
)
CREATE TABLE HASI (
DESI G CHAR( 5) NOT NULL,
I D CHAR( 7) NOT NULL,
PRI MARY KEY( DESI G) ,
FOREI GN KEY ( DESI G) REFERENCES COURSE ( DESI G) ,
FOREI GN KEY ( I D) REFERENCES I NSTRUCTOR ( I D)
)
CREATE TABLE L1 (
I D CHAR( 7) NOT NULL,
Master Thesis Weiguang Zhang McMaster University- Computing and Software
58

DESI G CHAR( 5) NOT NULL,


STATUS CHAR( 1) NOT NULL CHECK ( STATUS I N ( ' P' , ' F' , ' R' ) ) ,
PRI MARY KEY( I D, DESI G) ,
FOREI GN KEY ( I D) REFERENCES STUDENT ( I D) ,
FOREI GN KEY ( DESI G) REFERENCES Y1COURSE ( DESI G)
)
CREATE TABLE L2 (
I D CHAR( 7) NOT NULL,
DESI G CHAR( 5) NOT NULL,
STATUS CHAR( 1) NOT NULL CHECK ( STATUS I N ( ' P' , ' F' , ' R' ) ) ,
PRI MARY KEY( I D, DESI G) ,
FOREI GN KEY ( I D) REFERENCES STUDENT ( I D) ,
FOREI GN KEY ( DESI G) REFERENCES Y2COURSE ( DESI G)
)
CREATE TABLE L3 (
I D CHAR( 7) NOT NULL,
DESI G CHAR( 5) NOT NULL,
STATUS CHAR( 1) NOT NULL CHECK ( STATUS I N ( ' P' , ' F' , ' R' ) ) ,
PRI MARY KEY( I D, DESI G) ,
FOREI GN KEY ( I D) REFERENCES STUDENT ( I D) ,
FOREI GN KEY ( DESI G) REFERENCES Y3COURSE ( DESI G)
)
CREATE TABLE L4 (
I D CHAR( 7) NOT NULL,
DESI G CHAR( 5) NOT NULL,
STATUS CHAR( 1) NOT NULL CHECK ( STATUS I N ( ' P' , ' F' , ' R' ) ) ,
PRI MARY KEY( I D, DESI G) ,
FOREI GN KEY ( I D) REFERENCES STUDENT ( I D) ,
FOREI GN KEY ( DESI G) REFERENCES Y4COURSE ( DESI G)
)
7.5 Course Registration Interactive Queries

Query 1: List all triples (student name, course designation, status) of courses taken or
registered by students with id '0000041' and '0000042'. status is the status of
each course (i.e. 'P' for passed, 'F' for failed, 'R' for registered).

SELECT NAME, DESI G, STATUS
FROM STUDENT, PERSON, L1
WHERE STUDENT. I D=L1. I D
AND ( STUDENT. I D=' 0000041' OR STUDENT. I D=' 0000042' )
AND STUDENT. I D=PERSON. I D
UNI ON
SELECT NAME, DESI G, STATUS
FROM STUDENT, PERSON, L2
WHERE STUDENT. I D=L2. I D
AND ( STUDENT. I D=' 0000041' OR STUDENT. I D=' 0000042' )
AND STUDENT. I D=PERSON. I D

Query 2: List names of all students in year 1.

SELECT PERSON. NAME
Master Thesis Weiguang Zhang McMaster University- Computing and Software
59

FROM PERSON, STUDENT


WHERE PERSON. I D=STUDENT. I D AND STUDENT. YEAR=1

Query 3: List names of all instructors teaching year 1 courses.

SELECT PERSON. NAME
FROM PERSON, I NSTRUCTOR, HASI , Y1COURSE
WHERE PERSON. I D=I NSTRUCTOR. I D
AND HASI . I D=I NSTRUCTOR. I D AND HASI . DESI G=Y1COURSE. DESI G

Query 4: List designation of all courses that have tutorials. No designation can repeat.

SELECT DI STI NCT DESI G FROM TUTORI AL

Query 5: List designation of all courses that have labs with more than 1 section. No
designation can repeat.

SELECT DI STI NCT DESI G FROM LAB WHERE SECTI ON=2

Query 6: List names of instructors that teach at least one course with multiple sections
labs. No name can repeat.

SELECT DI STI NCT NAME
FROM PERSON, I NSTRUCTOR, HASI
WHERE ( I NSTRUCTOR. I D=PERSON. I D) AND ( HASI . I D=PERSON. I D)
AND HASI . DESI G I N ( SELECT COURSE. DESI G FROM COURSE, LAB
WHERE COURSE. DESI G=LAB. DESI G AND SECTI ON=2)

Query 7: List names of instructors that teach only courses with single-sections labs or no
labs. No name can repeat.

SELECT DI STI NCT NAME
FROM PERSON, I NSTRUCTOR
WHERE ( PERSON. I D=I NSTRUCTOR. I D)
AND NAME NOT I N ( SELECT DI STI NCT NAME FROM PERSON, I NSTRUCTOR, HASI
WHERE ( I NSTRUCTOR. I D=PERSON. I D) AND ( HASI . I D=PERSON. I D)
AND HASI . DESI G I N ( SELECT COURSE. DESI G FROM COURSE, LAB
WHERE COURSE. DESI G=LAB. DESI G
AND SECTI ON=2) )

Master Thesis Weiguang Zhang McMaster University- Computing and Software
60

Chapter 8: Emergency Room


8.1 Emergency Room Informal Description

In our Emergency Room (ER), we have three distinct types of workers: receptionists,
nurses, and doctors. Any of the workers can in fact be a patient. Each person in the
proposed system, be it a patient or a worker has a last, a first, possibly a middle name, and
one or more addresses. An address consists of a country, province, city, street and street
number. Each person can have none or more email addresses, none or more telephone
numbers.
The workers work in ER in shifts. A shift consists of start and end time. The shifts
do not overlap, but they are consecutive, i.e. there is a shift on at any given time and day.
We are assuming that the model we are creating (and eventually the database we will
design) covers some extended period of time. Each worker will thus be assigned to many
shifts in that period. Exactly two receptionists are assigned to each shift, a group of two or
more nurses is assigned to each shift, a group of two or more doctors is assigned to each
shift, one of the doctors assigned to a shift is the shifts triage doctor.
When a patient comes to ER, it happens during a particular shift. The patient is
admitted by a particular receptionist, is seen by the triage doctor of the shift. The patient
may be send home, prescribed some medication by the triage doctor and send home, or is
staying in ER in which case the patient is assigned a bed and case doctors (one of the
doctors on each shift best qualified for the particular problem of the patient). Each bed is
supervised by a single nurse during a shift, but a nurse may supervise many beds, or none
at all. The case doctor(s) may prescribe a medication that is administered to the patient by
a single nurse in each shift for the duration of the patient taking the medicine. Each
medication has a name, and for each patient there may be a different dosage and different
number of times a day to take it.


Master Thesis Weiguang Zhang McMaster University- Computing and Software
61

8.2 Emergency Room Logical Model

Figure 12: The Emergency Room Logical Model


Master Thesis Weiguang Zhang McMaster University- Computing and Software
62

8.3 Emergency Room Physical DB2 Model

Figure 13: The Emergency Room Physical Model


Master Thesis Weiguang Zhang McMaster University- Computing and Software
63

8.4 Emergency Room DB2 Schema



CREATE TABLE PERSON(
I D I NTEGER NOT NULL,
LASTNAME CHAR( 10) NOT NULL,
FI RSTNAME CHAR( 10) NOT NULL,
MI DDLENAME CHAR( 10) ,
PRI MARY KEY ( I D)
)
CREATE TABLE PATI ENT(
PI D I NTEGER NOT NULL,
PRI MARY KEY ( PI D) ,
FOREI GN KEY ( PI D) REFERENCES PERSON ( I D)
)
CREATE TABLE WORKER(
WI D I NTEGER NOT NULL,
PRI MARY KEY ( WI D) ,
FOREI GN KEY ( WI D) REFERENCES PERSON ( I D)
)
CREATE TABLE RECEPTI ONI ST(
RI D I NTEGER NOT NULL,
PRI MARY KEY ( RI D) ,
FOREI GN KEY ( RI D) REFERENCES WORKER ( WI D)
)
CREATE TABLE NURSE(
NI D I NTEGER NOT NULL,
PRI MARY KEY ( NI D) ,
FOREI GN KEY ( NI D) REFERENCES WORKER ( WI D)
)
CREATE TABLE DOCTOR(
DI D I NTEGER NOT NULL,
PRI MARY KEY ( DI D) ,
FOREI GN KEY ( DI D) REFERENCES WORKER ( WI D)
)
CREATE TABLE EMAI L(
EADDRESS CHAR( 20) NOT NULL,
PRI MARY KEY ( EADDRESS)
)
CREATE TABLE PHONENO(
AREACODE CHAR( 3) NOT NULL,
NUMBER CHAR( 7) NOT NULL,
PRI MARY KEY ( AREACODE, NUMBER)
)
CREATE TABLE ADDRESS(
PROVI NCE CHAR( 2) NOT NULL,
CI TY CHAR( 10) NOT NULL,
STREET CHAR( 10) NOT NULL,
STREETNO CHAR( 6) NOT NULL,
PRI MARY KEY ( PROVI NCE, CI TY, STREET, STREETNO)
)
CREATE TABLE MEDI CATI ON(
NAME CHAR( 30) NOT NULL,
PRI MARY KEY ( NAME)
Master Thesis Weiguang Zhang McMaster University- Computing and Software
64

)
CREATE TABLE BED(
NUMBER CHAR( 3) NOT NULL,
PRI MARY KEY ( NUMBER)
)
CREATE TABLE SHI FT(
SHI FTI D I NTEGER NOT NULL,
FROM TI MESTAMP NOT NULL,
TO TI MESTAMP NOT NULL,
PRI MARY KEY ( SHI FTI D) ,
UNI QUE ( FROM, TO) ,
CHECK ( FROM < TO)
)
CREATE TABLE HASE(
I D I NTEGER NOT NULL,
EADDRESS CHAR( 20) NOT NULL,
PRI MARY KEY ( I D, EADDRESS) ,
FOREI GN KEY ( I D) REFERENCES PERSON ( I D) ,
FOREI GN KEY ( EADDRESS) REFERENCES EMAI L ( EADDRESS)
)
CREATE TABLE HASP(
I D I NTEGER NOT NULL,
AREACODE CHAR( 3) NOT NULL,
NUMBER CHAR( 7) NOT NULL,
PRI MARY KEY ( I D, AREACODE, NUMBER) ,
FOREI GN KEY ( I D) REFERENCES PERSON ( I D) ,
FOREI GN KEY ( AREACODE, NUMBER) REFERENCES PHONENO( AREACODE, NUMBER)
)
CREATE TABLE HASA(
I D I NTEGER NOT NULL,
PROVI NCE CHAR( 2) NOT NULL,
CI TY CHAR( 10) NOT NULL,
STREET CHAR( 10) NOT NULL,
STREETNO CHAR( 6) NOT NULL,
PRI MARY KEY ( I D, PROVI NCE, CI TY, STREET, STREETNO) ,
FOREI GN KEY ( I D) REFERENCES PERSON ( I D) ,
FOREI GN KEY ( PROVI NCE, CI TY, STREET, STREETNO) REFERENCES ADDRESS
( PROVI NCE, CI TY, STREET, STREETNO)
)
CREATE TABLE RONS(
RI D I NTEGER NOT NULL,
SHI FTI D I NTEGER NOT NULL,
PRI MARY KEY ( RI D, SHI FTI D) ,
FOREI GN KEY ( RI D) REFERENCES RECEPTI ONI ST ( RI D) ,
FOREI GN KEY ( SHI FTI D) REFERENCES SHI FT ( SHI FTI D)
)
CREATE TABLE NONS(
NI D I NTEGER NOT NULL,
SHI FTI D I NTEGER NOT NULL,
PRI MARY KEY ( NI D, SHI FTI D) ,
FOREI GN KEY ( NI D) REFERENCES NURSE ( NI D) ,
FOREI GN KEY ( SHI FTI D) REFERENCES SHI FT ( SHI FTI D)
)

Master Thesis Weiguang Zhang McMaster University- Computing and Software
65

CREATE TABLE DONS(


DI D I NTEGER NOT NULL,
SHI FTI D I NTEGER NOT NULL,
PRI MARY KEY ( DI D, SHI FTI D) ,
FOREI GN KEY ( DI D) REFERENCES DOCTOR ( DI D) ,
FOREI GN KEY ( SHI FTI D) REFERENCES SHI FT ( SHI FTI D)
)
CREATE TABLE MED(
PX I NTEGER NOT NULL,
PI D I NTEGER NOT NULL,
DI D I NTEGER NOT NULL,
MED CHAR( 30) NOT NULL,
DOSAGE I NTEGER NOT NULL,
MEDFROM DATE NOT NULL,
MEDTO DATE NOT NULL,
HOWOFTEN I NTEGER NOT NULL,
PRI MARY KEY ( PX) ,
UNI QUE ( PI D, MED) ,
FOREI GN KEY ( PI D) REFERENCES PATI ENT ( PI D) ,
FOREI GN KEY ( DI D) REFERENCES DOCTOR ( DI D) ,
FOREI GN KEY ( MED) REFERENCES MEDI CATI ON ( NAME)
)
CREATE TABLE MEDA(
PX I NTEGER NOT NULL,
NI D I NTEGER NOT NULL,
SHI FTI D I NTEGER NOT NULL,
PRI MARY KEY ( PX, SHI FTI D, NI D) ,
FOREI GN KEY ( PX) REFERENCES MED ( PX) ,
FOREI GN KEY ( NI D, SHI FTI D) REFERENCES NONS ( NI D, SHI FTI D)
)
CREATE TABLE BEDA(
PI D I NTEGER NOT NULL,
BEDNO CHAR( 3) NOT NULL,
FROM TI MESTAMP NOT NULL,
TO TI MESTAMP NOT NULL,
PRI MARY KEY ( PI D, BEDNO) ,
FOREI GN KEY ( PI D) REFERENCES PATI ENT ( PI D) ,
FOREI GN KEY ( BEDNO) REFERENCES BED ( NUMBER)
)
CREATE TABLE CASEDOC(
PI D I NTEGER NOT NULL,
DI D I NTEGER NOT NULL,
SHI FTI D I NTEGER NOT NULL,
PRI MARY KEY ( PI D, SHI FTI D, DI D) ,
FOREI GN KEY ( PI D) REFERENCES PATI ENT ( PI D) ,
FOREI GN KEY ( DI D, SHI FTI D) REFERENCES DONS ( DI D, SHI FTI D)
)
CREATE TABLE SUPBY(
BEDNO CHAR( 3) NOT NULL,
NI D I NTEGER NOT NULL,
SHI FTI D I NTEGER NOT NULL,
PRI MARY KEY ( BEDNO, SHI FTI D, NI D) ,
FOREI GN KEY ( BEDNO) REFERENCES BED ( NUMBER) ,
FOREI GN KEY ( NI D, SHI FTI D) REFERENCES NONS ( NI D, SHI FTI D)
Master Thesis Weiguang Zhang McMaster University- Computing and Software
66

)
CREATE TABLE ADM(
PI D I NTEGER NOT NULL,
RI D I NTEGER NOT NULL,
SHI FTI D I NTEGER NOT NULL,
ADMI SSI ON TI MESTAMP,
PRI MARY KEY ( PI D) ,
FOREI GN KEY ( PI D) REFERENCES PATI ENT ( PI D) ,
FOREI GN KEY ( RI D, SHI FTI D) REFERENCES RONS ( RI D, SHI FTI D)
)
CREATE TABLE TRI AGEBY(
PI D I NTEGER NOT NULL,
DI D I NTEGER NOT NULL,
PRI MARY KEY ( PI D) ,
FOREI GN KEY ( PI D) REFERENCES PATI ENT ( PI D) ,
FOREI GN KEY ( DI D) REFERENCES DOCTOR ( DI D)
)
8.5 Emergency Room Interactive Queries

Query 1: The query returns an empty set if con1 is satisfied.

( ( SELECT RI D FROM RECEPTI ONI ST) I NTERSECT ( SELECT NI D FROM NURSE) )
UNI ON
( ( SELECT RI D FROM RECEPTI ONI ST) I NTERSECT ( SELECT DI D FROM DOCTOR) )
UNI ON
( ( SELECT NI D FROM NURSE) I NTERSECT ( SELECT DI D FROM DOCTOR)

Query 2: The query returns an empty set if con2 is satisfied.

SELECT EADDRESS FROM EMAI L
EXCEPT
SELECT EADDRESS FROM HASE

Query 3: The query returns an empty set if con3 is satisfied.

SELECT AREACODE, NUMBER FROM PHONENO
EXCEPT
SELECT AREACODE, NUMBER FROM HASP

Query 4: The query returns an empty set if con4 is satisfied.

SELECT PROVI NCE, CI TY, STREET, STRETNO FROM ADDRESS
EXCEPT
SELECT PROVI NCE, CI TY, STREET, STREETNO FROM HASA

Query 5: The query returns an empty set if con5 is satisfied.

SELECT I D FROM PERSON
EXCEPT
Master Thesis Weiguang Zhang McMaster University- Computing and Software
67

SELECT I D FROM HASA



Query 6: The query returns an empty set if con6 is satisfied.

( ( SELECT SHI FTI D FROM RONS)
EXCEPT
( ( SELECT T. SHI FTI D FROM RONS AS T, RONS AS R
WHERE T. RI D <> R. RI D AND T. SHI FTI D = R. SHI FTI D)
EXCEPT
( SELECT T. SHI FTI D FROM RONS AS T, RONS AS R, RONS AS Q
WHERE T. SHI FTI D = R. SHI FTI D AND T. SHI FTI D = Q. SHI FTI D
AND T. RI D <> R. RI D AND T. RI D<>Q. RI D AND R. RI D<>Q. RI D) )
)

Query 7: The query returns an empty set if con7 is satisfied.

( SELECT SHI FTI D FROM SHI FT) EXCEPT ( SELECT SHI FTI D FROM RONS)
UNI ON
( SELECT RI D FROM RECEPTI ONI ST) EXCEPT ( SELECT RI D FROM RONS)

Query 8: The query returns an empty set if con8 is satisfied.

SELECT SHI FTI D FROM SHI FT
EXCEPT
SELECT T. SHI FTI D FROM NONS AS T, NONS AS R
WHERE T. NI D <> R. NI D AND T. SHI FTI D = R. SHI FTI D

Query 9: The query returns an empty set if con9 is satisfied.

( SELECT SHI FTI D FROM SHI FT) EXCEPT ( SELECT SHI FTI D FROM NONS)
UNI ON
( SELECT NI D FROM NURSE) EXCEPT ( SELECT NI D FROM NONS)

Query 10: The query returns an empty set if con10 is satisfied.

( ( SELECT SHI FTI D FROM SHI FT)
EXCEPT
( SELECT T. SHI FTI D
FROM DONS AS T, DONS AS R
WHERE T. DI D <> R. DI D AND T. SHI FTI D = R. SHI FTI D) )

Query 11: The query returns an empty set if con11 is satisfied.

( ( SELECT SHI FTI D FROM SHI FT) EXCEPT ( SELECT SHI FTI D FROM DONS) )
UNI ON
( ( SELECT DI D FROM DOCTOR) EXCEPT ( SELECT DI D FROM DONS) )

Query 12: The query returns an empty set if con12 is satisfied.

( ( SELECT PI D FROM CASEDOC) EXCEPT ( SELECT PI D FROM BEDA) )

Master Thesis Weiguang Zhang McMaster University- Computing and Software
68

Query 13: The query returns an empty set if con13 is satisfied.



( ( SELECT PI D FROM BEDA) EXCEPT ( SELECT PI D FROM CASEDOC) )

Query 14: The query returns an empty set if con14 is satisfied.

( ( SELECT BED. NUMBER, SHI FTI D FROM BED, SHI FT)
EXCEPT
( SELECT BED. NUMBER, SHI FTI D FROM BED, SUPBY
WHERE BED. NUMBER=SUPBY. BEDNO) )

Query 15: The query returns an empty set if con15 is satisfied.

( SELECT FROM, TO, ADMI SSI ON FROM SHI FT, ADM
WHERE SHI FT. SHI FTI D=ADM. SHI FTI D
AND ( ADMI SSI ON < FROM OR TO < ADMI SSI ON) )

Query 16: The query returns an empty set if con16 is satisfied.

( ( SELECT PI D FROM TRI AGEBY)
EXCEPT
( SELECT TRI AGEBY. PI D FROM DONS, ADM, TRI AGEBY
WHERE TRI AGEBY. PI D=ADM. PI D AND ADM. SHI FTI D=DONS. SHI FTI D
AND DONS. DI D=TRI AGEBY. DI D) )


Master Thesis Weiguang Zhang McMaster University- Computing and Software
69

Chapter 9: Property Rental


9.1 Property Rental Informal Description

Our company arranges rentals of properties owned by both private and business owners.
We assign every property owner a unique owner number for identification, we record its
address (consisting of a street, street number, town or city, and province), the owners
name (consisting of first, middle, and last name for a person or name of a business), and
the owners email addresses and the owner phone numbers. For a business owner, we
record the type (description) of its business. Each property is identified by a unique
property number, we record its address and its type. Each property may be placed in
several advertisements. Each such advertisement may be displayed in many newspapers
on several dates. The newspapers are identified by unique names.
The term renter refers to a private person or a business who signed a rental
agreement for a property. Each such rental agreement is identified in our database by a
unique rental number. We record the date of the singing of the rental agreement, the
starting and ending date of the rental agreement. A renter can rent many properties. A
renter, prior to accepting the rental agreement may view the property repeatedly and we
record the date of viewing. For each renter, we record its address, its name, its email
address and phone numbers. Each renter has a unique renter number in our database.
Our agency is organized into branches and every staff member is allocated to
exactly one branch. Each branch has one manager who is a member of the staff. In our
database, we identify the staff by a unique staff number. For each staff member we record
address, name, email address, phone numbers, sex, position, and salary. Each property is
in care of one of our branches. Each renter refers to the branch that is in care of the
property it rents. Each property is overseen by a unique staff member. Each branch has an
address, phone number, and a unique branch number.



Master Thesis Weiguang Zhang McMaster University- Computing and Software
70

9.2 Property Rental Logical Model

Figure 14: The Property Rental Logical Model


Master Thesis Weiguang Zhang McMaster University- Computing and Software
71

9.3 Property Rental Physical DB2 Model

Figure 15: The Property Rental Physical Model


Master Thesis Weiguang Zhang McMaster University- Computing and Software
72

9.4 Property Rental DB2 Schema


CREATE TABLE BRANCH (
BRANCH_NO CHAR( 4) NOT NULL,
STREET_NO CHAR( 4) NOT NULL,
STREET CHAR( 10) NOT NULL,
CI TY CHAR( 10) NOT NULL,
PROVI NCE CHAR( 2) NOT NULL,
POSTAL_CODE CHAR( 6) NOT NULL,
MANAGER CHAR( 4) NOT NULL,
PRI MARY KEY ( BRANCH_NO) ,
CHECK ( PROVI NCE I N ( ' AL' , ' BC' , ' MA' , ' NB' , ' NF' , ' NT' , ' NS' , ' NU' ,
' ON' , ' PE' , ' QB' , ' SA' , ' YU' ) ) ,
CHECK ( ( ' A' <=SUBSTR( POSTAL_CODE, 1, 1) AND
SUBSTR( POSTAL_CODE, 1, 1) <=' Z' ) AND
( ' 0' <=SUBSTR( POSTAL_CODE, 2, 1) AND SUBSTR( POSTAL_CODE, 2, 1) <=' 9' )
AND
( ' A' <=SUBSTR( POSTAL_CODE, 3, 1) AND SUBSTR( POSTAL_CODE, 3, 1) <=' Z' )
AND
( ' 0' <=SUBSTR( POSTAL_CODE, 4, 1) AND SUBSTR( POSTAL_CODE, 4, 1) <=' 9' )
AND
( ' A' <=SUBSTR( POSTAL_CODE, 5, 1) AND SUBSTR( POSTAL_CODE, 5, 1) <=' Z' )
AND
( ' 0' <=SUBSTR( POSTAL_CODE, 6, 1) AND
SUBSTR( POSTAL_CODE, 6, 1) <=' 9' ) ) ,
UNI QUE( MANAGER)
)
CREATE TABLE STAFF (
STAFF_NO CHAR( 4) NOT NULL,
LAST_NAME CHAR( 20) NOT NULL,
FI RST_NAME CHAR( 10) NOT NULL,
MI DDLE_NAME CHAR( 10) ,
STREET_NO CHAR( 4) NOT NULL,
STREET CHAR( 10) NOT NULL,
CI TY CHAR( 10) NOT NULL,
PROVI NCE CHAR( 2) NOT NULL,
POSTAL_CODE CHAR( 6) NOT NULL,
SEX CHAR( 1) NOT NULL,
SALARY DECI MAL( 9, 2) NOT NULL,
ALLOCATED_TO CHAR( 4) NOT NULL,
PRI MARY KEY ( STAFF_NO) ,
FOREI GN KEY ( ALLOCATED_TO) REFERENCES BRANCH,
CHECK ( PROVI NCE I N ( ' AL' , ' BC' , ' MA' , ' NB' , ' NF' , ' NT' , ' NS' ,
' NU' , ' ON' , ' PE' , ' QB' , ' SA' , ' YU' ) ) ,
CHECK ( SEX I N ( ' F' , ' M' , ' N' ) ) ,
CHECK ( SALARY > 0) ,
CHECK ( ( ' A' <=SUBSTR( POSTAL_CODE, 1, 1)
AND SUBSTR( POSTAL_CODE, 1, 1) <=' Z' )
AND ( ' 0' <=SUBSTR( POSTAL_CODE, 2, 1)
AND SUBSTR( POSTAL_CODE, 2, 1) <=' 9' )
AND ( ' A' <=SUBSTR( POSTAL_CODE, 3, 1)
AND SUBSTR( POSTAL_CODE, 3, 1) <=' Z' )
Master Thesis Weiguang Zhang McMaster University- Computing and Software
73

AND ( ' 0' <=SUBSTR( POSTAL_CODE, 4, 1)


AND SUBSTR( POSTAL_CODE, 4, 1) <=' 9' )
AND ( ' A' <=SUBSTR( POSTAL_CODE, 5, 1)
AND SUBSTR( POSTAL_CODE, 5, 1) <=' Z' )
AND ( ' 0' <=SUBSTR( POSTAL_CODE, 6, 1)
AND SUBSTR( POSTAL_CODE, 6, 1) <=' 9' ) )
)
CREATE TABLE OWNER (
OWNER_NO CHAR( 4) NOT NULL,
NAME CHAR( 20) NOT NULL,
FI RST_NAME CHAR( 10) ,
MI DDLE_NAME CHAR( 10) ,
STREET_NO CHAR( 4) NOT NULL,
STREET CHAR( 10) NOT NULL,
CI TY CHAR( 10) NOT NULL,
PROVI NCE CHAR( 2) NOT NULL,
POSTAL_CODE CHAR( 6) NOT NULL,
TYPE_OF_BUSI NESS CHAR( 2) ,
PRI MARY KEY ( OWNER_NO) ,
CHECK ( PROVI NCE I N ( ' AL' , ' BC' , ' MA' , ' NB' , ' NF' , ' NT' , ' NS' , ' NU' ,
' ON' , ' PE' , ' QB' , ' SA' , ' YU' ) ) ,
CHECK ( ( ' A' <=SUBSTR( POSTAL_CODE, 1, 1) AND SUBSTR( POSTAL_CODE, 1, 1) <=' Z' )
AND ( ' 0' <=SUBSTR( POSTAL_CODE, 2, 1) AND SUBSTR( POSTAL_CODE, 2, 1) <=' 9' )
AND ( ' A' <=SUBSTR( POSTAL_CODE, 3, 1) AND SUBSTR( POSTAL_CODE, 3, 1) <=' Z' )
AND ( ' 0' <=SUBSTR( POSTAL_CODE, 4, 1) AND SUBSTR( POSTAL_CODE, 4, 1) <=' 9' )
AND ( ' A' <=SUBSTR( POSTAL_CODE, 5, 1) AND SUBSTR( POSTAL_CODE, 5, 1) <=' Z' )
AND ( ' 0' <=SUBSTR( POSTAL_CODE, 6, 1) AND SUBSTR( POSTAL_CODE, 6, 1) <=' 9' ) ) ,
CHECK( TYPE_OF_BUSI NESS I S NULL OR ( FI RST_NAME I S NULL AND MI DDLE_NAME
I S NULL) )
)
CREATE TABLE RENTER (
RENTER_NO CHAR( 4) NOT NULL,
NAME CHAR( 20) NOT NULL,
FI RST_NAME CHAR( 10) ,
MI DDLE_NAME CHAR( 10) ,
STREET_NO CHAR( 4) NOT NULL,
STREET CHAR( 10) NOT NULL,
CI TY CHAR( 10) NOT NULL,
PROVI NCE CHAR( 2) NOT NULL,
POSTAL_CODE CHAR( 6) NOT NULL,
TYPE_OF_BUSI NESS CHAR( 2) ,
PRI MARY KEY ( RENTER_NO) ,
CHECK ( PROVI NCE I N ( ' AL' , ' BC' , ' MA' , ' NB' , ' NF' , ' NT' , ' NS' , ' NU' , ' ON' ,
' PE' , ' QB' , ' SA' , ' YU' ) ) ,
CHECK ( ( ' A' <=SUBSTR( POSTAL_CODE, 1, 1) AND SUBSTR( POSTAL_CODE, 1, 1) <=' Z' )
AND ( ' 0' <=SUBSTR( POSTAL_CODE, 2, 1) AND SUBSTR( POSTAL_CODE, 2, 1) <=' 9' )
AND ( ' A' <=SUBSTR( POSTAL_CODE, 3, 1) AND SUBSTR( POSTAL_CODE, 3, 1) <=' Z' )
AND ( ' 0' <=SUBSTR( POSTAL_CODE, 4, 1) AND SUBSTR( POSTAL_CODE, 4, 1) <=' 9' )
AND ( ' A' <=SUBSTR( POSTAL_CODE, 5, 1) AND SUBSTR( POSTAL_CODE, 5, 1) <=' Z' )
AND ( ' 0' <=SUBSTR( POSTAL_CODE, 6, 1) AND SUBSTR( POSTAL_CODE, 6, 1) <=' 9' ) ) ,
CHECK( TYPE_OF_BUSI NESS I S NULL OR ( FI RST_NAME I S NULL AND MI DDLE_NAME
I S NULL) )
Master Thesis Weiguang Zhang McMaster University- Computing and Software
74

)
CREATE TABLE PROPERTY (
PROPERTY_NO CHAR( 4) NOT NULL,
STREET_NO CHAR( 4) NOT NULL,
STREET CHAR( 10) NOT NULL,
CI TY CHAR( 10) NOT NULL,
PROVI NCE CHAR( 2) NOT NULL,
POSTAL_CODE CHAR( 6) NOT NULL,
OVERSEEN_BY CHAR( 4) NOT NULL,
OWNED_BY CHAR( 4) NOT NULL,
TYPE CHAR( 2) NOT NULL,
PRI MARY KEY ( PROPERTY_NO) ,
FOREI GN KEY ( OVERSEEN_BY) REFERENCES STAFF,
FOREI GN KEY ( OWNED_BY) REFERENCES OWNER,
CHECK ( PROVI NCE I N ( ' AL' , ' BC' , ' MA' , ' NB' , ' NF' , ' NT' , ' NS' , ' NU' , ' ON' ,
' PE' , ' QB' , ' SA' , ' YU' ) ) ,
CHECK ( ( ' A' <=SUBSTR( POSTAL_CODE, 1, 1) AND SUBSTR( POSTAL_CODE, 1, 1) <=' Z' )
AND ( ' 0' <=SUBSTR( POSTAL_CODE, 2, 1) AND SUBSTR( POSTAL_CODE, 2, 1) <=' 9' )
AND ( ' A' <=SUBSTR( POSTAL_CODE, 3, 1) AND SUBSTR( POSTAL_CODE, 3, 1) <=' Z' )
AND ( ' 0' <=SUBSTR( POSTAL_CODE, 4, 1) AND SUBSTR( POSTAL_CODE, 4, 1) <=' 9' )
AND ( ' A' <=SUBSTR( POSTAL_CODE, 5, 1) AND SUBSTR( POSTAL_CODE, 5, 1) <=' Z' )
AND ( ' 0' <=SUBSTR( POSTAL_CODE, 6, 1) AND SUBSTR( POSTAL_CODE, 6, 1) <=' 9' ) )
)
CREATE TABLE RENTAL_AGREEMENT (
PROPERTY_NO CHAR( 4) NOT NULL,
RENTAL_NO CHAR( 4) NOT NULL,
SI GNI NG_DATE DATE NOT NULL,
STARTI NG_DATE DATE NOT NULL,
ENDI NG_DATE DATE NOT NULL,
RENTER_NO CHAR( 4) NOT NULL,
PRI MARY KEY ( PROPERTY_NO, RENTAL_NO) ,
FOREI GN KEY ( PROPERTY_NO) REFERENCES PROPERTY,
FOREI GN KEY ( RENTER_NO) REFERENCES RENTER,
CHECK ( SI GNI NG_DATE <= STARTI NG_DATE) ,
CHECK ( STARTI NG_DATE <= ENDI NG_DATE)
)
CREATE TABLE RENTER_EMAI L (
EMAI L_ADDR CHAR( 20) NOT NULL,
RENTER_NO CHAR( 4) NOT NULL,
PRI MARY KEY ( EMAI L_ADDR, RENTER_NO) ,
FOREI GN KEY ( RENTER_NO) REFERENCES RENTER
)
CREATE TABLE STAFF_EMAI L (
EMAI L_ADDR CHAR( 20) NOT NULL,
STAFF_NO CHAR( 4) NOT NULL,
PRI MARY KEY ( EMAI L_ADDR, STAFF_NO) ,
FOREI GN KEY ( STAFF_NO) REFERENCES STAFF
)
CREATE TABLE OWNER_EMAI L (
EMAI L_ADDR CHAR( 20) NOT NULL,
OWNER_NO CHAR( 4) NOT NULL,
PRI MARY KEY ( EMAI L_ADDR, OWNER_NO) ,
FOREI GN KEY ( OWNER_NO) REFERENCES OWNER
)
Master Thesis Weiguang Zhang McMaster University- Computing and Software
75

CREATE TABLE BRANCH_EMAI L (


EMAI L_ADDR CHAR( 20) NOT NULL,
BRANCH_NO CHAR( 4) NOT NULL,
PRI MARY KEY ( EMAI L_ADDR, BRANCH_NO) ,
FOREI GN KEY ( BRANCH_NO) REFERENCES BRANCH
)
CREATE TABLE RENTER_PHONE (
AREA_CODE CHAR( 3) NOT NULL,
PHONE_NO CHAR( 7) NOT NULL,
EXTENSI ON VARCHAR( 5) ,
RENTER_NO CHAR( 4) NOT NULL,
PRI MARY KEY ( AREA_CODE, PHONE_NO, RENTER_NO) ,
FOREI GN KEY ( RENTER_NO) REFERENCES RENTER,
CHECK( ( ' 0' <=SUBSTR( AREA_CODE, 1, 1) AND SUBSTR( AREA_CODE, 1, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( AREA_CODE, 2, 1) AND SUBSTR( AREA_CODE, 2, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( AREA_CODE, 3, 1) AND SUBSTR( AREA_CODE, 3, 1) <=' 9' ) ) ,
CHECK( ( ' 0' <=SUBSTR( PHONE_NO, 1, 1) AND SUBSTR( PHONE_NO, 1, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( PHONE_NO, 2, 1) AND SUBSTR( PHONE_NO, 2, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( PHONE_NO, 3, 1) AND SUBSTR( PHONE_NO, 3, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( PHONE_NO, 4, 1) AND SUBSTR( PHONE_NO, 4, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( PHONE_NO, 5, 1) AND SUBSTR( PHONE_NO, 5, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( PHONE_NO, 6, 1) AND SUBSTR( PHONE_NO, 6, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( PHONE_NO, 7, 1) AND SUBSTR( PHONE_NO, 7, 1) <=' 9' ) )
)
CREATE TABLE STAFF_PHONE (
AREA_CODE CHAR( 3) NOT NULL,
PHONE_NO CHAR( 7) NOT NULL,
EXTENSI ON VARCHAR( 5) ,
STAFF_NO CHAR( 4) NOT NULL,
PRI MARY KEY ( AREA_CODE, PHONE_NO, STAFF_NO) ,
FOREI GN KEY ( STAFF_NO) REFERENCES STAFF,
CHECK( ( ' 0' <=SUBSTR( AREA_CODE, 1, 1) AND SUBSTR( AREA_CODE, 1, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( AREA_CODE, 2, 1) AND SUBSTR( AREA_CODE, 2, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( AREA_CODE, 3, 1) AND SUBSTR( AREA_CODE, 3, 1) <=' 9' ) ) ,
CHECK( ( ' 0' <=SUBSTR( PHONE_NO, 1, 1) AND SUBSTR( PHONE_NO, 1, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( PHONE_NO, 2, 1) AND SUBSTR( PHONE_NO, 2, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( PHONE_NO, 3, 1) AND SUBSTR( PHONE_NO, 3, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( PHONE_NO, 4, 1) AND SUBSTR( PHONE_NO, 4, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( PHONE_NO, 5, 1) AND SUBSTR( PHONE_NO, 5, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( PHONE_NO, 6, 1) AND SUBSTR( PHONE_NO, 6, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( PHONE_NO, 7, 1) AND SUBSTR( PHONE_NO, 7, 1) <=' 9' ) )
)
CREATE TABLE OWNER_PHONE (
AREA_CODE CHAR( 3) NOT NULL,
PHONE_NO CHAR( 7) NOT NULL,
EXTENSI ON VARCHAR( 5) ,
OWNER_NO CHAR( 4) NOT NULL,
PRI MARY KEY ( AREA_CODE, PHONE_NO, OWNER_NO) ,
FOREI GN KEY ( OWNER_NO) REFERENCES OWNER,
CHECK( ( ' 0' <=SUBSTR( AREA_CODE, 1, 1) AND SUBSTR( AREA_CODE, 1, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( AREA_CODE, 2, 1) AND SUBSTR( AREA_CODE, 2, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( AREA_CODE, 3, 1) AND SUBSTR( AREA_CODE, 3, 1) <=' 9' ) ) ,
CHECK( ( ' 0' <=SUBSTR( PHONE_NO, 1, 1) AND SUBSTR( PHONE_NO, 1, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( PHONE_NO, 2, 1) AND SUBSTR( PHONE_NO, 2, 1) <=' 9' )
Master Thesis Weiguang Zhang McMaster University- Computing and Software
76

AND ( ' 0' <=SUBSTR( PHONE_NO, 3, 1) AND SUBSTR( PHONE_NO, 3, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( PHONE_NO, 4, 1) AND SUBSTR( PHONE_NO, 4, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( PHONE_NO, 5, 1) AND SUBSTR( PHONE_NO, 5, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( PHONE_NO, 6, 1) AND SUBSTR( PHONE_NO, 6, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( PHONE_NO, 7, 1) AND SUBSTR( PHONE_NO, 7, 1) <=' 9' ) )
)
CREATE TABLE BRANCH_PHONE (
AREA_CODE CHAR( 3) NOT NULL,
PHONE_NO CHAR( 7) NOT NULL,
EXTENSI ON VARCHAR( 5) ,
BRANCH_NO CHAR( 4) NOT NULL,
PRI MARY KEY ( AREA_CODE, PHONE_NO, BRANCH_NO) ,
FOREI GN KEY ( BRANCH_NO) REFERENCES BRANCH,
CHECK( ( ' 0' <=SUBSTR( AREA_CODE, 1, 1) AND SUBSTR( AREA_CODE, 1, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( AREA_CODE, 2, 1) AND SUBSTR( AREA_CODE, 2, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( AREA_CODE, 3, 1) AND SUBSTR( AREA_CODE, 3, 1) <=' 9' ) ) ,
CHECK( ( ' 0' <=SUBSTR( PHONE_NO, 1, 1) AND SUBSTR( PHONE_NO, 1, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( PHONE_NO, 2, 1) AND SUBSTR( PHONE_NO, 2, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( PHONE_NO, 3, 1) AND SUBSTR( PHONE_NO, 3, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( PHONE_NO, 4, 1) AND SUBSTR( PHONE_NO, 4, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( PHONE_NO, 5, 1) AND SUBSTR( PHONE_NO, 5, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( PHONE_NO, 6, 1) AND SUBSTR( PHONE_NO, 6, 1) <=' 9' )
AND ( ' 0' <=SUBSTR( PHONE_NO, 7, 1) AND SUBSTR( PHONE_NO, 7, 1) <=' 9' ) )
)
CREATE TABLE VI EWI NG (
PROPERTY_NO CHAR( 4) NOT NULL,
RENTER_NO CHAR( 4) NOT NULL,
VI EWI NG_DATE DATE NOT NULL,
PRI MARY KEY ( PROPERTY_NO, VI EWI NG_DATE, RENTER_NO) ,
FOREI GN KEY ( PROPERTY_NO) REFERENCES PROPERTY,
FOREI GN KEY ( RENTER_NO) REFERENCES RENTER
)
CREATE TABLE NEWSPAPER (
PAPER_NAME CHAR( 20) NOT NULL,
PRI MARY KEY ( PAPER_NAME)
)
CREATE TABLE ADVERTI SEMENT (
PAPER_NAME CHAR( 20) NOT NULL,
AD_NO CHAR( 4) NOT NULL,
AD_DATE DATE NOT NULL,
PROPERTY_NO CHAR( 4) NOT NULL,
PRI MARY KEY ( PAPER_NAME, AD_NO) ,
FOREI GN KEY ( PAPER_NAME) REFERENCES NEWSPAPER,
FOREI GN KEY ( PROPERTY_NO) REFERENCES PROPERTY
)
ALTER TABLE BRANCH
ADD CONSTRAI NT MANAGER_CNST FOREI GN KEY ( MANAGER) REFERENCES
STAFF( STAFF_NO)


Master Thesis Weiguang Zhang McMaster University- Computing and Software
77

9.5 Property Rental Interactive Queries

Query 1: Give the staff number of each of the staff members whose salary is greater than
5000. Please, sort them by the staff number.

SELECT STAFF_NO FROM STAFF
WHERE SALARY > 5000
ORDER BY STAFF_NO

Query 2: Give the renter number of each of the renters who has a viewing record. Please
avoid duplications.

SELECT DI STI NCT RENTER_NO FROM VI EWI NG

Query 3: Give the dates of all the advertisements posted in THE GLOBE AND MAIL in
2005. Please, avoid duplications.

SELECT DI STI NCT AD_DATE FROM ADVERTI SEMENT
WHERE PAPER_NAME = ' THE GLOBE AND MAI L' AND AD_DATE>=' 2005- 01- 01'
AND AD_DATE<=' 2005- 12- 31'
ORDER BY AD_DATE

Query 4: Give the email addresses and the renter number for all the private renters.
Please, sort them by the renter number.

SELECT EMAI L_ADDR, RENTER. RENTER_NO
FROM RENTER_EMAI L, RENTER
WHERE RENTER_EMAI L. RENTER_NO = RENTER. RENTER_NO
AND TYPE_OF_BUSI NESS I S NULL
ORDER BY RENTER. RENTER_NO

Query 5: Find the properties that are already advertised but not yet rented. Please, avoid
duplications.

SELECT DI STI NCT PROPERTY_NO FROM ADVERTI SEMENT
WHERE PROPERTY_NO NOT I N ( SELECT DI STI NCT PROPERTY_NO
FROM RENTAL_AGREEMENT)

Query 6: Give the names and the branch numbers of all the staff members working in the
branch which is located in Hamilton. The names should be listed in an
alphabetic order (by last, then by first, then by middle names).

SELECT FI RST_NAME, MI DDLE_NAME, LAST_NAME, BRANCH_NO
FROM STAFF, BRANCH
WHERE STAFF. ALLOCATED_TO=BRANCH. BRANCH_NO
AND BRANCH. CI TY=' HAMI LTON'
ORDER BY LAST_NAME, FI RST_NAME, MI DDLE_NAME

Master Thesis Weiguang Zhang McMaster University- Computing and Software
78

Query 7: Give the staff numbers and the names of all the workers who live on the same
street, city, and province as their manager. The names should be listed in an
alphabetic order (by last, then by first, then by middle names).

SELECT STAFF. STAFF_NO, FI RST_NAME, MI DDLE_NAME, LAST_NAME
FROM STAFF, ( SELECT STAFF_NO, BRANCH_NO, STAFF. STREET, STAFF. CI TY,
STAFF. PROVI NCE FROM STAFF, BRANCH
WHERE STAFF. STAFF_NO = BRANCH. MANAGER) AS T
WHERE STAFF. ALLOCATED_TO = T. BRANCH_NO AND
STAFF. STAFF_NO ! = T. STAFF_NO AND
STAFF. STREET = T. STREET AND
STAFF. CI TY = T. CI TY AND
STAFF. PROVI NCE = T. PROVI NCE
ORDER BY LAST_NAME, FI RST_NAME, MI DDLE_NAME

Query 8: Find the branch number and the average salary of the branch that has the highest
average salary. Please, call the branch number as branch_no and the
average salary as avg_salary.

( SELECT ALLOCATED_TO AS BRANCH_NO, AVG( SALARY) AS AVG_SALARY
FROM STAFF GROUP BY ALLOCATED_TO)
EXCEPT
( SELECT T1. ALLOCATED_TO AS BRANCH_NO, T1. AVG_SALARY
FROM ( SELECT ALLOCATED_TO, AVG( SALARY) AS AVG_SALARY
FROM STAFF GROUP BY ALLOCATED_TO) AS T1,
( SELECT ALLOCATED_TO, AVG( SALARY) AS AVG_SALARY
FROM STAFF GROUP BY ALLOCATED_TO) AS T2
WHERE T1. AVG_SALARY < T2. AVG_SALARY)

Query 9: Find the owners and renters who have 2 or more phone numbers. Call the
owner/renter number as customer_no, set the value of
type_of_customer to 'owner' if the customer is an owner, and to
'renter' if he/she is a renter. Please, only list the customer_no and
type_of_customer.

( SELECT OWNER_NO AS CUSTOMER_NO, ' OWNER' AS TYPE_OF_CUSTOMER
FROM OWNER
WHERE OWNER_NO I N ( SELECT OWNER_NO FROM OWNER_PHONE
GROUP BY OWNER_NO HAVI NG COUNT( *) >= 2) )
UNI ON
( SELECT RENTER_NO AS CUSTOMER_NO, ' RENTER' AS TYPE_OF_CUSTOMER
FROM RENTER
WHERE RENTER_NO I N ( SELECT RENTER_NO FROM RENTER_PHONE
GROUP BY RENTER_NO HAVI NG COUNT( *) >= 2) )

Query 10: Assuming that each advertisement costs 100 dollars, give the branch
number and the amount spent on the advertisements for each branch. Name
the branch number as branch_no, and the amount as ad_cost.

SELECT T2. ALLOCATED_TO AS BRANCH_NO, SUM( C) *100 AS AD_COST
Master Thesis Weiguang Zhang McMaster University- Computing and Software
79

FROM ( SELECT PROPERTY_NO, COUNT( *) AS C


FROM ADVERTI SEMENT GROUP BY PROPERTY_NO) AS T1,
( SELECT PROPERTY_NO, ALLOCATED_TO FROM PROPERTY, STAFF
WHERE PROPERTY. OVERSEEN_BY = STAFF. STAFF_NO) AS T2
WHERE T1. PROPERTY_NO = T2. PROPERTY_NO
GROUP BY T2. ALLOCATED_TO

Master Thesis Weiguang Zhang McMaster University- Computing and Software
80

Chapter 10: Software Project


10.1 Software Project Informal Description

Our website manages software projects for downloads to users. Each software project has
a unique project id (8 characters long), can be assigned one or more categories (the
categories are A, B ,C and D), has a status (D or P), and has a description (text of at most
256 characters). Some projects may depend on other projects and we keep track of the
dependency. Each project is developed and owned by a single developer (who is our
subscriber), and uploaded to our website in one or more transactions.
Our users are identified by name (at most 20 characters), email (at most 20
characters), and a unique user id (8 characters long). They can be either guest users or
subscribed users (subscribers for short). The subscribers have passwords (at most 8
characters) and we keep the date of the subscription. They need the password to access
our website to file bug reports or upload software projects or update patches. A user can
download any project, the number of downloads per user per project is recorded. The
subscribers can file bug reports for any project. Every bug identified has an id (a positive
integer) and a description (text of at most 256 characters). The bug ids must be unique
for all bugs concerning the same project. The date of filing of a bug report is recorded.
Each bug report deals with a single project and can report a single bug. Each bug report is
made by a single subscriber.
Some of our subscribers are developers. They develop the software projects and
also software updates for their own projects. Each update for a project has an id (8
characters long), a name (at most 20 characters), a status (P or U), a description (text of at
most 256 characters), and is assigned a particular type (the type are 1, 2 and 3). Each
update for a project is created by a single developer, the one who originally created the
project. Each update patch is uploaded to our website in a transaction.
Each transaction has an id (6 characters long) and a date when it took place. The
transaction ids must be unique for all transactions concerning the same project.
Master Thesis Weiguang Zhang McMaster University- Computing and Software
81

10.2 Software Project Logical Model

Figure 16: The Software Project Logical Model


Master Thesis Weiguang Zhang McMaster University- Computing and Software
82

10.3 Software Project Physical DB2 Model

Figure 17: The Software Project Physical Model


Master Thesis Weiguang Zhang McMaster University- Computing and Software
83

10.4 Software Project DB2 Schema


CREATE TABLE USER (
USER_I D CHAR( 8) NOT NULL,
NAME CHAR( 20) NOT NULL,
EMAI L CHAR( 20) ,
NOF_DOWNLOADS I NTEGER NOT NULL,
PRI MARY KEY ( USER_I D)
)
CREATE TABLE GUEST (
USER_I D CHAR( 8) NOT NULL,
PRI MARY KEY ( USER_I D) ,
FOREI GN KEY ( USER_I D) REFERENCES USER
)
CREATE TABLE SUBSCRI BER (
USER_I D CHAR( 8) NOT NULL,
SUBSCRDATE DATE NOT NULL,
PASSWORD CHAR( 8) NOT NULL,
PRI MARY KEY ( USER_I D) ,
FOREI GN KEY ( USER_I D) REFERENCES USER
)
CREATE TABLE NONDEVELOPER (
USER_I D CHAR( 8) NOT NULL,
PRI MARY KEY ( USER_I D) ,
FOREI GN KEY ( USER_I D) REFERENCES SUBSCRI BER
)
CREATE TABLE DEVELOPER (
USER_I D CHAR( 8) NOT NULL,
PRI MARY KEY ( USER_I D) ,
FOREI GN KEY ( USER_I D) REFERENCES SUBSCRI BER
)
CREATE TABLE PROJ ECT (
PROJ ECT_I D CHAR( 8) NOT NULL,
STATUS CHAR( 1) NOT NULL,
DESCRI PTI ON CHAR( 254) ,
OWNED_BY CHAR( 8) NOT NULL,
PRI MARY KEY ( PROJ ECT_I D) ,
FOREI GN KEY ( OWNED_BY) REFERENCES DEVELOPER
)
CREATE TABLE DEPENDS (
PROJ ECT_I D CHAR( 8) NOT NULL,
DEPENDS_ON CHAR( 8) NOT NULL,
PRI MARY KEY ( PROJ ECT_I D, DEPENDS_ON) ,
FOREI GN KEY ( PROJ ECT_I D) REFERENCES PROJ ECT,
FOREI GN KEY ( DEPENDS_ON) REFERENCES PROJ ECT
)
CREATE TABLE CATEGORY (
PROJ ECT_I D CHAR( 8) NOT NULL,
CAT CHAR( 1) NOT NULL,
PRI MARY KEY ( PROJ ECT_I D, CAT) ,
FOREI GN KEY ( PROJ ECT_I D) REFERENCES PROJ ECT
)

CREATE TABLE DOWNLOAD (
Master Thesis Weiguang Zhang McMaster University- Computing and Software
84

PROJ ECT_I D CHAR( 8) NOT NULL,


USER_I D CHAR( 8) NOT NULL,
PRI MARY KEY ( USER_I D, PROJ ECT_I D) ,
FOREI GN KEY ( USER_I D) REFERENCES USER,
FOREI GN KEY ( PROJ ECT_I D) REFERENCES PROJ ECT
)
CREATE TABLE BUG (
PROJ ECT_I D CHAR( 8) NOT NULL,
BUG_I D I NTEGER NOT NULL,
DESCRI PTI ON CHAR( 254) ,
DATE DATE NOT NULL,
PRI MARY KEY ( PROJ ECT_I D, BUG_I D) ,
FOREI GN KEY ( PROJ ECT_I D) REFERENCES PROJ ECT
)
CREATE TABLE BUGREPORT (
USER_I D CHAR( 8) NOT NULL,
PROJ ECT_I D CHAR( 8) NOT NULL,
BUG_I D I NTEGER NOT NULL,
PRI MARY KEY ( PROJ ECT_I D, BUG_I D) ,
FOREI GN KEY ( PROJ ECT_I D, BUG_I D) REFERENCES BUG,
FOREI GN KEY ( USER_I D) REFERENCES USER
)
CREATE TABLE TRANSACTI ON (
TRANSACT_I D CHAR( 6) NOT NULL,
PROJ ECT_I D CHAR( 8) NOT NULL,
DATE DATE NOT NULL,
PRI MARY KEY ( PROJ ECT_I D, TRANSACT_I D) ,
FOREI GN KEY ( PROJ ECT_I D) REFERENCES PROJ ECT
)
CREATE TABLE DEVELTRAN (
TRANSACT_I D CHAR( 6) NOT NULL,
PROJ ECT_I D CHAR( 8) NOT NULL,
PRI MARY KEY ( PROJ ECT_I D, TRANSACT_I D) ,
FOREI GN KEY ( PROJ ECT_I D, TRANSACT_I D) REFERENCES TRANSACTI ON
)
CREATE TABLE UPDATETRAN (
TRANSACT_I D CHAR( 6) NOT NULL,
PROJ ECT_I D CHAR( 8) NOT NULL,
PRI MARY KEY ( PROJ ECT_I D, TRANSACT_I D) ,
FOREI GN KEY ( PROJ ECT_I D, TRANSACT_I D) REFERENCES TRANSACTI ON
)
CREATE TABLE PATCH (
PROJ ECT_I D CHAR( 8) NOT NULL,
TRANSACT_I D CHAR( 6) NOT NULL,
PATCH_I D CHAR( 8) NOT NULL,
NAME CHAR( 20) NOT NULL,
STATUS CHAR( 1) NOT NULL,
DESCRI PTI ON CHAR( 254) ,
TYPE CHAR( 1) NOT NULL,
PRI MARY KEY ( PROJ ECT_I D, TRANSACT_I D, PATCH_I D) ,
FOREI GN KEY ( PROJ ECT_I D, TRANSACT_I D) REFERENCES TRANSACTI ON
)
Master Thesis Weiguang Zhang McMaster University- Computing and Software
85

10.5 Software Project Interactive Queries


Query 1: Give user id and name of all developers who own a project.

SELECT DEVELOPER. USER_I D, USER. NAME
FROM DEVELOPER, USER
WHERE DEVELOPER. USER_I D=USER. USEr _I D
AND DEVELOPER. USER_I D I N ( SELECT OWNED_BY FROM PROJ ECT
WHERE OWNED_BY I S NOT NULL)

Query 2: Give project id of all projects that have more than two update patches.

SELECT PROJ ECT_I D
FROM ( SELECT PROJ ECT. PROJ ECT_I D, C
FROM PROJ ECT, ( SELECT PROJ ECT_I D, COUNT( *) AS C
FROM PATCH GROUP BY PROJ ECT_I D) AS T
WHERE PROJ ECT. PROJ ECT_I D=T. PROJ ECT_I D)
WHERE C > 2

Query 3: For each project, give the number of all update patches and the number of all
downloads.

SELECT T. PROJ ECT_I D, PATCH_COUNT, DOWNLOAD_COUNT
FROM ( SELECT PROJ ECT_I D, COUNT( *) AS PATCH_COUNT
FROM PATCH GROUP BY PROJ ECT_I D) AS T,
( SELECT PROJ ECT_I D, COUNT( *) AS DOWNLOAD_COUNT
FROM DOWNLOAD GROUP BY PROJ ECT_I D) AS S
WHERE T. PROJ ECT_I D=S. PROJ ECT_I D

Query 4: Give the project id of the projects with the most downloads.

SELECT PROJ ECT_I D
FROM ( SELECT PROJ ECT_I D, COUNT( *) AS DOWNLOAD_COUNT
FROM DOWNLOAD GROUP BY PROJ ECT_I D) ,
( SELECT MAX( DC) AS MAXDC
FROM ( SELECT COUNT( *) AS DC FROM DOWNLOAD
GROUP BY PROJ ECT_I D) )
WHERE DOWNLOAD_COUNT=MAXDC

Query 5: Give the project id of the projects with the most update patches.

SELECT PROJ ECT_I D
FROM ( SELECT PROJ ECT_I D, COUNT( *) AS PATCH_COUNT
FROM PATCH GROUP BY PROJ ECT_I D) ,
( SELECT MAX( PC) AS MAXPC
FROM ( SELECT COUNT( *) AS PC
FROM PATCH GROUP BY PROJ ECT_I D) )
WHERE PATCH_COUNT=MAXPC

Query 6: For each project, give project id of all projects that the project depends on.

Master Thesis Weiguang Zhang McMaster University- Computing and Software
86

SELECT *
FROM DEPENDS

Query 7: Give project id of all projects that do not depend on any other project.

( SELECT di st i nct PROJ ECT_I D FROM PROJ ECT)
EXCEPT
( SELECT PROJ ECT_I D FROM DEPENDS)

Query 8: Give the project id of the projects that depend on the most other projects.

SELECT T. PROJ ECT_I D
FROM ( SELECT PROJ ECT_I D, COUNT( *) AS DEPEND_COUNT
FROM DEPENDS GROUP BY PROJ ECT_I D) AS T,
( SELECT MAX( DC) AS MAXDC
FROM ( SELECT COUNT( *) AS DC
FROM DEPENDS GROUP BY PROJ ECT_I D) )
WHERE T. DEPEND_COUNT = MAXDC

Query 9: Give description, bug id, and project id of all bug reports for all projects that
have most bug reports.

SELECT BUG_I D, BUG. PROJ ECT_I D, DESCRI PTI ON
FROM BUG, ( SELECT T. PROJ ECT_I D, T. BC
FROM ( SELECT PROJ ECT_I D, COUNT( *) AS BC
FROM BUG GROUP BY PROJ ECT_I D) AS T,
( SELECT MAX( BC1) AS MAXBC
FROM ( SELECT COUNT( *) AS BC1
FROM BUG GROUP BY PROJ ECT_I D) )
WHERE T. BC=MAXBC) AS S
WHERE BUG. PROJ ECT_I D=S. PROJ ECT_I D

Query 10: Give user id of a developer with the least amount of bug reports.

SELECT USER_I D
FROM ( SELECT USER_I D, COUNT( *) AS BPD
FROM ( SELECT BUG_I D, BUG. PROJ ECT_I D, USER_I D
FROM BUG, PROJ ECT, DEVELOPER
WHERE BUG. PROJ ECT_I D=PROJ ECT. PROJ ECT_I D
AND OWNED_BY=USER_I D)
GROUP BY USER_I D)
WHERE BPD I N ( SELECT MI N( BPD) AS MI NBPD
FROM ( SELECT USER_I D, COUNT( *) AS BPD
FROM ( SELECT BUG_I D, BUG. PROJ ECT_I D, USER_I D
FROM BUG, PROJ ECT, DEVELOPER
WHERE BUG. PROJ ECT_I D=PROJ ECT. PROJ ECT_I D
Master Thesis Weiguang Zhang McMaster University- Computing and Software
87

Chapter 11:Tour Operator System


10.1 Tour Operator System Informal Description

The system need to keep track of people. For each person, it records all his/her address, of
which exactly one is designated as the mailing address (so each person has at least one
address). Each address consists of country, province/state, city, street, street number, P.O.
Box number, and a list (possible empty) of phone numbers to the location of the address
and a list (possible empty) of fax numbers to the location of the address. In addition to the
list of addresses for each person it records a list (possible empty) of cell phone numbers
and a list (possible empty) of email address. Each person in the database can be an old
customer (have taken a tour of the company), a current customer (is booked to take a tour
or is on a tour right now), a tour guide, an employee (works for the tour company), or any
mixture of these (for instance an employee can take a tour and so can be a customer as
well, or an employee can work as a tour guide for a particular tour and hence be an
employee and a guide at the same time etc.). The sex and age of each person must also be
recorded, a date-of-birth is optional for an external worker, a contract reference for each
of the tours the guide is doing must be included. A guide contract references the tour (see
below) and the total amount the tour guide will be paid for the tour. The guides do not
pay for the accommodation and the meals.
The system also keeps track of all tours, past and future. Each tour has a unique
designation, itinerary, guide (at least one, but may be more than one), its status
(completed, in-progress, in-the-future), and the list of participants (not including the
guides). The itinerary consists of list of the dates the tour covers and for each date it
includes the place of breakfast, the place of lunch, the place of diner, and the place of
accommodation. For each of the places there is a contract reference. Each day in the
itinerary also includes and a simple English description of the activities during that day.
An accommodation can be a hotel, or a rented room or rooms from a rental
company, or a rented room or rooms from a private person. A meal (breakfast, lunch,
dinner) can be in hotel, restaurant, or a private place. The contract for accommodation or
meal must bear the date of the contract becomes valid, the date or dates it covers, what
the contract is for (accommodation, breakfast, lunch, dinner) if the pricing is per person
or per group or per room or per the whole facility, per night or per a certain period and the
corresponding price. It also may stipulate the minimum and the maximum of people for
the accommodation/meal for each day it covers, financial penalty if less than minimum
Master Thesis Weiguang Zhang McMaster University- Computing and Software
88

uses the accommodation. All prices are assumed to be in Canadian dollars, not conversion
is involved, regardless where the place is. Each place is identified by a single address.
Each provider of accommodation or meal has a unique designation.
Master Thesis Weiguang Zhang McMaster University- Computing and Software
89

11.2 Tour Operator System Logical Model

Figure 18: The Tour Operator System Logical Model


Master Thesis Weiguang Zhang McMaster University- Computing and Software
90

11.3 Tour Operator System Physical DB2 Model


Figure 19: The Tour Operator System Physical Model
Master Thesis Weiguang Zhang McMaster University- Computing and Software
91

11.4 Tour Operator System DB2 schema



CREATE TABLE PERSONS(
PI D SMALLI NT NOT NULL,
NAME VARCHAR( 20) NOT NULL,
SEX CHAR( 1) NOT NULL CHECK ( SEX I N ( ' M' , ' F' ) ) ,
AGE SMALLI NT NOT NULL CHECK ( AGE BETWEEN 0 AND 150) ,
BI RTHDATE DATE NOT NULL,
PRI MARY KEY( PI D) ,
CONSTRAI NT AGECHECK CHECK ( 2003- YEAR( BI RTHDATE) =AGE)
)
CREATE TABLE HASE(
PI D SMALLI NT NOT NULL,
EADDR VARCHAR( 30) NOT NULL,
PRI MARY KEY( PI D, EADDR) ,
FOREI GN KEY ( PI D) REFERENCES PERSONS ( PI D)
)
CREATE TABLE HASCE(
PI D SMALLI NT NOT NULL,
PHONENO VARCHAR( 20) NOT NULL,
PRI MARY KEY( PI D, PHONENO) ,
FOREI GN KEY ( PI D) REFERENCES PERSONS ( PI D)
)
CREATE TABLE ADDRESSES(
adI D SMALLI NT NOT NULL,
COUNTRY CHAR( 3) NOT NULL,
CI TY VARCHAR( 10) NOT NULL,
STREET VARCHAR( 10) ,
STRNO VARCHAR( 10) ,
POBox VARCHAR( 10) ,
PRI MARY KEY( adI D) ,
CONSTRAI NT ADDRCHECK1
CHECK ( NOT ( ( STREET I S NOT NULL) AND ( POBox I S NOT NULL) ) ) ,
CONSTRAI NT ADDRCHECK2
CHECK ( NOT ( ( STRNO I S NOT NULL) AND ( POBox I S NOT NULL) ) ) ,
CONSTRAI NT ADDRCHECK3
CHECK ( NOT ( ( STREET I S NOT NULL) AND ( STRNO I S NULL) ) ) ,
CONSTRAI NT ADDRCHECK4
CHECK ( NOT ( ( STRNO I S NOT NULL) AND ( STREET I S NULL) ) )
)
CREATE TABLE HASA(
PI D SMALLI NT NOT NULL,
adI D SMALLI NT NOT NULL,
PRI MARY KEY( PI D, adI D) ,
FOREI GN KEY ( PI D) REFERENCES PERSONS ( PI D) ,
FOREI GN KEY ( adI D) REFERENCES ADDRESSES ( adI D)
)
CREATE TABLE PHONES(
PHONENO VARCHAR( 20) NOT NULL,
PRI MARY KEY( PHONENO)
)
CREATE TABLE FAXES(
PHONENO VARCHAR( 20) NOT NULL,
Master Thesis Weiguang Zhang McMaster University- Computing and Software
92

PRI MARY KEY( PHONENO)


)
CREATE TABLE HASP(
adI D SMALLI NT NOT NULL,
PHONENO VARCHAR( 20) NOT NULL,
PRI MARY KEY( PHONENO) ,
FOREI GN KEY ( adI D) REFERENCES ADDRESSES ( adI D) ,
FOREI GN KEY ( PHONENO) REFERENCES PHONES ( PHONENO)
)
CREATE TABLE HASF(
adI D SMALLI NT NOT NULL,
PHONENO VARCHAR( 20) NOT NULL,
PRI MARY KEY( PHONENO) ,
FOREI GN KEY ( adI D) REFERENCES ADDRESSES ( adI D) ,
FOREI GN KEY ( PHONENO) REFERENCES FAXES ( PHONENO)
)
CREATE TABLE EMPLOYEES(
PI D SMALLI NT NOT NULL,
PRI MARY KEY( PI D) ,
FOREI GN KEY ( PI D) REFERENCES PERSONS ( PI D)
)
CREATE TABLE CUSTOMERS(
PI D SMALLI NT NOT NULL,
PRI MARY KEY( PI D) ,
FOREI GN KEY ( PI D) REFERENCES PERSONS ( PI D)
)
CREATE TABLE GUI DES(
PI D SMALLI NT NOT NULL,
PRI MARY KEY( PI D) ,
FOREI GN KEY ( PI D) REFERENCES PERSONS ( PI D)
)
CREATE TABLE TOURS(
DESI G VARCHAR( 5) NOT NULL,
STATUS CHAR( 3) NOT NULL CHECK ( STATUS I N ( ' P' , ' I ' , ' F' ) ) ,
PRI MARY KEY( DESI G)
)
CREATE TABLE PARTI CI P(
PI D SMALLI NT NOT NULL,
DESI G VARCHAR( 5) NOT NULL,
PRI MARY KEY ( PI D, DESI G) ,
FOREI GN KEY ( PI D) REFERENCES CUSTOMERS ( PI D) ,
FOREI GN KEY ( DESI G) REFERENCES TOURS ( DESI G)
)
CREATE TABLE HASCO(
PI D SMALLI NT NOT NULL,
DESI G VARCHAR( 5) NOT NULL,
AMOUNT DECI MAL( 9, 2) NOT NULL,
PRI MARY KEY ( PI D, DESI G) ,
FOREI GN KEY ( PI D) REFERENCES GUI DES ( PI D) ,
FOREI GN KEY ( DESI G) REFERENCES TOURS ( DESI G)
)
CREATE TABLE I TI NERARI ES(
DESI G VARCHAR( 5) NOT NULL,
DATE DATE NOT NULL,
Master Thesis Weiguang Zhang McMaster University- Computing and Software
93

DESCR VARCHAR( 256) ,


PRI MARY KEY ( DESI G, DATE) ,
FOREI GN KEY ( DESI G) REFERENCES TOURS ( DESI G)
)
CREATE TABLE PROVI DERS(
DESI GN VARCHAR( 10) NOT NULL,
PRI MARY KEY ( DESI GN)
)
CREATE TABLE PLACES(
adI D SMALLI NT NOT NULL,
DESI GN VARCHAR( 10) NOT NULL,
PRI MARY KEY ( adI D) ,
FOREI GN KEY ( adI D) REFERENCES ADDRESSES ( adI D) ,
FOREI GN KEY ( DESI GN) REFERENCES PROVI DERS ( DESI GN)
)
CREATE TABLE I SBP(
AMOUNT DECI MAL( 9, 2) NOT NULL,
VALI D_DATE DATE NOT NULL,
PRI CI NG CHAR( 1) NOT NULL CHECK ( PRI CI NG I N ( ' G' , ' P' ) ) ,
FROMD DATE NOT NULL,
TOD DATE NOT NULL,
MI NP SMALLI NT NOT NULL,
MAXP SMALLI NT NOT NULL,
PENALTY DECI MAL( 9, 2) NOT NULL,
DESI G VARCHAR( 5) NOT NULL,
DATE DATE NOT NULL,
adI D SMALLI NT NOT NULL,
PRI MARY KEY ( DESI G, DATE) ,
FOREI GN KEY ( DESI G, DATE) REFERENCES I TI NERARI ES ( DESI G, DATE) ,
FOREI GN KEY ( adI D) REFERENCES PLACES ( adI D) ,
CONSTRAI NT I SBP_DATE1 CHECK ( VALI D_DATE < FROMD) ,
CONSTRAI NT I SBP_DATE2 CHECK ( FROMD <= TOD) ,
CONSTRAI NT I SBP_DATE3 CHECK ( FROMD <= DATE) ,
CONSTRAI NT I SBP_DATE4 CHECK ( DATE <= TOD) ,
CONSTRAI NT I SBP_PER1 CHECK ( MI NP <= MAXP)
)
CREATE TABLE I SLP(
AMOUNT DECI MAL( 9, 2) NOT NULL,
VALI D_DATE DATE NOT NULL,
PRI CI NG CHAR( 1) NOT NULL CHECK ( PRI CI NG I N ( ' G' , ' P' ) ) ,
FROMD DATE NOT NULL,
TOD DATE NOT NULL,
MI NP SMALLI NT NOT NULL,
MAXP SMALLI NT NOT NULL,
PENALTY DECI MAL( 9, 2) NOT NULL,
DESI G VARCHAR( 5) NOT NULL,
DATE DATE NOT NULL,
adI D SMALLI NT NOT NULL,
PRI MARY KEY ( DESI G, DATE) ,
FOREI GN KEY ( DESI G, DATE) REFERENCES I TI NERARI ES ( DESI G, DATE) ,
FOREI GN KEY ( adI D) REFERENCES PLACES ( adI D) ,
CONSTRAI NT I SLP_DATE1 CHECK ( VALI D_DATE < FROMD) ,
CONSTRAI NT I SLP_DATE2 CHECK ( FROMD <= TOD) ,
CONSTRAI NT I SLP_DATE3 CHECK ( FROMD <= DATE) ,
Master Thesis Weiguang Zhang McMaster University- Computing and Software
94

CONSTRAI NT I SLP_DATE4 CHECK ( DATE <= TOD) ,


CONSTRAI NT I SLP_PER1 CHECK ( MI NP <= MAXP)
)
CREATE TABLE I SDP(
AMOUNT DECI MAL( 9, 2) NOT NULL,
VALI D_DATE DATE NOT NULL,
PRI CI NG CHAR( 1) NOT NULL CHECK ( PRI CI NG I N ( ' G' , ' P' ) ) ,
FROMD DATE NOT NULL,
TOD DATE NOT NULL,
MI NP SMALLI NT NOT NULL,
MAXP SMALLI NT NOT NULL,
PENALTY DECI MAL( 9, 2) NOT NULL,
DESI G VARCHAR( 5) NOT NULL,
DATE DATE NOT NULL,
adI D SMALLI NT NOT NULL,
PRI MARY KEY ( DESI G, DATE) ,
FOREI GN KEY ( DESI G, DATE) REFERENCES I TI NERARI ES ( DESI G, DATE) ,
FOREI GN KEY ( adI D) REFERENCES PLACES ( adI D) ,
CONSTRAI NT I SDP_DATE1 CHECK ( VALI D_DATE < FROMD) ,
CONSTRAI NT I SDP_DATE2 CHECK ( FROMD <= TOD) ,
CONSTRAI NT I SDP_DATE3 CHECK ( FROMD <= DATE) ,
CONSTRAI NT I SDP_DATE4 CHECK ( DATE <= TOD) ,
CONSTRAI NT I SDP_PER1 CHECK ( MI NP <= MAXP)
)
CREATE TABLE I SSP(
AMOUNT DECI MAL( 9, 2) NOT NULL,
VALI D_DATE DATE NOT NULL,
PRI CI NG CHAR( 1) NOT NULL CHECK ( PRI CI NG I N ( ' G' , ' P' ) ) ,
FROMD DATE NOT NULL,
TOD DATE NOT NULL,
MI NP SMALLI NT NOT NULL,
MAXP SMALLI NT NOT NULL,
PENALTY DECI MAL( 9, 2) NOT NULL,
DESI G VARCHAR( 5) NOT NULL,
DATE DATE NOT NULL,
adI D SMALLI NT NOT NULL,
PRI MARY KEY ( DESI G, DATE) ,
FOREI GN KEY ( DESI G, DATE) REFERENCES
I TI NERARI ES ( DESI G, DATE) ,
FOREI GN KEY ( adI D) REFERENCES PLACES ( adI D) ,
CONSTRAI NT I SSP_DATE1 CHECK ( VALI D_DATE < FROMD) ,
CONSTRAI NT I SSP_DATE2 CHECK ( FROMD <= TOD) ,
CONSTRAI NT I SSP_DATE3 CHECK ( FROMD <= DATE) ,
CONSTRAI NT I SSP_DATE4 CHECK ( DATE <= TOD) ,
CONSTRAI NT I SSP_PER1 CHECK ( MI NP <= MAXP)
)
11.5 Tour Operator System Interactive Queries

Query 1: list all customers, old and current.

SELECT CUSTOMERS. PI D, NAME FROM CUSTOMERS, PERSONS
Master Thesis Weiguang Zhang McMaster University- Computing and Software
95

WHERE CUSTOMERS. PI D=PERSONS. PI D



Query 2: List all customers with all their addresses.

SELECT CUSTOMERS. PI D, NAME, COUNTRY, CI TY, STREET, STRNO, POBox
FROM CUSTOMERS, PERSONS, ADDRESSES, HASA
WHERE CUSTOMERS. PI D=HASA. PI D
AND HASA. adI D=ADDRESSES. adI D AND CUSTOMERS. PI D=PERSONS. PI D

Query 3: For a given guide, find all the tours he/she guided or will guide and the amount
he/she got/will get for the guiding the tour

SELECT HASCO. PI D, NAME, DESI G, AMOUNT FROM HASCO, PERSONS
WHERE HASCO. PI D=0 AND PERSONS. PI D=0

Query 4: List all customers that are also guides.

SELECT CUSTOMERS. PI D, NAME FROM PERSONS, CUSTOMERS, GUI DES
WHERE CUSTOMERS. PI D=GUI DES. PI D AND CUSTOMERS. PI D=PERSONS. PI D

Query 5: List all guides that guided a tour that had a lunch in a given place.

SELECT DI STI NCT HASCO. PI D, NAME FROM HASCO, I SLP, PERSONS
WHERE HASCO. DESI G=I SLP. DESI G AND I SLP. adI D=100 AND HASCO. PI D=PERSONS. PI D

Query 6: List all contracts that cover dinners in a given place.

SELECT DI STI NCT AMOUNT, VALI D_DATE, PRI CI NG, FROMD, TOD,
MI NP, MAXP, PENALTY, DESI G
FROM I SDP WHERE adI D=103

Query 7: List all providers that provide sleeping accommodation.

SELECT DI STI NCT PLACES. DESI GN
FROM PLACES, I SSP WHERE PLACES. adI D=I SSP. adI D

Query 8: List the tours that will have breakfast at a given place on a given date .

SELECT TOURS. DESI G FROM TOURS, I SBP
WHERE TOURS. DESI G=I SBP. DESI G AND I SBP. DATE=' 12/ 18/ 2002' AND adI D=100

Query 9: List all employees that have guided or will guide a tour or who have taken or
will taken a tour.

SELECT DI STI NCT EMPLOYEES. PI D, NAME
FROM EMPLOYEES, GUI DES, CUSTOMERS, PERSONS
WHERE ( EMPLOYEES. PI D=GUI DES. PI D OR EMPLOYEES. PI D=CUSTOMERS. PI D)
AND EMPLOYEES. PI D=PERSONS. PI D

Query 10: List all customers booked for a tour starting later or on a given date.
Master Thesis Weiguang Zhang McMaster University- Computing and Software
96


SELECT DI STI NCT PARTI CI P. PI D, NAME FROM PARTI CI P, I TI NERARI ES, PERSONS
WHERE PARTI CI P. DESI G=I TI NERARI ES. DESI G
AND I TI NERARI ES. DATE >= ' 12/ 18/ 2003' AND PARTI CI P. PI D=PERSONS. PI D
AND NOT EXI STS ( SELECT I TI NERARI ES. DATE FROM I TI NERARI ES
WHERE I TI NERARI ES. DATE < ' 12/ 18/ 2003'
AND I TI NERARI ES. DESI G=PARTI CI P. DESI G)

Master Thesis Weiguang Zhang McMaster University- Computing and Software
97

Chapter 12: Warehouse System


12.1 Warehouse System Informal Description

Our company has several warehouses, each warehouse is designated by a unique 4-letter
symbol (by a letter we mean a..z and A..Z). Each warehouse has several bins that are
identified uniquely by numbers (unsigned integers), i.e. each warehouse has bins 0, 1, 2,
3, Each bin has a particular capacity. In our warehouses (more precisely in the bins in
our warehouses) we store parts. Each part is designated by a unique part number (a 5-
symbol sequence of digits and letters). Several parts together can form another part. We
call such a part assembly. In the warehouses we store only the constituent parts, but we
record the assemblies in our database as it were a part. Assemblies cannot be parts of
other assemblies. A part can be a constituent part in at most in one assembly parts arrive
in batches. Each batch for a particular part has a unique batch number (unsigned integer)
and arrives on a particular date. Each batch has a size, i.e. the number of items in the
batch. All items from the same batch are stored together in the same bin (no batch is
stored in more than 1 bin). Each item in a batch has a unique item number (unsigned
integer). For example: part A1, batch 27, item 1 or part A1, batch 23, item 1 etc.
When a batch arrives, its date-in is recorded. A particular manager checks its
arrival, and this fact must be recorded in the database.
Some parts may be backordered. A part can be backordered only by a manager.
The manager, the date of the backorder are recorded, and also the quantity backordered.
When a backorder shipment arrives, the backorders remaining quantity is updated (the
number of items arrived is subtracted from the remaining quantity), and if it is less or
equal to 0, the backorder is deleted, but must be kept for record. There may be only a
single current (active) backorder for any parts. Assemblies cannot be backordered, only
their constituent parts.
When an item is shipped out of the warehouse, its date-out is recorded together
with the employee who checked its shipping.
Employee has a unique employee number (a 6-digit number), phone number(s) (it
consists of a 3-digit area code and a 6-digit number an employee can have 0 to many
phone numbers), name(s) (it consists of an up=to-10-characters fist name, an up-to-10-
characters middle name, and an up-to-20-characters last name, an employee can have 1 to
many names), address(s) (it consists of an up-to-6-characters street number, an up-to-20-
Master Thesis Weiguang Zhang McMaster University- Computing and Software
98

characters street name, an up-to-20-characters city name, and a 2-character abbreviation


of the province, an employee can have 1 to many address). Some of the employees are
managers. Every employee who is not a manager works under supervision of a single
manager. Managers do not work under other managers.
Master Thesis Weiguang Zhang McMaster University- Computing and Software
99

12.2 Warehouse System Logical Model

Figure 20: The Warehouse System Logical Model


Master Thesis Weiguang Zhang McMaster University- Computing and Software
100

12.3 Warehouse System Physical DB2 Model

Figure 21: The Warehouse System Physical Model


Master Thesis Weiguang Zhang McMaster University- Computing and Software
101

12.4 Warehouse System DB2 Schema

CREATE TABLE EMPLOYEE (


EMPLOYEENO CHAR( 6) NOT NULL,
PRI MARY KEY ( EMPLOYEENO) ,
CHECK ( ( ' 0' <= SUBSTR( EMPLOYEENO, 1, 1) AND SUBSTR( EMPLOYEENO, 1, 1) <= ' 9' )
AND ( ' 0' <= SUBSTR( EMPLOYEENO, 2, 1) AND SUBSTR( EMPLOYEENO, 2, 1) <= ' 9' )
AND ( ' 0' <= SUBSTR( EMPLOYEENO, 3, 1) AND SUBSTR( EMPLOYEENO, 3, 1) <= ' 9' )
AND ( ' 0' <= SUBSTR( EMPLOYEENO, 4, 1) AND SUBSTR( EMPLOYEENO, 4, 1) <= ' 9' )
AND ( ' 0' <= SUBSTR( EMPLOYEENO, 5, 1) AND SUBSTR( EMPLOYEENO, 5, 1) <= ' 9' )
AND ( ' 0' <= SUBSTR( EMPLOYEENO, 6, 1) AND SUBSTR( EMPLOYEENO, 6, 1) <= ' 9' ) )
)
CREATE TABLE MANAGER (
EMPLOYEENO CHAR( 6) NOT NULL,
PRI MARY KEY ( EMPLOYEENO) ,
FOREI GN KEY ( EMPLOYEENO) REFERENCES EMPLOYEE
)
CREATE TABLE WORKER (
EMPLOYEENO CHAR( 6) NOT NULL,
MANAGERNO CHAR( 6) NOT NULL,
PRI MARY KEY ( EMPLOYEENO) ,
FOREI GN KEY ( EMPLOYEENO) REFERENCES EMPLOYEE,
FOREI GN KEY ( MANAGERNO) REFERENCES MANAGER( EMPLOYEENO)
)
CREATE TABLE HASPHONE (
EMPLOYEENO CHAR( 6) NOT NULL,
AREA_CODE CHAR( 3) NOT NULL,
NUMBER CHAR( 6) NOT NULL,
PRI MARY KEY ( EMPLOYEENO, AREA_CODE, NUMBER) ,
FOREI GN KEY ( EMPLOYEENO) REFERENCES EMPLOYEE,
CHECK ( ( ' 0' <= SUBSTR( AREA_CODE, 1, 1) AND SUBSTR( AREA_CODE, 1, 1) <= ' 9' )
AND ( ' 0' <= SUBSTR( AREA_CODE, 2, 1) AND SUBSTR( AREA_CODE, 2, 1) <= ' 9' )
AND ( ' 0' <= SUBSTR( AREA_CODE, 3, 1) AND SUBSTR( AREA_CODE, 3, 1) <= ' 9' ) ) ,
CHECK ( ( ' 0' <= SUBSTR( NUMBER, 1, 1) AND SUBSTR( NUMBER, 1, 1) <= ' 9' )
AND ( ' 0' <= SUBSTR( NUMBER, 2, 1) AND SUBSTR( NUMBER, 2, 1) <= ' 9' )
AND ( ' 0' <= SUBSTR( NUMBER, 3, 1) AND SUBSTR( NUMBER, 3, 1) <= ' 9' )
AND ( ' 0' <= SUBSTR( NUMBER, 4, 1) AND SUBSTR( NUMBER, 4, 1) <= ' 9' )
AND ( ' 0' <= SUBSTR( NUMBER, 5, 1) AND SUBSTR( NUMBER, 5, 1) <= ' 9' )
AND ( ' 0' <= SUBSTR( NUMBER, 6, 1) AND SUBSTR( NUMBER, 6, 1) <= ' 9' ) )
)
CREATE TABLE HASNAME (
EMPLOYEENO CHAR( 6) NOT NULL,
FI RST VARCHAR( 10) NOT NULL,
MI DDLE VARCHAR( 10) ,
LAST VARCHAR( 20) NOT NULL,
PRI MARY KEY ( EMPLOYEENO, FI RST, LAST) ,
FOREI GN KEY ( EMPLOYEENO) REFERENCES EMPLOYEE
)
CREATE TABLE HASADDRESS (
EMPLOYEENO CHAR( 6) NOT NULL,
STRNO VARCHAR( 6) NOT NULL,
STREET VARCHAR( 20) NOT NULL,
Master Thesis Weiguang Zhang McMaster University- Computing and Software
102

CI TY VARCHAR( 20) NOT NULL,


PROVI NCE CHAR( 2) NOT NULL,
PRI MARY KEY ( EMPLOYEENO, STRNO, STREET, CI TY, PROVI NCE) ,
FOREI GN KEY ( EMPLOYEENO) REFERENCES EMPLOYEE
)
CREATE TABLE PART (
PARTNO CHAR( 5) NOT NULL,
PRI MARY KEY ( PARTNO) ,
CHECK ( ( ( ' 0' <= SUBSTR( PARTNO, 1, 1) AND SUBSTR( PARTNO, 1, 1) <= ' 9' )
OR ( ' a' <= SUBSTR( PARTNO, 1, 1) AND SUBSTR( PARTNO, 1, 1) <= ' z' )
OR ( ' A' <= SUBSTR( PARTNO, 1, 1) AND SUBSTR( PARTNO, 1, 1) <= ' Z' ) )
AND ( ( ' 0' <= SUBSTR( PARTNO, 2, 1) AND SUBSTR( PARTNO, 2, 1) <= ' 9' )
OR ( ' a' <= SUBSTR( PARTNO, 2, 1) AND SUBSTR( PARTNO, 2, 1) <= ' z' )
OR ( ' A' <= SUBSTR( PARTNO, 2, 1) AND SUBSTR( PARTNO, 2, 1) <= ' Z' ) )
AND ( ( ' 0' <= SUBSTR( PARTNO, 3, 1) AND SUBSTR( PARTNO, 3, 1) <= ' 9' )
OR ( ' a' <= SUBSTR( PARTNO, 3, 1) AND SUBSTR( PARTNO, 3, 1) <= ' z' )
OR ( ' A' <= SUBSTR( PARTNO, 3, 1) AND SUBSTR( PARTNO, 3, 1) <= ' Z' ) ) )
)
CREATE TABLE SUBPART (
PARTNO CHAR( 5) NOT NULL,
ASSEMBLYNO CHAR( 5) NOT NULL,
PRI MARY KEY ( PARTNO, ASSEMBLYNO) ,
FOREI GN KEY ( PARTNO) REFERENCES PART,
FOREI GN KEY ( ASSEMBLYNO) REFERENCES PART( PARTNO)
)
CREATE TABLE WAREHOUSE (
WAREHOUSEI D CHAR( 4) NOT NULL,
PRI MARY KEY ( WAREHOUSEI D) ,
CHECK ( ( ( ' a' <= SUBSTR( WAREHOUSEI D, 1, 1)
AND SUBSTR( WAREHOUSEI D, 1, 1) <= ' z' )
OR( ' A' <= SUBSTR( WAREHOUSEI D, 1, 1) AND SUBSTR( WAREHOUSEI D, 1, 1) <= ' Z' ) )
AND( ( ' a' <= SUBSTR( WAREHOUSEI D, 2, 1) AND SUBSTR( WAREHOUSEI D, 2, 1) <= ' z' )
OR ( ' A' <= SUBSTR( WAREHOUSEI D, 2, 1) AND SUBSTR( WAREHOUSEI D, 2, 1) <= ' Z' ) )
AND( ( ' a' <= SUBSTR( WAREHOUSEI D, 3, 1) AND SUBSTR( WAREHOUSEI D, 3, 1) <= ' z' )
OR ( ' A' <= SUBSTR( WAREHOUSEI D, 3, 1) AND SUBSTR( WAREHOUSEI D, 3, 1) <= ' Z' ) )
AND( ( ' a' <= SUBSTR( WAREHOUSEI D, 4, 1) AND SUBSTR( WAREHOUSEI D, 4, 1) <= ' z' )
OR( ' A' <= SUBSTR( WAREHOUSEI D, 4, 1) AND SUBSTR( WAREHOUSEI D, 4, 1) <= ' Z' ) ) )
)
CREATE TABLE BI N (
WAREHOUSEI D CHAR( 4) NOT NULL,
BI NNO I NTEGER NOT NULL,
CAPACI TY I NTEGER NOT NULL,
PRI MARY KEY ( WAREHOUSEI D, BI NNO) ,
FOREI GN KEY ( WAREHOUSEI D) REFERENCES WAREHOUSE,
CHECK ( BI NNO >= 0) ,
CHECK ( CAPACI TY >= 0)
)
CREATE TABLE BATCH (
PARTNO CHAR( 5) NOT NULL,
BATCHNO I NTEGER NOT NULL,
SI ZE I NTEGER NOT NULL,
DATE_I N DATE NOT NULL,
MANAGERNO CHAR( 6) NOT NULL,
WAREHOUSEI D CHAR( 4) NOT NULL,
Master Thesis Weiguang Zhang McMaster University- Computing and Software
103

BI NNO I NTEGER NOT NULL,


PRI MARY KEY ( PARTNO, BATCHNO) ,
FOREI GN KEY ( PARTNO) REFERENCES PART,
FOREI GN KEY ( MANAGERNO) REFERENCES MANAGER( EMPLOYEENO) ,
FOREI GN KEY ( WAREHOUSEI D, BI NNO) REFERENCES BI N,
CHECK ( BATCHNO >= 0) ,
CHECK ( SI ZE > 0)
)
CREATE TABLE I TEM (
PARTNO CHAR( 5) NOT NULL,
BATCHNO I NTEGER NOT NULL,
I TEMNO I NTEGER NOT NULL,
CHECKED_OUT CHAR( 6) ,
DATE_OUT DATE,
PRI MARY KEY ( PARTNO, BATCHNO, I TEMNO) ,
FOREI GN KEY ( PARTNO, BATCHNO) REFERENCES BATCH,
FOREI GN KEY ( CHECKED_OUT) REFERENCES EMPLOYEE( EMPLOYEENO) ,
CHECK ( I TEMNO >= 0)
)
CREATE TABLE CURRENT_BACKORDER (
PARTNO CHAR( 5) NOT NULL,
ORI G_QUANTI TY I NTEGER NOT NULL,
REMAI NI NG_QUANTI TY I NTEGER NOT NULL,
BO_DATE DATE NOT NULL,
BACKORDERED_BY CHAR( 6) NOT NULL,
PRI MARY KEY ( PARTNO) ,
FOREI GN KEY ( PARTNO) REFERENCES PART,
FOREI GN KEY ( BACKORDERED_BY) REFERENCES MANAGER( EMPLOYEENO) ,
CHECK ( ORI G_QUANTI TY > 0) ,
CHECK ( REMAI NI NG_QUANTI TY >= 0 AND REMAI NI NG_QUANTI TY <= ORI G_QUANTI TY)
)
CREATE TABLE OLD_BACKORDER (
PARTNO CHAR( 5) NOT NULL,
ORI G_QUANTI TY I NTEGER NOT NULL,
BO_DATE DATE NOT NULL,
BACKORDERED_BY CHAR( 6) NOT NULL,
FULFI LLED TI MESTAMP NOT NULL,
PRI MARY KEY ( PARTNO, BO_DATE, FULFI LLED) ,
FOREI GN KEY ( PARTNO) REFERENCES PART,
FOREI GN KEY ( BACKORDERED_BY) REFERENCES MANAGER( EMPLOYEENO) ,
CHECK ( DATE( FULFI LLED) >= BO_DATE)
)
12.5 Warehouse System Interactive Queries

Query 1: give all employee_no for all the workers that work under manager with the first
name Tony7 and the last name Tona7 with no middle name.

SELECT WORKER. EMPLOYEENO
FROM WORKER,
( SELECT MANAGER. EMPLOYEENO
Master Thesis Weiguang Zhang McMaster University- Computing and Software
104

FROM MANAGER, HASNAME


WHERE MANAGER. EMPLOYEENO=HASNAME. EMPLOYEENO
AND HASNAME. FI RST=' TONY7' AND HASNAME. MI DDLE I S NULL
AND HASNAME. LAST=' TONA7' ) AS T
WHERE WORKER. MANAGERNO=T. EMPLOYEENO

Query 2: give all the names and employee_no for all the workers the names should be
listed in an alphabetic order (by last, then by first, then by middle)

SELECT WORKER. EMPLOYEENO, FI RST, MI DDLE, LAST ROM WORKER, HASNAME
WHERE WORKER. EMPLOYEENO=HASNAME. EMPLOYEENO
ORDER BY LAST, FI RST, MI DDLE

Query 3: give all the phones and employee_no for all the managers.

SELECT MANAGER. EMPLOYEENO, AREA_CODE, NUMBER
FROM MANAGER, HASPHONE
WHERE MANAGER. EMPLOYEENO=HASPHONE. EMPLOYEENO

Query 4: list all parts that are assemblies they should be listed in a lexicographic order.

SELECT DI STI NCT ASSEMBLYNO FROM SUBPART ORDER BY ASSEMBLYNO

Query 5: for each manager, list all current backorders done by the manager.

SELECT MANAGER. EMPLOYEENO, PARTNO, ORI G_QUANTI TY, REMAI NI NG_QUANTI TY,
BO_DATE, BACKORDERED_BY
FROM MANAGER, CURRENT_BACKORDER
WHERE MANAGER. EMPLOYEENO=CURRENT_BACKORDER. BACKORDERED_BY

Query 6: For each manager, list all current and old backorders done by the manager. For
each backorder you have to list the part_no, backorder date, and fulfilled date.
For current backorders, list a phony fulfilled date '2000-01-01'.

( SELECT MANAGER. EMPLOYEENO, PARTNO, BO_DATE, ' 2000- 01- 01' AS FD
FROM MANAGER, CURRENT_BACKORDER
WHERE MANAGER. EMPLOYEENO=CURRENT_BACKORDER. BACKORDERED_BY
UNI ON
SELECT MANAGER. EMPLOYEENO, PARTNO, BO_DATE, DATE( FULFI LLED) AS FD
FROM MANAGER, OLD_BACKORDER
WHERE MANAGER. EMPLOYEENO=OLD_BACKORDER. BACKORDERED_BY
) ORDER BY EMPLOYEENO

Query 7: For each warehouse bin, give the remaining capacity of the bin. Call the
remaining capacity remaining_capacity.

SELECT T1. WAREHOUSEI D, T1. BI NNO, CAPACI TY- C AS REMAI NI NG_CAPACI TY
FROM ( SELECT WAREHOUSEI D, BI NNO, CAPACI TY FROM BI N) AS T1,
Master Thesis Weiguang Zhang McMaster University- Computing and Software
105

( SELECT BATCH. WAREHOUSEI D, BATCH. BI NNO, COUNT( I TEMNO) AS C


FROM I TEM, BATCH WHERE I TEM. PARTNO=BATCH. PARTNO
AND I TEM. BATCHNO=BATCH. BATCHNO
GROUP BY BATCH. WAREHOUSEI D, BATCH. BI NNO) AS T2
WHERE T1. WAREHOUSEI D=T2. WAREHOUSEI D AND T1. BI NNO=T2. BI NNO


Query 8: Give employee_no and number of workers managed for all the managers with
The smallest number of workers managed.

SELECT MANAGERNO, NUMBER_MANAGED
FROM ( SELECT MANAGERNO, COUNT( *) AS NUMBER_MANAGED
FROM WORKER GROUP BY MANAGERNO) AS T1
EXCEPT
SELECT T1. MANAGERNO, T1. NUMBER_MANAGED
FROM ( SELECT MANAGERNO, COUNT( *) AS NUMBER_MANAGED
FROM WORKER GROUP BY MANAGERNO) AS T1,
( SELECT MANAGERNO, COUNT( *) AS NUMBER_MANAGED
FROM WORKER GROUP BY MANAGERNO) AS T2
WHERE T1. NUMBER_MANAGED > T2. NUMBER_MANAGED

Master Thesis Weiguang Zhang McMaster University- Computing and Software
106

Conclusion and Future Work



In this thesis we presented a suite of ten projects designed for undergraduate students
taking a database course to practise certain aspects of dealing with relational databases.
Their main utility and our main objective was to provide projects that are not too simple
and that are not too complex, projects that would allow students to practise the most
important aspects of dealing with databases. To this end, each project takes a student
through four major aspects of dealing with databases:
Design of the database.
Implementation of the database.
SQL querying of the installed database.
Application programming.
Our projects address some of what we consider most important issues associated with
each of the four major aspects, and, of course, leave many other issues untouched.
In design, every project practises the ER/relational modeling in the context of
ERwin modeling tool.
In implementation, every project practises the creation of the DB2 schema derived
from the ER/relational model.
In SQL querying, in every project simple to moderately complex SQL queries are
practised in interactive form.
In application programming, C and embedded SQL are used. For pedagogical
reasons, queries that were first practiced in the interactive querying are used in the
application program to illustrate and highlight the differences and the similarities
of ESQL and SQL.
For the future work, Oracle and Microsoft SQL Server in addition to DB2 must be
included. One of the important omissions in the projects concerns normalization on the
level of ER/relational modeling and a problem related to, the intentional de-
normalization of the design for performance gains. This omission must be addressed in
the future work on this suite of projects. In order to allow more complex applications,
ESQL-based application programming in C++should be also considered for inclusion in
near future.

Master Thesis Weiguang Zhang McMaster University- Computing and Software
107

Bibliography

[1] E.F. Codd, A Relational Model of Data for Large Shared Data Banks,
Communications of ACM, Volume 13, Number 6, 1970, 377--387

[2] Pioneer calls relational database technology obsolete,
http://www.computerworlduk.com/news/applications/5059/pioneer-calls-relational-
database-technology-obsolete/

[3] Michael Stonebraker, The End of a DBMS Era (Might be Upon Us)
http://cacm.acm.org/blogs/blog-cacm/32212-the-end-of-a-dbms-era-might-be-upon-
us/fulltext
[4] Peter Pin-shan Chen, The Entity-Relationship Model: Toward a Unified View of
Data, ACM Transactions on Database Systems, Volume 1, 1976, 9--36



























Appendix to

A SUITE OF CASE STUDIES IN
RELATIONAL DATABASE DESIGN


M.Sc. thesis by WEIGUANG ZHANG


McMaster University, J anuary 2012
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software



Contents
Appendix 1: Airline Reservation Application Program ................................................. 2
Appendix 2: Movie Rental Application Program ......................................................... 14
Appendix 3: Car Rental Application program ............................................................. 24
Appendix 4: Course Registration Application program .............................................. 34
Appendix 5: Emergency Room Application program .................................................. 39
Appendix 6: Property Rental Application Program ..................................................... 47
Appendix 7: Software Project Application Program ................................................... 57
Appendix 8: Tour Operator System Application Program ......................................... 67
Appendix 9: Warehouse System Application Program ................................................ 84


Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

Appendix 1: Airline Reservation Application Program



Write a simple C program using embedded SQL. The program is to excute and display the results on the
screen in the same format as the DB2. It is to execute any of the ten queries listed in Section 4.5 based
on what action the user chooses, or all ten queries together. Assume the name of the database is
OURDB.

#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>
#i ncl ude <st r i ng. h>

EXEC SQL I NCLUDE SQLCA;

voi d quer y1( ) ;
voi d quer y2( ) ;
voi d quer y3( ) ;
voi d quer y4( ) ;
voi d quer y5( ) ;
voi d quer y6( ) ;
voi d quer y7( ) ;
voi d quer y8( ) ;
voi d quer y9( ) ;
voi d quer y10( ) ;
voi d do_al l ( ) ;

i nt connect ed=0;

voi d sql er r ( char * x) {
i f ( SQLCODE! =0) {
pr i nt f ( " er r or %s ( %d) \ n" , x, SQLCODE) ;
i f ( connect ed) {
EXEC SQL CONNECT RESET;
pr i nt f ( " di sconnect ed f r omOURDB\ n" ) ;
}
exi t ( 1) ;
}
}

voi d connect ( ) {
EXEC SQL CONNECT TO OURDB;
sql er r ( " CONNECT TO OURDB" ) ;
pr i nt f ( " Connect ed t o OURDB\ n" ) ;
connect ed = 1;
}

voi d di sconnect ( ) {
EXEC SQL CONNECT RESET;
sql er r ( " CONNECT RESET" ) ;
pr i nt f ( " Di sconnect ed f r omOURDB\ n" ) ;
connect ed = 0;
}

voi d depad( char * s) {
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

i nt i ;
i =st r l en( s) - 1;
whi l e( s[ i ] ==' ' ) s[ i - - ] =' \ 0' ;
}

char buf f er [ 300] ;

i nt mai n( ) {
i nt i , j ;
connect ( ) ;

whi l e( 1) {
A: pr i nt f ( " ent er number of quer y you want t o execut e "
" ( 1- 10) , \ n 0 t o qui t , anyt hi ng el se al l quer i es\ n" ) ;
f get s( buf f er , 300, st di n) ;
i f ( buf f er [ 0] ==' \ n' ) {
pr i nt f ( " not hi ng ent er ed\ n" ) ;
cont i nue;
}
i =j =0;
whi l e( buf f er [ j ] ! =' \ n' ) {
i f ( buf f er [ j ] >=' 0' && buf f er [ j ] <=' 9' )
i = 10*i +buf f er [ j ] - ' 0' ;
el se{
pr i nt f ( " i ncor r ect ent r y\ n" ) ;
got o A;
}
j ++;
}

i f ( i == 0) br eak;
el se i f ( i == 1) quer y1( ) ;
el se i f ( i == 2) quer y2( ) ;
el se i f ( i == 3) quer y3( ) ;
el se i f ( i == 4) quer y4( ) ;
el se i f ( i == 5) quer y5( ) ;
el se i f ( i == 6) quer y6( ) ;
el se i f ( i == 7) quer y7( ) ;
el se i f ( i == 8) quer y8( ) ;
el se i f ( i == 9) quer y9( ) ;
el se i f ( i == 10) quer y10( ) ;
el se {
do_al l ( ) ;
br eak;
}
}

di sconnect ( ) ;
r et ur n 0;

}

i nt count , l en, l en1;
char buf 1[ 80] ;

EXEC SQL BEGI N DECLARE SECTI ON;
sql i nt 32 cust omer _i d;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

char f r om_cur r ency[ 3] ;


char t o_cur r ency3[ 3] ;
doubl e exchange_r at e;
char f l i ght _no[ 10] ;
char or i gi n[ 3] ;
char dest i nat i on[ 3] ;
char depar t ur e_t i me[ 30] ;
char ar r i val _t i me[ 30] ;
char f i r st _name[ 20] ;
char l ast _name[ 20] ;
char phone_no[ 20] ;
char emai l [ 50] ;
sql i nt 32 booki ng_no;
char cl ass[ 10] ;
char st at us[ 10] ;
char booki ng_ci t y[ 30] ;
char ci t y[ 30] ;
doubl e t ot al _pr i ce;
doubl e t ot al _payment ;
doubl e t ot al _bal ance;
doubl e f l i ght _pr i ce;
doubl e pr evi ous_t ot al _pr i ce;
doubl e new_t ot al _pr i ce;
sql i nt 32 number _of _booki ngs;
sql i nt 32 number _of _emai l s;
sql i nt 32 number _of _phones;
sql i nt 32 number _of _f axs;
EXEC SQL END DECLARE SECTI ON;

voi d quer y1( ) {
pr i nt f ( " di spl ayi ng r esul t of quer y 1\ n" ) ;
EXEC SQL DECLARE cur 1 CURSOR FOR
SELECT CUSTI D AS CUSTOMER_I D
FROM CUSTOMER
WHERE COUNTRY = ' Canada'
ORDER BY CUSTI D;
sql er r ( " OPEN cur 1" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 1 I NTO : cust omer _i d;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " CUSTOMER_I D\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( cust omer _i d) ;
pr i nt f ( " %s\ n" , cust omer _i d) ;
count ++;
}

EXEC SQL CLOSE cur 1;
sql er r ( " CLOSE cur 1" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

voi d quer y2( ) {


pr i nt f ( " di spl ayi ng r esul t of quer y 2\ n" ) ;
EXEC SQL DECLARE cur 2 CURSOR FOR
SELECT DI STI NCT CUSTI D AS CUSTOMER_I D
FROM BOOKI NG;

sql er r ( " DECLARE cur 2" ) ;

EXEC SQL OPEN cur 2;
sql er r ( " OPEN cur 2" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 2 I NTO : cust omer _i d;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " CUSTOMER_I D\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( cust omer _i d) ;
pr i nt f ( " %s\ n" , cust omer _i d) ;
count ++;
}

EXEC SQL CLOSE cur 2;
sql er r ( " CLOSE cur 2" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y3( ) {
pr i nt f ( " di spl ayi ng r esul t of quer y 3\ n" ) ;
EXEC SQL DECLARE cur 3 CURSOR FOR
SELECT FCURR AS FROM_CURRENCY, TCURR AS TO_CURRENCY, EXCHRATE AS EXCHANGE_RATE
FROM CURRENCY
WHERE EXCHRATE > 1
ORDER BY FCURR, TCURR;
sql er r ( " DECLARE cur 3" ) ;

EXEC SQL OPEN cur 3;
sql er r ( " OPEN cur 3" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 3 I NTO : f r om_cur r ency,
: t o_cur r ency,
: exchange_r at e;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " FROM_CURRENCY TO_CURRENCY EXCHANGE_RATE\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( f r om_cur r ency) ;
spr i nt f ( buf f er , " %s" , f r om_cur r ency) ;

f or ( l en=st r l en( buf f er ) ; l en < 12; l en++) st r cat ( buf f er , " " ) ;
depad( t o_cur r ency) ;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

spr i nt f ( buf f er +l en, " %s" , t o_cur r ency) ;



f or ( l en=st r l en( buf f er ) ; l en < 22; l en++) st r cat ( buf f er , " " ) ;
depad( exchange_r at e) ;
spr i nt f ( buf f er +l en, " %s" , exchange_r at e) ;

pr i nt f ( " %s\ n" , buf f er ) ;
count ++;
}

EXEC SQL CLOSE cur 3;
sql er r ( " CLOSE cur 3" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y4( ) {
i nt i ;
pr i nt f ( " di spl ayi ng r esul t of quer y 4\ n" ) ;
EXEC SQL DECLARE cur 4 CURSOR FOR
SELECT FNO AS FLI GHT_NO, ORI G AS ORI GI N, DEST AS DESTI NATI ON,
DEPTTI ME AS DEPATURE_TTI ME, ARRTI ME AS ARRI VAL_TI ME
FROM FLI GHT_AVAI LABI LI TY
WHERE ORI G = ' YYZ' AND DEST = ' J FK'
OR ORI G = ' J FK' AND DEST = ' YYZ'
ORDER BY FNO;
sql er r ( " DECLARE cur 4" ) ;

EXEC SQL OPEN cur 4;
sql er r ( " OPEN cur 4" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 4 I NTO : f l i ght _no,
: or i gi n,
: dest i nat i on,
: depar t ur e_t i me,
: ar r i val _t i me;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " FLI GHT_NO ORI GI N DESTI NATI ON DEPARTURE_TI ME ARRI VAL_TI ME\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- \ n" ) ;
}
depad( f l i ght _no) ;
spr i nt f ( buf f er , " %s" , f l i ght _no) ;

f or ( l en=st r l en( buf f er ) ; l en < 12; l en++) st r cat ( buf f er , " " ) ;
depad( or i gi n) ;
spr i nt f ( buf f er +l en, " %s" , or i gi n) ;

f or ( l en=st r l en( buf f er ) ; l en < 18; l en++) st r cat ( buf f er , " " ) ;
depad( dest i nat i on) ;
spr i nt f ( buf f er +l en, " %s" , dest i nat i on) ;

f or ( l en=st r l en( buf f er ) ; l en < 29; l en++) st r cat ( buf f er , " " ) ;
depad( depar t ur e_t i me) ;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

spr i nt f ( buf f er +l en, " %s" , depar t ur e_t i me) ;



f or ( l en=st r l en( buf f er ) ; l en < 35; l en++) st r cat ( buf f er , " " ) ;
depad( ar r i val _t i me) ;
spr i nt f ( buf f er +l en, " %s" , ar r i val _t i me) ;

pr i nt f ( " %s\ n" , buf f er ) ;
count ++;
}

EXEC SQL CLOSE cur 4;
sql er r ( " CLOSE cur 4" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y5( ) {
pr i nt f ( " di spl ayi ng r esul t of quer y 5\ n" ) ;
EXEC SQL DECLARE cur 5 CURSOR FOR
SELECT CUSTI D AS CUSTOMER_I D
FROM CUSTOMER
WHERE CUSTI D NOT I N ( SELECT DI STI NCT CUSTI D FROM BOOKI NG)
ORDER BY CUSTI D;
sql er r ( " DECLARE cur 5" ) ;

EXEC SQL OPEN cur 5;
sql er r ( " OPEN cur 5" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 5 I NTO : cust omer _i d;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " cust omer _i d\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( cust omer _i d) ;
pr i nt f ( " %s\ n" , cust omer _i d) ;
count ++;
}

EXEC SQL CLOSE cur 5;
sql er r ( " CLOSE cur 5" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y6( ) {
i nt i ;
pr i nt f ( " di spl ayi ng r esul t of quer y 6\ n" ) ;
EXEC SQL DECLARE cur 6 CURSOR FOR
SELECT C. CUSTI D AS CUSTOMER_I D, C. FNAME AS FI RST_NAME, C. LNAME AS LAST_NAME,
P. PCRTYCODE | | ' - ' | | P. PAREACODE | | ' - ' | | P. PNUMBER AS PHONE_NO,
E. EMAI L AS EMAI L
FROM CUSTOMER C
RI GHT J OI N PHONE P ON C. CUSTI D = P. CUSTI D
RI GHT J OI N EMAI L E ON C. CUSTI D = E. CUSTI D
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

ORDER BY C. CUSTI D;
sql er r ( " DECLARE cur 6" ) ;

EXEC SQL OPEN cur 6;
sql er r ( " OPEN cur 6" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 6 I NTO : cust omer _i d,
: f i r st _name,
: l ast _name,
: phone_no,
: emai l ;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " CUSTOMER_I D FI RST_NAME LAST_NAME PHONE_NO EMAI L\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( cust omer _i d) ;
spr i nt f ( buf f er , " %s" , cust omer _i d) ;

f or ( l en=st r l en( buf f er ) ; l en < 12; l en++) st r cat ( buf f er , " " ) ;
depad( f i r st _name) ;
spr i nt f ( buf f er +l en, " %s" , f i r st _name) ;

f or ( l en=st r l en( buf f er ) ; l en < 22; l en++) st r cat ( buf f er , " " ) ;
depad( l ast _name) ;
spr i nt f ( buf f er +l en, " %s" , l ast _name) ;

f or ( l en=st r l en( buf f er ) ; l en < 32; l en++) st r cat ( buf f er , " " ) ;
depad( phone_no) ;
spr i nt f ( buf f er +l en, " %s" , phone_no) ;

f or ( l en=st r l en( buf f er ) ; l en < 42; l en++) st r cat ( buf f er , " " ) ;
depad( emai l ) ;
spr i nt f ( buf f er +l en, " %s" , emai l ) ;

pr i nt f ( " %s\ n" , buf f er ) ;
count ++;
}

EXEC SQL CLOSE cur 6;
sql er r ( " CLOSE cur 6" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y7( ) {
i nt i ;
pr i nt f ( " di spl ayi ng r esul t of quer y 7\ n" ) ;
EXEC SQL DECLARE cur 7 CURSOR FOR
SELECT BKGNO AS BOOKI NG_NO, CUSTI D AS CUSTOMER_I D, FNO AS FLI GHT_NO,
ORI G AS ORI GI N, DEST AS DESTI NATI ON, C. CLASS AS CLASS,
S. STATUS AS STATUS, CI TY. CI TYNM AS BOOKI NG_CI TY
FROM BOOKI NG B
I NNER J OI N STATUS S ON B. STATUSI D = S. STATUSI D
I NNER J OI N CLASS C ON B. CLASSI D = C. CLASSI D
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

I NNER J OI N CI TY ON B. BKGCI TY = CI TY. CI TYI D


WHERE S. STATUS = ' Cancel ed'
ORDER BY BKGNO, CUSTI D, FNO;
sql er r ( " DECLARE cur 7" ) ;

EXEC SQL OPEN cur 7;
sql er r ( " OPEN cur 7" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 7 I NTO : booki ng_no,
: cust omer _i d,
: f l i ght _no,
: or i gi n,
: dest i nat i on,
: cl ass,
: st at us,
: booki ng_ci t y;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " BOOKI NG_NO CUSTOMER_I D FLI GHT_NO ORI GI N DESTI NATI ON CLASS
STATUS BOOKI NG_CI TY\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( f l i ght _no) ;
depad( or i gi n) ;
depad( dest i nat i on) ;
depad( cl ass) ;
depad( st at us) ;
depad( booki ng_ci t y) ;

spr i nt f ( buf 1, " %d" , booki ng_no) ;
f or ( l en1=st r l en( buf 1) ; l en1 < 11; l en1++, l en++) st r cat ( buf f er , " " ) ;
spr i nt f ( buf 2, " %d" , cust omer _i d) ;
f or ( l en1=st r l en( buf 2) ; l en1 < 22; l en1++, l en++) st r cat ( buf f er , " " ) ;
spr i nt f ( buf f er +l en, " %s" , f l i ght _no) ;
f or ( l en=st r l en( buf f er ) ; l en < 32; l en++) st r cat ( buf f er , " " ) ;
spr i nt f ( buf f er +l en, " %s" , or i gi n) ;
f or ( l en=st r l en( buf f er ) ; l en < 42; l en++) st r cat ( buf f er , " " ) ;
spr i nt f ( buf f er +l en, " %s" , dest i nat i on) ;
f or ( l en=st r l en( buf f er ) ; l en < 52; l en++) st r cat ( buf f er , " " ) ;
spr i nt f ( buf f er +l en, " %s" , cl ass) ;
f or ( l en=st r l en( buf f er ) ; l en < 62; l en++) st r cat ( buf f er , " " ) ;
spr i nt f ( buf f er +l en, " %s" , st at us) ;
f or ( l en=st r l en( buf f er ) ; l en < 72; l en++) st r cat ( buf f er , " " ) ;
spr i nt f ( buf f er +l en, " %s" , booki ng_ci t y) ;

pr i nt f ( " %s\ n" , buf f er ) ;
count ++;
}
}

EXEC SQL CLOSE cur 7;
sql er r ( " CLOSE cur 7" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

10

}

voi d quer y8( ) {
i nt i ;
pr i nt f ( " di spl ayi ng r esul t of quer y 8\ n" ) ;
EXEC SQL DECLARE cur 8 CURSOR FOR

SELECT C. CI TYNM AS CI TY, SUM( TOTPRI CE) AS TOTAL_PRI CE,
SUM( PAI DAMT) AS TOTAL_PAYMENT, SUM( BAL) AS TOTAL_BALANCE
FROM BOOKI NG B
I NNER J OI N CI TY C ON B. BKGCI TY = C. CI TYI D
WHERE STATUSI D <> 2
GROUP BY C. CI TYNM
ORDER BY C. CI TYNM;
sql er r ( " DECLARE cur 8" ) ;

EXEC SQL OPEN cur 8;
sql er r ( " OPEN cur 8" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 8 I NTO : ci t y,
: t ot al _pr i ce,
: t ot al _payment ,
: t ot al _bal ance;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " CI TY TOTAL_PRI CE TOTAL_PAYMENT TOTAL_BALANCE\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( ci t y) ;

pr i nt f ( " %s" , ci t y) ;
f or ( l en=st r l en( buf f er ) ; l en < 15; l en++) st r cat ( buf f er , " " ) ;
spr i nt f ( buf 1, " %d" , t ot al _pr i ce) ;
f or ( l en1=st r l en( buf 1) ; l en1 10; l en1++, l en++) st r cat ( buf f er , " " ) ;
spr i nt f ( buf 2, " %d" , t ot al _payment ) ;
f or ( l en2=st r l en( buf 2) ; l en2 10; l en2++, l en++) st r cat ( buf f er , " " ) ;
spr i nt f ( buf 3, " %d" , t ot al _bal ance) ;
f or ( l en3=st r l en( buf 3) ; l en3 10; l en3++, l en++) st r cat ( buf f er , " " ) ;
pr i nt f ( " %s\ n" , buf f er ) ;
count ++;
}

EXEC SQL CLOSE cur 8;
sql er r ( " CLOSE cur 8" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y9( ) {
i nt i ;
pr i nt f ( " di spl ayi ng r esul t of quer y 9\ n" ) ;
EXEC SQL DECLARE cur 9 CURSOR FOR
SELECT BKGNO AS BOOKI NG_NO, ORI G AS ORI GI N, DEST AS DESTI NATI ON,
FPRI CE AS FLI GHT_PRI CE,
TOTPRI CE AS PREVI OUS_TOTAL_PRI CE,
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

11

FPRI CE * ( 1 + ( O. AI RPORTTAX + 0. 01) + ( D. AI RPORTTAX - 0. 005) ) AS


NEW_TOTAL_PRI CE
FROM BOOKI NG B
I NNER J OI N AI RPORT O ON B. ORI G = O. AI RPORTCD
I NNER J OI N AI RPORT D ON B. DEST = D. AI RPORTCD;

sql er r ( " DECLARE cur 9" ) ;

EXEC SQL OPEN cur 9;
sql er r ( " OPEN cur 9" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 9 I NTO : booki ng_no,
: or i gi n,
: dest i nat i on,
: f l i ght _pr i ce,
: pr evi ous_t ot al _pr i ce,
: new_t ot al _pr i ce;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " BOOKI NG_NO ORI GI N DESTI NATI ON FLI GHT_PRI CE
PREVI OUS_TOTAL_PRI CE NEW_TOTAL_PRI CE\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( or i gi n) ;
depad( dest i nat i on) ;

spr i nt f ( buf f er , " %d" , booki ng_no) ;
whi l e( st r l en( buf f er ) <10) st r cat ( buf f er , " " ) ;
st r cat ( buf f er , or i gi n) ;
whi l e( st r l en( buf f er ) <20) st r cat ( buf f er , " " ) ;
st r cat ( buf f er , dest i nat i on) ;
whi l e( st r l en( buf f er ) <30) st r cat ( buf f er , " " ) ;
spr i nt f ( buf f er , " %d" , f l i ght _pr i ce) ;
whi l e( st r l en( buf f er ) <40) st r cat ( buf f er , " " ) ;
spr i nt f ( buf f er , " %d" , pr evi ous_t ot al _pr i ce) ;
whi l e( st r l en( buf f er ) <50) st r cat ( buf f er , " " ) ;
spr i nt f ( buf f er , " %d" , new_t ot al _pr i ce) ;

pr i nt f ( " %s\ n" , t ype_of _cust omer ) ;
count ++;
}

EXEC SQL CLOSE cur 9;
sql er r ( " CLOSE cur 9" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y10( ) {
i nt i ;
pr i nt f ( " di spl ayi ng r esul t of quer y 10\ n" ) ;
EXEC SQL DECLARE cur 10 CURSOR FOR
SELECT C. CUSTI D AS CUSTOMER_I D,
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

12

( SELECT COUNT( CUSTI D) FROM BOOKI NG WHERE CUSTI D=C. CUSTI D) AS


NUMBER_OF_BOOKI NGS,
( SELECT COUNT( CUSTI D) FROM EMAI L WHERE CUSTI D=C. CUSTI D) AS
NUMBER_OF_EMAI LS,
( SELECT COUNT( CUSTI D) FROM PHONE WHERE CUSTI D=C. CUSTI D) AS
NUMBER_OF_PHONES,
( SELECT COUNT( CUSTI D) FROM FAX WHERE CUSTI D=C. CUSTI D) AS
NUMBER_OF_FAXS
FROM CUSTOMER C

sql er r ( " DECLARE cur 10" ) ;

EXEC SQL OPEN cur 10;
sql er r ( " OPEN cur 10" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 10 I NTO : cust omer _i d,
: number _of _booki ngs,
: number _of _emai l s,
: number _of _phones,
: number _of _f axs;

i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " CUSTOMER_I D NBR_OF_BOOKI NGS NBR_OF_EMAI LS NBR_OF_PHONES
NBR_OF_FAXS\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - \ n" ) ;
}

spr i nt f ( buf f er , " %d" , cust omer _i d) ;
whi l e( st r l en( buf f er ) <10) st r cat ( buf f er , " " ) ;
spr i nt f ( buf f er , " %d" , number _of _booki ngs) ;
whi l e( st r l en( buf f er ) <20) st r cat ( buf f er , " " ) ;
spr i nt f ( buf f er , " %d" , number _of _emai l s) ;
whi l e( st r l en( buf f er ) <30) st r cat ( buf f er , " " ) ;
spr i nt f ( buf f er , " %d" , number _of _phones) ;
whi l e( st r l en( buf f er ) <40) st r cat ( buf f er , " " ) ;
spr i nt f ( buf f er , " %d" , number _of _f axs) ;

pr i nt f ( " %s\ n" , t ype_of _cust omer ) ;
count ++;
}

EXEC SQL CLOSE cur 10;
sql er r ( " CLOSE cur 10" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d do_al l ( ) {
quer y1( ) ;
quer y2( ) ;
quer y3( ) ;
quer y4( ) ;
quer y5( ) ;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

13

quer y6( ) ;
quer y7( ) ;
quer y8( ) ;
quer y9( ) ;
quer y10( ) ;
}
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

14

Appendix 2: Movie Rental Application Program



Write a simple C program using embedded SQL. The program is to excute and display the results on the
screen in the same format as DB2. It is to execute any of the ten queries listed in Section 5.5 based on
what action the user chooses, or all ten queries together. Assume the name of the database is OURDB.

#i ncl ude <st di o. h>


#i ncl ude <st dl i b. h>
#i ncl ude <st r i ng. h>

EXEC SQL I NCLUDE SQLCA;

voi d quer y1( ) ;
voi d quer y2( ) ;
voi d quer y3( ) ;
voi d quer y4( ) ;
voi d quer y5( ) ;
voi d quer y6( ) ;
voi d quer y7( ) ;
voi d quer y8( ) ;
voi d quer y9( ) ;
voi d quer y10( ) ;
voi d do_al l ( ) ;

i nt connect ed=0;
voi d sql er r ( char * x) {
i f ( SQLCODE! =0) {
pr i nt f ( " er r or %s ( %d) \ n" , x, SQLCODE) ;
i f ( connect ed) {
EXEC SQL CONNECT RESET;
pr i nt f ( " di sconnect ed f r omOURDB\ n" ) ;
}
exi t ( 1) ;
}
}

voi d connect ( ) {
EXEC SQL CONNECT TO OURDB;
sql er r ( " CONNECT TO OURDB" ) ;
pr i nt f ( " Connect ed t o OURDB\ n" ) ;
connect ed = 1;
}

voi d di sconnect ( ) {
EXEC SQL CONNECT RESET;
sql er r ( " CONNECT RESET" ) ;
pr i nt f ( " Di sconnect ed f r omOURDB\ n" ) ;
connect ed = 0;
}

voi d depad( char * s) {
i nt i ;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

15

i =st r l en( s) - 1;
whi l e( s[ i ] ==' ' ) s[ i - - ] =' \ 0' ;
}

char buf f er [ 300] ;

i nt mai n( ) {
i nt i , j ;
connect ( ) ;

whi l e( 1) {
A: pr i nt f ( " ent er number of quer y you want t o execut e "
" ( 1- 10) , \ n0 t o qui t , anyt hi ng el se al l quer i es\ n" ) ;
f get s( buf f er , 300, st di n) ;
i f ( buf f er [ 0] ==' \ n' ) {
pr i nt f ( " not hi ng ent er ed\ n" ) ;
cont i nue;
}
i =j =0;
whi l e( buf f er [ j ] ! =' \ n' ) {
i f ( buf f er [ j ] >=' 0' && buf f er [ j ] <=' 9' )
i = 10*i +buf f er [ j ] - ' 0' ;
el se{
pr i nt f ( " i ncor r ect ent r y\ n" ) ;
got o A;
}
j ++;
}
i f ( i == 0) br eak;
el se i f ( i == 1) quer y1( ) ;
el se i f ( i == 2) quer y2( ) ;
el se i f ( i == 3) quer y3( ) ;
el se i f ( i == 4) quer y4( ) ;
el se i f ( i == 5) quer y5( ) ;
el se i f ( i == 6) quer y6( ) ;
el se i f ( i == 7) quer y7( ) ;
el se i f ( i == 8) quer y8( ) ;
el se i f ( i == 9) quer y9( ) ;
el se i f ( i == 10) quer y10( ) ;
el se {
do_al l ( ) ;
br eak;
}
}

di sconnect ( ) ;
r et ur n 0;
}

i nt count , l en, l en1;
char buf 1[ 80] ;

EXEC SQL BEGI N DECLARE SECTI ON;
sql i nt 32 cust omer _i d;
char cust omer _name[ 20] ;
char empl oyee_SI N[ 9] ;
doubl e t ot al _amount ;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

16

sql i nt 32 st or e_i d;
sql i nt 32 movi e_r ent ed;
sql i nt 32 movi e_i d;
sql i nt 32 t ape_i d;
char payment _t ype[ 10] ;
doubl e t ot al _amount ;
sql i nt 16 r at i ng;
sql i nt 16 number _of _movi es;
char movi e_t i t l e[ 20] ;
char r ent al _st at us[ 20] ;
doubl e r ent al _r at e;
char r ent al _empl oyee[ 20] ;
char cashi er _empl oyee[ 20] ;
char payment _st at us[ 20] ;
char manager _name[ 20] ;
char empl oyee_name[ 20] ;
EXEC SQL END DECLARE SECTI ON;

voi d quer y1( ) {
pr i nt f ( " di spl ayi ng r esul t of quer y 1\ n" ) ;
EXEC SQL DECLARE cur 1 CURSOR FOR
SELECT CUSTI D AS CUSTOMER_I D, CUSTNM AS CUSTOMER_NAME
FROM CUSTOMER
WHERE CUSTCI TY=' Hami l t on' ;
sql er r ( " OPEN cur 1" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 1 I NTO : cust omer _i d,
: cust omer _name;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " CUSTOMER_I D CUSTOMER_NAME\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( cust omer _name) ;
spr i nt f ( buf f er , " %d" , cust omer _i d) ;
whi l e( st r l en( buf f er ) <15) st r cat ( buf f er , " " ) ;
st r cat ( buf f er , cust omer _name) ;
count ++;
}

EXEC SQL CLOSE cur 1;
sql er r ( " CLOSE cur 1" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y2( ) {
pr i nt f ( " di spl ayi ng r esul t of quer y 2\ n" ) ;
EXEC SQL DECLARE cur 2 CURSOR FOR
SELECT EMPSI N AS EMPLOYEE_SI N, SUM( AMT) AS TOTAL_AMT
FROM PAYMENT
GROUP BY EMPSI N
ORDER BY EMPSI N;
EXEC SQL OPEN cur 2;
sql er r ( " OPEN cur 2" ) ;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

17


count =0;
whi l e( 1) {
EXEC SQL FETCH cur 2 I NTO : empl oyee_SI N,
: t ot al _amount ;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " EMPLOYEE_SI N TOTAL_AMT\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( empl oyee_SI N) ;
spr i nt f ( buf f er , " %s" , empl oyee_SI N) ;
whi l e( st r l en( buf f er ) <15) st r cat ( buf f er , " " ) ;
pr i nt f ( " %d\ n" , t ot al _amount ) ;
count ++;
}

EXEC SQL CLOSE cur 2;
sql er r ( " CLOSE cur 2" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y3( ) {
pr i nt f ( " di spl ayi ng r esul t of quer y 3\ n" ) ;
EXEC SQL DECLARE cur 3 CURSOR FOR
SELECT STOREI D, COUNT( TAPEI D) AS MOVI E_RENTED
FROM MOVI E_RENTAL
GROUP BY STOREI D
ORDER BY STOREI D;
sql er r ( " DECLARE cur 3" ) ;

EXEC SQL OPEN cur 3;
sql er r ( " OPEN cur 3" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 3 I NTO : st or e_i d,
: movi e_r ent ed;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " STORE_I D MOVI E_RENTED\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
spr i nt f ( buf f er , " %d" , st or e_i d) ;
whi l e( st r l en( buf f er ) <11) st r cat ( buf f er , " " ) ;
pr i nt f ( " %d\ n" , movi e_r ent ed) ;
count ++;
}

EXEC SQL CLOSE cur 3;
sql er r ( " CLOSE cur 3" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y4( ) {
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

18

i nt i ;
pr i nt f ( " di spl ayi ng r esul t of quer y 4\ n" ) ;
EXEC SQL DECLARE cur 4 CURSOR FOR
SELECT DI STI NCT T. MOVI EI D, T. TAPEI D
FROM TAPE T
LEFT J OI N MOVI E_RENTAL R
ON T. MOVI EI D=R. MOVI EI D
AND T. TAPEI D=R. TAPEI D
WHERE R. MOVI EI D I S NULL
ORDER BY T. MOVI EI D, T. TAPEI D;
sql er r ( " DECLARE cur 4" ) ;

EXEC SQL OPEN cur 4;
sql er r ( " OPEN cur 4" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 4 I NTO : movi e_i d,
: t ape_i d;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " MOVI E_I D TAPE_I D\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
spr i nt f ( buf f er , " %d" , movi e_i d) ;
whi l e( st r l en( buf f er ) <11) st r cat ( buf f er , " " ) ;
pr i nt f ( " %d\ n" , t ape_i d) ;
count ++;
}

EXEC SQL CLOSE cur 4;
sql er r ( " CLOSE cur 4" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y5( ) {
pr i nt f ( " di spl ayi ng r esul t of quer y 5\ n" ) ;
EXEC SQL DECLARE cur 5 CURSOR FOR
SELECT CUSTI D, CUSTNM
FROM CUSTOMER
WHERE CUSTI D NOT I N ( SELECT DI STI NCT CUSTI D FROM MOVI E_RENTAL)
ORDER BY CUSTI D;
sql er r ( " DECLARE cur 5" ) ;

EXEC SQL OPEN cur 5;
sql er r ( " OPEN cur 5" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 5 I NTO : cust omer _i d,
: cust omer _name;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " CUSTOMER_I D CUSTOMER_NAME\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

19

depad( cust omer _name) ;


spr i nt f ( buf f er , " %d" , cust omer _i d) ;
whi l e( st r l en( buf f er ) <15) st r cat ( buf f er , " " ) ;
st r cat ( buf f er , cust omer _name) ;
count ++;
}

EXEC SQL CLOSE cur 5;
sql er r ( " CLOSE cur 5" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y6( ) {
i nt i ;
pr i nt f ( " di spl ayi ng r esul t of quer y 6\ n" ) ;
EXEC SQL DECLARE cur 6 CURSOR FOR
SELECT TP. PTDESC AS PAYMENT_TYPE, SUM( AMT) AS TOTAL_AMT
FROM PAYMENT P
I NNER J OI N PAYMENT_TYPE TP ON P. PTI D = TP. PTI D
GROUP BY TP. PTDESC
ORDER BY TP. PTDESC;
sql er r ( " DECLARE cur 6" ) ;

EXEC SQL OPEN cur 6;
sql er r ( " OPEN cur 6" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 6 I NTO : payment _t ype,
: t ot al _amount ;

i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " PAYMENT_TYPE TOTAL_AMT\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( payment _t ype) ;
pr i nt f ( " %s" , payment _t ype) ;
f or ( i = st r l en( payment _t ype) ; i <15; put char ( ' ' ) , i ++) ;
pr i nt f ( " %d" , t ot al _amount ) ;
count ++;
}

EXEC SQL CLOSE cur 6;
sql er r ( " CLOSE cur 6" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y7( ) {
i nt i ;
pr i nt f ( " di spl ayi ng r esul t of quer y 7\ n" ) ;
EXEC SQL DECLARE cur 7 CURSOR FOR
SELECT M. RATI NG, COUNT( MR. MOVI EI D) AS NO_OF_MOVI ES
FROM MOVI E_RENTAL MR
I NNER J OI N MOVI E M ON MR. MOVI EI D = M. MOVI EI D
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

20

GROUP BY M. RATI NG;


sql er r ( " DECLARE cur 7" ) ;

EXEC SQL OPEN cur 7;
sql er r ( " OPEN cur 7" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 7 I NTO : r at i ng,
: number _of _movi es;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " RATI NG NO_OF_MOVI ES\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
spr i nt f ( buf f er , " %d" , r at i ng) ;
whi l e( st r l en( buf f er ) <9) st r cat ( buf f er , " " ) ;
pr i nt f ( " %d\ n" , number _of _movi es) ;
count ++;

}

EXEC SQL CLOSE cur 7;
sql er r ( " CLOSE cur 7" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y8( ) {
i nt i ;
pr i nt f ( " di spl ayi ng r esul t of quer y 8\ n" ) ;
EXEC SQL DECLARE cur 8 CURSOR FOR
SELECT CUSTI D, SUM( AMT) AS TOTAL_AMT
FROM PAYMENT
GROUP BY CUSTI D
ORDER BY TOTAL_AMT DESC
FETCH FI RST 5 ROWS ONLY;
sql er r ( " DECLARE cur 8" ) ;

EXEC SQL OPEN cur 8;
sql er r ( " OPEN cur 8" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 8 I NTO : cust omer _i d,
: t ot al _amount ;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " CUSTOMER_I D TOTAL_AMT\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
spr i nt f ( buf f er , " %d" , cust omer _i d) ;
whi l e( st r l en( buf f er ) <14) st r cat ( buf f er , " " ) ;
pr i nt f ( " %d\ n" , t ot al _amount ) ;
count ++;

}
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

21


EXEC SQL CLOSE cur 8;
sql er r ( " CLOSE cur 8" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y9( ) {
i nt i ;

pr i nt f ( " di spl ayi ng r esul t of quer y 9\ n" ) ;
EXEC SQL DECLARE cur 9 CURSOR FOR
SELECT M. MOVI ETI TL AS MOVI E_TI TLE,
RS. RDESC AS RENTAL_STATUS,
MR. RRATE AS RENTAL_RATE,
E1. EMPNM AS RENTAL_EMPLOYEE,
E2. EMPNM AS CASHI ER_EMPLOYEE,
PT. PTDESC AS PAYMENT_TYPE,
PS. PDESC AS PAYMENT_STATUS
FROM MOVI E_RENTAL MR
I NNER J OI N CUSTOMER C ON MR. CUSTI D = C. CUSTI D
I NNER J OI N MOVI E M ON MR. MOVI EI D = M. MOVI EI D
I NNER J OI N RENTAL_STATUS RS ON MR. RSTATUSI D = RS. RSTATUSI D
I NNER J OI N EMPLOYEE E1 ON MR. EMPSI N = E1. EMPSI N
LEFT J OI N PAYMENT P ON MR. PAYI D = P. PAYI D
LEFT J OI N EMPLOYEE E2 ON P. EMPSI N = E2. EMPSI N
LEFT J OI N PAYMENT_STATUS PS ON P. PSTATUSI D = PS. PSTATUSI D
LEFT J OI N PAYMENT_TYPE PT ON P. PTI D = PT. PTI D
WHERE C. CUSTNM = ' cust omer 1' ;

sql er r ( " DECLARE cur 9" ) ;

EXEC SQL OPEN cur 9;
sql er r ( " OPEN cur 9" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 9 I NTO : movi e_t i t l e,
: r ent al _st at us,
: r ent al _r at e,
: r ent al _empl oyee,
: cashi er _empl oyee,
: payment _t ype,
: payment _st at us;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " MOVI E_TI TLE RENTAL_STATUS RENTAL_RATE RENTAL_EMP CASHI ER_EMP
PAYMENT_TYPE pAYMENT_STATUS \ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( movi e_t i t l e) ;
depad( r ent al _st at us) ;
depad( r ent al _empl oyee) ;
depad( cashi er _empl oyee) ;
depad( payment _t ype) ;
depad( payment _st at us) ;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

22


pr i nt f ( " %s" , movi e_t i t l e) ;
f or ( i = st r l en( movi e_t i t l e) ; i <12; put char ( ' ' ) , i ++) ;
pr i nt f ( " %s\ n" , r ent al _st at us) ;
f or ( i = st r l en( r ent al _st at us) ; i <26; put char ( ' ' ) , i ++) ;
spr i nt f ( buf f er , " %d" , r ent al _r at e) ;
whi l e( st r l en( buf f er ) <38) st r cat ( buf f er , " " ) ;
pr i nt f ( " %s\ n" , r ent al _empl oyee) ;
f or ( i = st r l en( r ent al _empl oyee) ; i <48; put char ( ' ' ) , i ++) ;
pr i nt f ( " %s\ n" , cashi er _empl oyee) ;
f or ( i = st r l en( cashi er _empl oyee) ; i <60; put char ( ' ' ) , i ++) ;
pr i nt f ( " %s\ n" , payment _t ype) ;
f or ( i = st r l en( payment _t ype) ; i <72; put char ( ' ' ) , i ++) ;
pr i nt f ( " %s\ n" , payment _st at us) ;
count ++;
}

EXEC SQL CLOSE cur 9;
sql er r ( " CLOSE cur 9" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y10( ) {
i nt i ;
pr i nt f ( " di spl ayi ng r esul t of quer y 10\ n" ) ;
EXEC SQL DECLARE cur 10 CURSOR FOR
SELECT MGR. EMPNM AS MANAGER_NAME, E. EMPNM AS EMPLOYEE_NAME
FROM EMPLOYEE E
I NNER J OI N EMPLOYEE MGR ON E. MGRSI N = MGR. EMPSI N
ORDER BY MGR. EMPSI N, E. EMPSI N;
sql er r ( " DECLARE cur 10" ) ;

EXEC SQL OPEN cur 10;
sql er r ( " OPEN cur 10" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 10 I NTO : manager _name,
: empl oyee_name;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " MANAGER_NAME EMPLOYEE_NAME\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( manager _name) ;
depad( empl oyee_name) ;

pr i nt f ( " %s" , manager _name) ;
f or ( i = st r l en( manager _name) ; i <15; put char ( ' ' ) , i ++) ;
pr i nt f ( " %S\ n" , empl oyee_name) ;
count ++;
}

EXEC SQL CLOSE cur 10;
sql er r ( " CLOSE cur 10" ) ;

Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

23

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;


}

voi d do_al l ( ) {
quer y1( ) ;
quer y2( ) ;
quer y3( ) ;
quer y4( ) ;
quer y5( ) ;
quer y6( ) ;
quer y7( ) ;
quer y8( ) ;
quer y9( ) ;
quer y10( ) ;
}
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

24

Appendix 3: Car Rental Application program

Write a simple C program with embedded SQL that


1. Prompts the user to enter the street number of the customer (checks the size of input <=10) ,
reads it and saves it.
2. Prompts the user to enter the street of the customer (checks the size of input <=100), reads it and
saves it.
3. Prompts the user to enter the city of the customer (checks the size of input <=20), reads it and
saves it.
4. Prompts the user to enter the province of the customer (checks the size of input <=2), reads it and
saves it.
5. Prompts the user to enter the postal code of the customer (checks the size of input <=6), reads it
and saves it.
6. Executes a query to select from table ADDRESS, all records with the same street number, street,
city, province, and postal code. If the result is non-empty, it displays a message that this address
is already in the database. If the result is empty, it executes a query to get the maximal addressid
from table ADDRESS. If the result is empty, it sets addressid to 1, otherwise to maximum+1.
7. Executes a query to insert in table ADDRESS the new address.
8. Displays a message that the address was added to the database.
9. Prompts the user to enter the last name of the customer (checks the size of input <=50), reads it
and saves it.
10. Prompts the user to enter the first name of the customer (checks the size of input <=50), reads it
and saves it.
11. Prompts the user to enter the driver's license of the customer (checks the size of input <=20),
reads it and saves it.
12. Executes a query to find out if this person is already in table PERSON. If not, it executes a query
to insert it into PERSON and displays a message about it. If it is, it just displays a message that it
is already in the system.
13. Executes a query to find out if this person is already in table CUSTOMER. If not, it executes a
query to insert it into CUSTOMER and display a message about it. If it is, just display a message
that it is already in the system.
14. Prompts the user to enter the car-to-be-rented's id, reads it and saves it.
15. Executes a query to check if this car is in the table CAR. If not, the processing goes back to 14.
16. Prompts the user to enter the car-to-be-rented's location, reads it and saves it.
17. Executes a query of CAR to check if the location is correct. If not, the processing goes back to
17.
18. Prompts the user to enter the gas tank contents (checks the size of input <=1), reads it and saves
it.
19. Prompts the user to enter the odometer reading, reads it and saves it.
20. Establishes the rentalid of the new rental:
executes a query to get the maximal rentalid from table RENTAL,
if the result is empty, it sets rentalid to 1, otherwise to maximum+1.
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

25

21. Executes a query to insert into table RENTAL the new address, the to_location is to be the same
as the from_location (obtained in 17), from_date is CURRENT DATE, to_date is NULL, and
return_odo is NULL.
22. Displays a message that the rental was added to the database.
23. Executes a query to select all records from RENTAL.
24. Using a cursor, displays all rows of RENTAL.
#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>
#i ncl ude <st r i ng. h>

EXEC SQL I NCLUDE SQLCA;

i nt connect ed=0;
voi d sql er r ( char * x) {
i f ( SQLCODE! =0) {
pr i nt f ( " er r or %s ( %d) \ n" , x, SQLCODE) ;
i f ( connect ed) {
EXEC SQL CONNECT RESET;
pr i nt f ( " di sconnect ed f r omOURDB\ n" ) ;
}
exi t ( 1) ;
}
}

voi d connect ( ) {
EXEC SQL CONNECT TO OURDB;
sql er r ( " CONNECT TO OURDB" ) ;
pr i nt f ( " Connect ed t o OURDB\ n" ) ;
connect ed = 1;
}

voi d di sconnect ( ) {
EXEC SQL CONNECT RESET;
sql er r ( " CONNECT RESET" ) ;
pr i nt f ( " Di sconnect ed f r omOURDB\ n" ) ;
connect ed = 0;
}

voi d depad( char * s) {
i nt i ;
i =st r l en( s) - 1;
whi l e( s[ i ] ==' ' ) s[ i - - ] =' \ 0' ;
}

#def i ne s_dl i cense 4
#def i ne s_car i d 9
#def i ne s_f r om_l ocat i on 15
#def i ne s_dr opof f _l ocat i on 24
#def i ne s_f r om_dat e 33
#def i ne s_t o_dat e 45
#def i ne s_t ank 56
#def i ne s_i ni t _odo 62
#def i ne s_r et ur n_odo 71

i nt mai n( ) {
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

26

char buf f [ 400] ;


i nt f i r st ;

EXEC SQL BEGI N DECLARE SECTI ON;
char snumber [ 11] ;
char st r eet [ 101] ;
char ci t y[ 21] ;
char pr ovi nce[ 3] ;
char pcode[ 7] ;
l ong addr essi d;
char l name[ 51] ;
char _l name[ 51] ;
char f name[ 51] ;
char _f name[ 51] ;
char dl i cense[ 21] ;
char _dl i cense[ 21] ;
l ong car i d;
l ong _car i d;
l ong f r om_l ocat i on;
l ong dr opof f _l ocat i on;
shor t dr opof f _l ocat i on_i nd;
l ong cl ocat i on;
l ong r ent al i d;
char f r om_dat e[ 11] ;
char t o_dat e[ 11] ;
shor t t o_dat e_i nd;
l ong i ni t _odo;
l ong r et ur n_odo;
shor t r et ur n_odo_i nd;
char t ank[ 2] ;
EXEC SQL END DECLARE SECTI ON;
connect ( ) ;

whi l e( 1) {
pr i nt f ( " ent er st r eet number : " ) ;
f f l ush( st dout ) ;
f get s( buf f , 400, st di n) ;
buf f [ st r l en( buf f ) - 1] =' \ 0' ;
i f ( st r l en( buf f ) >10) {
pr i nt f ( " ent r y t oo l ong\ n" ) ;
cont i nue;
}
st r cpy( snumber , buf f ) ;
br eak;
}

whi l e( 1) {
pr i nt f ( " ent er st r eet name: " ) ;
f f l ush( st dout ) ;
f get s( buf f , 400, st di n) ;
buf f [ st r l en( buf f ) - 1] =' \ 0' ;
i f ( st r l en( buf f ) >100) {
pr i nt f ( " ent r y t oo l ong\ n" ) ;
cont i nue;
}
st r cpy( st r eet , buf f ) ;
br eak;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

27

}

whi l e( 1) {
pr i nt f ( " ent er ci t y: " ) ;
f f l ush( st dout ) ;
f get s( buf f , 400, st di n) ;
buf f [ st r l en( buf f ) - 1] =' \ 0' ;
i f ( st r l en( buf f ) >20) {
pr i nt f ( " ent r y t oo l ong\ n" ) ;
cont i nue;
}
st r cpy( ci t y, buf f ) ;
br eak;
}

whi l e( 1) {
pr i nt f ( " ent er pr ovi nce: " ) ;
f f l ush( st dout ) ;
f get s( buf f , 400, st di n) ;
buf f [ st r l en( buf f ) - 1] =' \ 0' ;
i f ( st r l en( buf f ) >2) {
pr i nt f ( " ent r y t oo l ong\ n" ) ;
cont i nue;
}
st r cpy( pr ovi nce, buf f ) ;
br eak;
}

whi l e( 1) {
pr i nt f ( " ent er post al code: " ) ;
f f l ush( st dout ) ;
f get s( buf f , 400, st di n) ;
buf f [ st r l en( buf f ) - 1] =' \ 0' ;
i f ( st r l en( buf f ) >6) {
pr i nt f ( " ent r y t oo l ong\ n" ) ;
cont i nue;
}
st r cpy( pcode, buf f ) ;
br eak;
}
/ * Let ' s f i nd out i f t he addr ess i s al r eady i n t he syst em*/
EXEC SQL DECLARE cur 0 CURSOR FOR
SELECT ADDRESSI D, SNUMBER, STREET, CI TY, PROVI NCE, PCODE
FROM ADDRESS
WHERE SNUMBER=: snumber
AND STREET=: st r eet
AND CI TY=: ci t y
AND PROVI NCE=: pr ovi nce
AND PCODE=: pcode;
sql er r ( " DECLARE cur 0" ) ;

EXEC SQL OPEN cur 0;
sql er r ( " OPEN cur 0" ) ;

EXEC SQL FETCH cur 0 I NTO : addr essi d;
i f ( SQLCODE==0) {
EXEC SQL CLOSE cur 0;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

28

sql er r ( " CLOSE cur 0" ) ;


pr i nt f ( " addr ess al r eady i n t he dat abase\ n" ) ;
}el se{
EXEC SQL CLOSE cur 0;
sql er r ( " CLOSE cur 0" ) ;
/ * we have t o r ead t abl e ADDRESS and f i nd maxi mumADDRESSI D so
we can det er mi ne ADDRESSI D f or t he new addr ess */
EXEC SQL DECLARE cur 1 CURSOR FOR
SELECT MAX( ADDRESSI D) FROM ADDRESS;
sql er r ( " DECLARE cur 1" ) ;

EXEC SQL OPEN cur 1;
sql er r ( " OPEN cur 1" ) ;

EXEC SQL FETCH cur 1 I NTO : addr essi d;
i f ( SQLCODE==0)
addr essi d++;
el se
addr essi d=1;

EXEC SQL CLOSE cur 1;
sql er r ( " CLOSE cur 1" ) ;

EXEC SQL I NSERT I NTO ADDRESS
( ADDRESSI D, SNUMBER, STREET, CI TY, PROVI NCE, PCODE, I S_HQUARTERS)
VALUES
( : addr essi d, : snumber , : st r eet , : ci t y, : pr ovi nce, : pcode, ' 0' ) ;
sql er r ( " I NSERT I NTO ADDRESS" ) ;
pr i nt f ( " addr ess added\ n" ) ;
}

whi l e( 1) {
pr i nt f ( " ent er cust omer ' s l ast name: " ) ;
f get s( buf f , 400, st di n) ;
buf f [ st r l en( buf f ) - 1] =' \ 0' ;
i f ( st r l en( buf f ) >50) {
pr i nt f ( " ent r y t oo l ong\ n" ) ;
cont i nue;
}
st r cpy( l name, buf f ) ;
br eak;
}

whi l e( 1) {
pr i nt f ( " ent er cust omer ' s f i r st name: " ) ;
f get s( buf f , 400, st di n) ;
buf f [ st r l en( buf f ) - 1] =' \ 0' ;
i f ( st r l en( buf f ) >50) {
pr i nt f ( " ent r y t oo l ong\ n" ) ;
cont i nue;
}
st r cpy( f name, buf f ) ;
br eak;
}

A:
whi l e( 1) {
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

29

pr i nt f ( " ent er cust omer ' s dr i ver ' s l i cense: " ) ;


f get s( buf f , 400, st di n) ;
buf f [ st r l en( buf f ) - 1] =' \ 0' ;
i f ( st r l en( buf f ) >20) {
pr i nt f ( " ent r y t oo l ong\ n" ) ;
cont i nue;
}
st r cpy( dl i cense, buf f ) ;
br eak;
}

EXEC SQL DECLARE cur 2 CURSOR FOR
SELECT LNAME, FNAME
FROM PERSON
WHERE DLI CENSE=: dl i cense;
sql er r ( " DECLARE cur 2" ) ;

EXEC SQL OPEN cur 2;
sql er r ( " OPEN cur 2" ) ;

EXEC SQL FETCH cur 2 I NTO : _l name,
: _f name;
depad( _l name) ;
depad( _f name) ;
i f ( SQLCODE==0) {
i f ( st r cmp( f name, _f name) ==0 && st r cmp( l name, _l name) ==0)
pr i nt f ( " per son ( %s, %s) al r eady i n t he dat abase\ n" , f name, l name) ;
el se{
pr i nt f ( " t her e i s a di f f er ent per son ( %s, %s) wi t h t he dr i ver ' s l i cense %s\ n" ,
_f name, _l name, dl i cense) ;
EXEC SQL CLOSE cur 2;
sql er r ( " CLOSE cur 2" ) ;
got o A;
}
}el se{
EXEC SQL I NSERT I NTO PERSON
( DLI CENSE, FNAME, LNAME, ADDRESSI D)
VALUES
( : dl i cense, : f name, : l name, : addr essi d) ;
sql er r ( " I NSERT I NTO PERSON" ) ;
pr i nt f ( " per son ( %s, %s) added\ n" , f name, l name) ;
}
EXEC SQL CLOSE cur 2;
sql er r ( " CLOSE cur 2" ) ;

EXEC SQL DECLARE cur 3 CURSOR FOR
SELECT DLI CENSE
FROM CUSTOMER
WHERE DLI CENSE=: dl i cense;
sql er r ( " DECLARE cur 3" ) ;

EXEC SQL OPEN cur 3;
sql er r ( " OPEN cur 3" ) ;

EXEC SQL FETCH cur 3 I NTO : _dl i cense;
depad( _dl i cense) ;
i f ( SQLCODE==0)
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

30

pr i nt f ( " per son ( %s, %s) al r eady a cust omer \ n" , f name, l name) ;
el se{
EXEC SQL I NSERT I NTO CUSTOMER ( DLI CENSE) VALUES
( : dl i cense) ;
sql er r ( " I NSERT I NTO CUSTOMER" ) ;
pr i nt f ( " cust omer ( %s, %s) added\ n" , f name, l name) ;
}

EXEC SQL CLOSE cur 3;
sql er r ( " CLOSE cur 3" ) ;

whi l e( 1) {
pr i nt f ( " ent er car di d: " ) ;
f f l ush( st dout ) ;
f get s( buf f , 400, st di n) ;
buf f [ st r l en( buf f ) - 1] =' \ 0' ;
car i d=at oi ( buf f ) ;
EXEC SQL DECLARE cur 4 CURSOR FOR
SELECT CARI D FROM CAR WHERE CARI D=: car i d;
sql er r ( " DECLARE cur 4" ) ;

EXEC SQL OPEN cur 4;
sql er r ( " OPEN cur 4" ) ;

EXEC SQL FETCH cur 4 I NTO : _car i d;
i f ( SQLCODE! =0) {
pr i nt f ( " car wi t h car i d %d not i n t he syst em\ n" , _car i d) ;
EXEC SQL CLOSE cur 4;
sql er r ( " CLOSE cur 4" ) ;
cont i nue;
}
EXEC SQL CLOSE cur 4;
sql er r ( " CLOSE cur 4" ) ;

EXEC SQL DECLARE cur 5 CURSOR FOR
SELECT CARI D
FROM RENTAL
WHERE CARI D=: car i d
AND TO_DATE I S NULL;
sql er r ( " DECLARE cur 5" ) ;

EXEC SQL OPEN cur 5;
sql er r ( " OPEN cur 5" ) ;

EXEC SQL FETCH cur 5 I NTO : _car i d;
i f ( SQLCODE==0) {
pr i nt f ( " car wi t h car i d %d r ent ed out \ n" , _car i d) ;
EXEC SQL CLOSE cur 5;
sql er r ( " CLOSE cur 5" ) ;
cont i nue;
}
EXEC SQL CLOSE cur 5;
sql er r ( " CLOSE cur 5" ) ;
br eak;
}

whi l e( 1) {
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

31

pr i nt f ( " ent er r ent al l ocat i on: " ) ;


f f l ush( st dout ) ;
f get s( buf f , 400, st di n) ;
buf f [ st r l en( buf f ) - 1] =' \ 0' ;
f r om_l ocat i on=at oi ( buf f ) ;
EXEC SQL DECLARE cur 6 CURSOR FOR
SELECT CLOCATI ON FROM CAR WHERE CARI D=: car i d;
sql er r ( " DECLARE cur 6" ) ;

EXEC SQL OPEN cur 6;
sql er r ( " OPEN cur 6" ) ;

EXEC SQL FETCH cur 6 I NTO : cl ocat i on;
i f ( SQLCODE! =0) {
pr i nt f ( " i ncor r ect r ent al l ocat i on f or t he car \ n" ) ;
EXEC SQL CLOSE cur 6;
sql er r ( " CLOSE cur 6" ) ;
cont i nue;
}el se i f ( cl ocat i on ! = f r om_l ocat i on) {
pr i nt f ( " i ncor r ect r ent al l ocat i on f or t he car \ n" ) ;
EXEC SQL CLOSE cur 6;
sql er r ( " CLOSE cur 6" ) ;
cont i nue;
}
EXEC SQL CLOSE cur 6;
sql er r ( " CLOSE cur 6" ) ;
dr opof f _l ocat i on=f r om_l ocat i on;
br eak;
}

whi l e( 1) {
pr i nt f ( " ent er t ank cont ent s: " ) ;
f f l ush( st dout ) ;
f get s( buf f , 400, st di n) ;
buf f [ st r l en( buf f ) - 1] =' \ 0' ;

EXEC SQL DECLARE cur 7 CURSOR FOR
SELECT CLOCATI ON FROM CAR WHERE CARI D=: car i d;
sql er r ( " DECLARE cur 7" ) ;

EXEC SQL OPEN cur 7;
sql er r ( " OPEN cur 7" ) ;

EXEC SQL FETCH cur 7 I NTO : cl ocat i on;
i f ( SQLCODE! =0) {
pr i nt f ( " i ncor r ect r ent al l ocat i on f or t he car \ n" ) ;
EXEC SQL CLOSE cur 7;
sql er r ( " CLOSE cur 7" ) ;
cont i nue;
}el se i f ( cl ocat i on ! = f r om_l ocat i on) {
pr i nt f ( " i ncor r ect r ent al l ocat i on f or t he car \ n" ) ;
EXEC SQL CLOSE cur 7;
sql er r ( " CLOSE cur 7" ) ;
cont i nue;
}
EXEC SQL CLOSE cur 7;
sql er r ( " CLOSE cur 7" ) ;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

32

br eak;
}
pr i nt f ( " ent er odomet er r eadi ng: " ) ;
f f l ush( st dout ) ;
f get s( buf f , 400, st di n) ;
buf f [ st r l en( buf f ) - 1] =' \ 0' ;
i ni t _odo = at oi ( buf f ) ;

/ * we have t o r ead t abl e RENTAL and f i nd maxi mumRENTALI D so
we can det er mi ne RENTALI D f or t he new r ent al */

EXEC SQL DECLARE cur 8 CURSOR FOR
SELECT MAX( RENTALI D) FROM RENTAL;
sql er r ( " DECLARE cur 8" ) ;

EXEC SQL OPEN cur 8;
sql er r ( " OPEN cur 8" ) ;

EXEC SQL FETCH cur 8 I NTO : r ent al i d;
i f ( SQLCODE==0)
r ent al i d++;
el se
r ent al i d=1;

/ * so now we have al l i nf or mat i on t o ent er t he r ent al */

EXEC SQL I NSERT I NTO RENTAL
( RENTALI D, DLI CENSE, CARI D, FROM_LOCATI ON, DROPOFF_LOCATI ON, FROM_DATE, TO_DATE,
TANK, I NI T_ODO, RETURN_ODO)
VALUES
( : r ent al i d, : dl i cense, : car i d, : f r om_l ocat i on, : dr opof f _l ocat i on,
CURRENT DATE, NULL, ' F' , : i ni t _odo, NULL) ;
sql er r ( " I NSERT I NTO RENTAL" ) ;
pr i nt f ( " r ent al %d successf ul l y i nser t ed\ n" , r ent al i d) ;
pr i nt f ( " di spl ay t he cont ent s of t abl e RENTAL\ n" ) ;

EXEC SQL DECLARE cur 9 CURSOR FOR
SELECT RENTALI D, DLI CENSE, CARI D, FROM_LOCATI ON, DROPOFF_LOCATI ON, FROM_DATE,
TO_DATE, TANK, I NI T_ODO, RETURN_ODO
FROM RENTAL;
sql er r ( " DECLARE cur 9" ) ;

EXEC SQL OPEN cur 9;
sql er r ( " OPEN cur 9" ) ;

f i r st =1;
whi l e( 1) {
EXEC SQL FETCH cur 9 I NTO : r ent al i d,
: dl i cense,
: car i d,
: f r om_l ocat i on,
: dr opof f _l ocat i on: dr opof f _l ocat i on_i nd,
: f r om_dat e,
: t o_dat e: t o_dat e_i nd,
: t ank,
: i ni t _odo,
: r et ur n_odo: r et ur n_odo_i nd;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

33

depad( dl i cense) ;
i f ( SQLCODE! =0) br eak;
i f ( f i r st ) {
pr i nt f ( " RENTALI D\ n" ) ;
pr i nt f ( " DLI C CARI D FROM_LOC DROP_LOC FROM_DATE TO_DATE TANK I NI T_ODO
RET_ODO\ n" ) ;
f i r st =0;
}

spr i nt f ( buf f , " %d" , r ent al i d) ;

whi l e( st r l en( buf f ) <s_dl i cense) st r cat ( buf f , " " ) ;
spr i nt f ( &buf f [ st r l en( buf f ) ] , " %s" , dl i cense) ;

whi l e( st r l en( buf f ) <s_car i d) st r cat ( buf f , " " ) ;
spr i nt f ( &buf f [ st r l en( buf f ) ] , " %d" , car i d) ;

whi l e( st r l en( buf f ) <s_f r om_l ocat i on) st r cat ( buf f , " " ) ;
spr i nt f ( &buf f [ st r l en( buf f ) ] , " %d" , f r om_l ocat i on) ;

whi l e( st r l en( buf f ) <s_dr opof f _l ocat i on) st r cat ( buf f , " " ) ;
spr i nt f ( &buf f [ st r l en( buf f ) ] , " %d" , dr opof f _l ocat i on) ;

whi l e( st r l en( buf f ) <s_f r om_dat e) st r cat ( buf f , " " ) ;
st r cat ( buf f , f r om_dat e) ;

whi l e( st r l en( buf f ) <s_t o_dat e) st r cat ( buf f , " " ) ;
i f ( t o_dat e_i nd==0)
st r cat ( buf f , t o_dat e) ;
el se
st r cat ( buf f , " - - " ) ;

whi l e( st r l en( buf f ) <s_t ank) st r cat ( buf f , " " ) ;
st r cat ( buf f , t ank) ;

whi l e( st r l en( buf f ) <s_i ni t _odo) st r cat ( buf f , " " ) ;
spr i nt f ( &buf f [ st r l en( buf f ) ] , " %d" , i ni t _odo) ;

whi l e( st r l en( buf f ) <s_r et ur n_odo) st r cat ( buf f , " " ) ;
i f ( r et ur n_odo_i nd==0)
spr i nt f ( &buf f [ st r l en( buf f ) ] , " %d" , r et ur n_odo) ;
el se
st r cat ( buf f , " - - " ) ;

pr i nt f ( " %s\ n" , buf f ) ;
}

EXEC SQL CLOSE cur 9;
sql er r ( " CLOSE cur 9" ) ;

i f ( f i r st )
pr i nt f ( " t abl e RENTAL i s empt y\ n" ) ;
di sconnect ( ) ;

r et ur n 0;
}
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

34

Appendix 4: Course Registration Application program



The task is to write a simple C program that connects to the database OURDB and using the technique
of embedded SQL. Execute the 7 queries from Section 7.5 and display the result of each query on the
screen (for that, the use of CURSOR is need).
#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>
#i ncl ude <st r i ng. h>

EXEC SQL I NCLUDE SQLCA;

i nt connect ed=0;

voi d quer y1( ) ;
voi d quer y2( ) ;
voi d quer y3( ) ;
voi d quer y4( ) ;
voi d quer y5( ) ;
voi d quer y6( ) ;
voi d quer y7( ) ;

EXEC SQL BEGI N DECLARE SECTI ON;
char NAME[ 21] ;
char DESI G[ 6] ;
char STATUS[ 2] ;
EXEC SQL END DECLARE SECTI ON;

i nt f i r st ;
char l i ne[ 100] ;

voi d sql er r ( char * x) {
i f ( SQLCODE! =0) {
pr i nt f ( " er r or %s\ n" , x) ;
i f ( connect ed)
EXEC SQL CONNECT RESET;
exi t ( 1) ;
}
}

i nt mai n( ) {
i nt i , c;

EXEC SQL CONNECT TO OURDB;
sql er r ( " CONNECT TO OURDB" ) ;
pr i nt f ( " Connect ed t o OURDB\ n" ) ;
connect ed = 1;

quer y1( ) ;
quer y2( ) ;
quer y3( ) ;
quer y4( ) ;
quer y5( ) ;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

35

quer y6( ) ;
quer y7( ) ;

EXEC SQL CONNECT RESET;
sql er r ( " CONNECT RESET" ) ;
pr i nt f ( " Di sconnect ed f r omOURDB\ n" ) ;
r et ur n 0;
}

voi d quer y1( ) {
EXEC SQL DECLARE cur 1 CURSOR FOR
SELECT NAME, DESI G, STATUS
FROM STUDENT, PERSON, L1
WHERE STUDENT. I D=L1. I D
AND ( STUDENT. I D=' 0000041' OR STUDENT. I D=' 0000042' )
AND STUDENT. I D=PERSON. I D
uni on
SELECT NAME, DESI G, STATUS
FROM STUDENT, PERSON, L2
WHERE STUDENT. I D=L2. I D
AND ( STUDENT. I D=' 0000041' OR STUDENT. I D=' 0000042' )
AND STUDENT. I D=PERSON. I D;

EXEC SQL OPEN cur 1;
sql er r ( " OPEN cur 1" ) ;

f i r st =1;
whi l e( 1) {
EXEC SQL FETCH cur 1 I NTO : NAME,
: DESI G,
: STATUS;
i f ( SQLCODE! =0) br eak;
i f ( f i r st ) {
pr i nt f ( " \ nQUERY 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
pr i nt f ( " NAME DESI G STATUS\ n" ) ;
f i r st =0;
}

spr i nt f ( l i ne, " %s" , NAME) ;
whi l e( st r l en( l i ne) < 25) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , DESI G) ;
whi l e( st r l en( l i ne) < 35) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , STATUS) ;
pr i nt f ( " %s\ n" , l i ne) ;
}/ * endwhi l e */


EXEC SQL CLOSE cur 1;
sql er r ( " CLOSE cur 1" ) ;
}

voi d quer y2( ) {
EXEC SQL DECLARE cur 2 CURSOR FOR
SELECT PERSON. NAME
FROM PERSON, STUDENT
WHERE PERSON. I D=STUDENT. I D
AND STUDENT. YEAR=1;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

36


EXEC SQL OPEN cur 2;
sql er r ( " OPEN cur 2" ) ;

f i r st =1;
whi l e( 1) {
EXEC SQL FETCH cur 2 I NTO : NAME;
i f ( SQLCODE! =0) br eak;
i f ( f i r st ) {
pr i nt f ( " \ nQUERY 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
pr i nt f ( " NAME\ n" ) ;
f i r st =0;
}

spr i nt f ( l i ne, " %s" , NAME) ;
pr i nt f ( " %s\ n" , l i ne) ;
}/ * endwhi l e */

EXEC SQL CLOSE cur 2;
sql er r ( " CLOSE cur 2" ) ;
}

voi d quer y3( ) {
EXEC SQL DECLARE cur 3 CURSOR FOR
SELECT PERSON. NAME
FROM PERSON, I NSTRUCTOR, HASI , Y1COURSE
WHERE PERSON. I D=I NSTRUCTOR. I D
AND HASI . I D=I NSTRUCTOR. I D
AND HASI . DESI G=Y1COURSE. DESI G;

EXEC SQL OPEN cur 3;
sql er r ( " OPEN cur 3" ) ;

f i r st =1;
whi l e( 1) {
EXEC SQL FETCH cur 3 I NTO : NAME;
i f ( SQLCODE! =0) br eak;
i f ( f i r st ) {
pr i nt f ( " \ nQUERY 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
pr i nt f ( " NAME\ n" ) ;
f i r st =0;
}

spr i nt f ( l i ne, " %s" , NAME) ;
pr i nt f ( " %s\ n" , l i ne) ;
}/ * endwhi l e */

EXEC SQL CLOSE cur 3;
sql er r ( " CLOSE cur 3" ) ;
}

voi d quer y4( ) {
EXEC SQL DECLARE cur 4 CURSOR FOR
SELECT DI STI NCT DESI G
FROM TUTORI AL;

EXEC SQL OPEN cur 4;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

37

sql er r ( " OPEN cur 4" ) ;



f i r st =1;
whi l e( 1) {
EXEC SQL FETCH cur 4 I NTO : NAME;
i f ( SQLCODE! =0) br eak;
i f ( f i r st ) {
pr i nt f ( " \ nQUERY 4 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
pr i nt f ( " DESI G\ n" ) ;
f i r st =0;
}

spr i nt f ( l i ne, " %s" , NAME) ;
pr i nt f ( " %s\ n" , l i ne) ;
}/ * endwhi l e */

EXEC SQL CLOSE cur 4;
sql er r ( " CLOSE cur 4" ) ;
}

voi d quer y5( ) {
EXEC SQL DECLARE cur 5 CURSOR FOR
SELECT DI STI NCT DESI G
FROM LAB
WHERE SECTI ON=2;

EXEC SQL OPEN cur 5;
sql er r ( " OPEN cur 5" ) ;

f i r st =1;
whi l e( 1) {
EXEC SQL FETCH cur 5 I NTO : NAME;
i f ( SQLCODE! =0) br eak;
i f ( f i r st ) {
pr i nt f ( " \ nQUERY 5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
pr i nt f ( " DESI G\ n" ) ;
f i r st =0;
}

spr i nt f ( l i ne, " %s" , NAME) ;
pr i nt f ( " %s\ n" , l i ne) ;
}/ * endwhi l e */

EXEC SQL CLOSE cur 5;
sql er r ( " CLOSE cur 5" ) ;
}

voi d quer y6( ) {
EXEC SQL DECLARE cur 6 CURSOR FOR
SELECT DI STI NCT NAME
FROM PERSON, I NSTRUCTOR, HASI
WHERE ( I NSTRUCTOR. I D=PERSON. I D)
AND ( HASI . I D=PERSON. I D)
AND HASI . DESI G I N ( SELECT COURSE. DESI G
FROM COURSE, LAB
WHERE COURSE. DESI G=LAB. DESI G
AND SECTI ON=2) ;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

38


EXEC SQL OPEN cur 6;
sql er r ( " OPEN cur 6" ) ;

f i r st =1;
whi l e( 1) {
EXEC SQL FETCH cur 6 I NTO : NAME;
i f ( SQLCODE! =0) br eak;
i f ( f i r st ) {
pr i nt f ( " \ nQUERY 6 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
pr i nt f ( " DESI G\ n" ) ;
f i r st =0;
}

spr i nt f ( l i ne, " %s" , NAME) ;
pr i nt f ( " %s\ n" , l i ne) ;
}/ * endwhi l e */

EXEC SQL CLOSE cur 6;
sql er r ( " CLOSE cur 6" ) ;
}

voi d quer y7( ) {
EXEC SQL DECLARE cur 7 CURSOR FOR
SELECT DI STI NCT NAME
FROM PERSON, I NSTRUCTOR
WHERE ( PERSON. I D=I NSTRUCTOR. I D)
AND NAME NOT I N ( SELECT DI STI NCT NAME
FROM PERSON, I NSTRUCTOR, HASI
WHERE ( I NSTRUCTOR. I D=PERSON. I D)
AND ( HASI . I D=PERSON. I D)
AND HASI . DESI G I N ( SELECT COURSE. DESI G
FROM COURSE, LAB
WHERE COURSE. DESI G=LAB. DESI G
AND SECTI ON=2)
) ;

EXEC SQL OPEN cur 7;
sql er r ( " OPEN cur 7" ) ;

f i r st =1;
whi l e( 1) {
EXEC SQL FETCH cur 7 I NTO : NAME;
i f ( SQLCODE! =0) br eak;
i f ( f i r st ) {
pr i nt f ( " \ nQUERY 7 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
pr i nt f ( " DESI G\ n" ) ;
f i r st =0;
}

spr i nt f ( l i ne, " %s" , NAME) ;
pr i nt f ( " %s\ n" , l i ne) ;
}/ * endwhi l e */

EXEC SQL CLOSE cur 7;
sql er r ( " CLOSE cur 7" ) ;
}
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

39

Appendix 5: Emergency Room Application program



Write a C program with embedded SQL to execute the 16 SQL queries from Section 8.5. However, the
program should display CONi is satisfied if QUERYi returns an empty set and CONi is
not satisfied if QUERYi returns a nonempty set.
#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>
#i ncl ude <st r i ng. h>

EXEC SQL I NCLUDE SQLCA;

i nt connect ed=0;

voi d quer y1( ) ;
voi d quer y2( ) ;
voi d quer y3( ) ;
voi d quer y4( ) ;
voi d quer y5( ) ;
voi d quer y6( ) ;
voi d quer y7( ) ;
voi d quer y8( ) ;
voi d quer y9( ) ;
voi d quer y10( ) ;
voi d quer y11( ) ;
voi d quer y12( ) ;
voi d quer y13( ) ;
voi d quer y14( ) ;
voi d quer y15( ) ;
voi d quer y16( ) ;

EXEC SQL BEGI N DECLARE SECTI ON;
l ong i d;
char l ast name[ 20] ;
char f i r st name[ 20] ;
char mi ddl ename[ 20] ;
char eaddr ess[ 20] ;
char ar eacode[ 3] ;
char number [ 7] ;
char pr ovi nce[ 2] ;
char ci t y[ 10] ;
char st r eet [ 10] ;
char st r eet no[ 6] ;
char bedno[ 3] ;
char f r om[ 30] ;
char t o[ 30] ;
char admi ssi on[ 30] ;
EXEC SQL END DECLARE SECTI ON;

voi d sql er r ( char * x) {
i f ( SQLCODE! =0) {
pr i nt f ( " er r or %s ( %d) \ n" , x, SQLCODE) ;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

40

i f ( connect ed) {
EXEC SQL CONNECT RESET;
pr i nt f ( " di sconnect ed f r omOURDB\ n" ) ;
}
exi t ( 1) ;
}

}

i nt mai n( ) {
EXEC SQL CONNECT TO OURDB;
sql er r ( " CONNECT TO OURDB" ) ;
pr i nt f ( " Connect ed t o OURDB\ n" ) ;
connect ed = 1;

quer y1( ) ;
quer y2( ) ;
quer y3( ) ;
quer y4( ) ;
quer y5( ) ;
quer y6( ) ;
quer y7( ) ;
quer y8( ) ;
quer y9( ) ;
quer y10( ) ;
quer y11( ) ;
quer y12( ) ;
quer y13( ) ;
quer y14( ) ;
quer y15( ) ;
quer y16( ) ;

EXEC SQL CONNECT RESET;
sql er r ( " CONNECT RESET" ) ;
pr i nt f ( " Di sconnect ed f r omOURDB\ n" ) ;
r et ur n 0;
}

voi d quer y1( ) {

/ / The quer y r et ur ns an empt y set i f CON1 i s sat i sf i ed
EXEC SQL DECLARE cur 1 CURSOR FOR
( ( SELECT RI D FROM RECEPTI ONI ST) I NTERSECT ( SELECT NI D FROM NURSE) )
UNI ON
( ( SELECT RI D FROM RECEPTI ONI ST) I NTERSECT ( SELECT DI D FROM DOCTOR) )
UNI ON
( ( SELECT NI D FROM NURSE) I NTERSECT ( SELECT DI D FROM DOCTOR) ) ;

EXEC SQL OPEN cur 1;
sql er r ( " OPEN cur 1" ) ;

EXEC SQL FETCH cur 1 I NTO : i d;
i f ( SQLCODE==0)
pr i nt f ( " CON1 not sat i sf i ed\ n" ) ;
el se
pr i nt f ( " CON1 sat i sf i ed\ n" ) ;

Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

41

EXEC SQL CLOSE cur 1;


sql er r ( " CLOSE cur 1" ) ;
}




voi d quer y2( ) {

/ / The quer y r et ur ns an empt y set i f CON2 i s sat i sf i ed
EXEC SQL DECLARE cur 2 CURSOR FOR
( SELECT EADDRESS FROM EMAI L) EXCEPT ( SELECT EADDRESS FROM HASE) ;

EXEC SQL OPEN cur 2;
sql er r ( " OPEN cur 2" ) ;

EXEC SQL FETCH cur 2 I NTO : eaddr ess;
i f ( SQLCODE==0)
pr i nt f ( " CON2 not sat i sf i ed\ n" ) ;
el se
pr i nt f ( " CON2 sat i sf i ed\ n" ) ;

EXEC SQL CLOSE cur 2;
sql er r ( " CLOSE cur 2" ) ;
}

voi d quer y3( ) {

/ / The quer y r et ur ns an empt y set i f CON3 i s sat i sf i ed
EXEC SQL DECLARE cur 3 CURSOR FOR
( SELECT AREACODE, NUMBER FROM PHONENO)
EXCEPT
( SELECT AREACODE, NUMBER FROM HASP) ;

EXEC SQL OPEN cur 3;
sql er r ( " OPEN cur 3" ) ;

EXEC SQL FETCH cur 3 I NTO : ar eacode,
: number ;
i f ( SQLCODE==0)
pr i nt f ( " CON3 not sat i sf i ed\ n" ) ;
el se
pr i nt f ( " CON3 sat i sf i ed\ n" ) ;

EXEC SQL CLOSE cur 3;
sql er r ( " CLOSE cur 3" ) ;
}

voi d quer y4( ) {

/ / The quer y r et ur ns an empt y set i f CON4 i s sat i sf i ed
EXEC SQL DECLARE cur 4 CURSOR FOR
( SELECT PROVI NCE, CI TY, STREET, STREETNO FROM ADDRESS)
EXCEPT
( SELECT PROVI NCE, CI TY, STREET, STREETNO FROM HASA) ;

EXEC SQL OPEN cur 4;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

42

sql er r ( " OPEN cur 4" ) ;



EXEC SQL FETCH cur 4 I NTO : pr ovi nce,
: ci t y,
: st r eet ,
: st r eet no;
i f ( SQLCODE==0)
pr i nt f ( " CON4 not sat i sf i ed\ n" ) ;
el se
pr i nt f ( " CON4 sat i sf i ed\ n" ) ;

EXEC SQL CLOSE cur 4;
sql er r ( " CLOSE cur 4" ) ;
}

voi d quer y5( ) {

/ / The quer y r et ur ns an empt y set i f CON5 i s sat i sf i ed
EXEC SQL DECLARE cur 5 CURSOR FOR
( SELECT I D FROM PERSON) EXCEPT ( SELECT I D FROM HASA) ;

EXEC SQL OPEN cur 5;
sql er r ( " OPEN cur 5" ) ;

EXEC SQL FETCH cur 5 I NTO : i d;
i f ( SQLCODE==0)
pr i nt f ( " CON5 not sat i sf i ed\ n" ) ;
el se
pr i nt f ( " CON5 sat i sf i ed\ n" ) ;

EXEC SQL CLOSE cur 5;
sql er r ( " CLOSE cur 5" ) ;
}

voi d quer y6( ) {

/ / The quer y r et ur ns an empt y set i f CON6 i s sat i sf i ed
EXEC SQL DECLARE cur 6 CURSOR FOR
( ( SELECT SHI FTI D FROM RONS)
EXCEPT
( ( SELECT T. SHI FTI D
FROM RONS AS T, RONS AS R
WHERE T. RI D <> R. RI D AND T. SHI FTI D = R. SHI FTI D
)
EXCEPT
( SELECT T. SHI FTI D
FROM RONS AS T, RONS AS R, RONS AS Q
WHERE T. SHI FTI D = R. SHI FTI D AND T. SHI FTI D = Q. SHI FTI D
AND T. RI D <> R. RI D AND T. RI D<>Q. RI D AND R. RI D<>Q. RI D
)
)
) ;

EXEC SQL OPEN cur 6;
sql er r ( " OPEN cur 6" ) ;

EXEC SQL FETCH cur 6 I NTO : i d;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

43

i f ( SQLCODE==0)
pr i nt f ( " CON6 not sat i sf i ed\ n" ) ;
el se
pr i nt f ( " CON6 sat i sf i ed\ n" ) ;

EXEC SQL CLOSE cur 6;
sql er r ( " CLOSE cur 6" ) ;
}

voi d quer y7( ) {

/ / The quer y r et ur ns an empt y set i f CON7 i s sat i sf i ed
EXEC SQL DECLARE cur 7 CURSOR FOR
( ( SELECT SHI FTI D FROM SHI FT) EXCEPT ( SELECT SHI FTI D FROM RONS) )
UNI ON
( ( SELECT RI D FROM RECEPTI ONI ST) EXCEPT ( SELECT RI D FROM RONS) ) ;

EXEC SQL OPEN cur 7;
sql er r ( " OPEN cur 7" ) ;

EXEC SQL FETCH cur 7 I NTO : i d;
i f ( SQLCODE==0)
pr i nt f ( " CON7 not sat i sf i ed\ n" ) ;
el se
pr i nt f ( " CON7 sat i sf i ed\ n" ) ;

EXEC SQL CLOSE cur 7;
sql er r ( " CLOSE cur 7" ) ;
}

voi d quer y8( ) {

/ / The quer y r et ur ns an empt y set i f CON8 i s sat i sf i ed
EXEC SQL DECLARE cur 8 CURSOR FOR
( SELECT SHI FTI D FROM SHI FT)
EXCEPT
( SELECT T. SHI FTI D
FROM NONS AS T, NONS AS R
WHERE T. NI D <> R. NI D AND T. SHI FTI D = R. SHI FTI D) ;

EXEC SQL OPEN cur 8;
sql er r ( " OPEN cur 8" ) ;

EXEC SQL FETCH cur 8 I NTO : i d;
i f ( SQLCODE==0)
pr i nt f ( " CON8 not sat i sf i ed\ n" ) ;
el se
pr i nt f ( " CON8 sat i sf i ed\ n" ) ;

EXEC SQL CLOSE cur 8;
sql er r ( " CLOSE cur 8" ) ;
}

voi d quer y9( ) {

/ / The quer y r et ur ns an empt y set i f CON9 i s sat i sf i ed
EXEC SQL DECLARE cur 9 CURSOR FOR
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

44

( ( SELECT SHI FTI D FROM SHI FT) EXCEPT ( SELECT SHI FTI D FROM NONS) )
UNI ON
( ( SELECT NI D FROM NURSE) EXCEPT ( SELECT NI D FROM NONS) ) ;

EXEC SQL OPEN cur 9;
sql er r ( " OPEN cur 9" ) ;

EXEC SQL FETCH cur 9 I NTO : i d;
i f ( SQLCODE==0)
pr i nt f ( " CON9 not sat i sf i ed\ n" ) ;
el se
pr i nt f ( " CON9 sat i sf i ed\ n" ) ;

EXEC SQL CLOSE cur 9;
sql er r ( " CLOSE cur 9" ) ;
}

voi d quer y10( ) {

/ / The quer y r et ur ns an empt y set i f CON10 i s sat i sf i ed
EXEC SQL DECLARE cur 10 CURSOR FOR
( ( SELECT SHI FTI D FROM SHI FT)
EXCEPT
( SELECT T. SHI FTI D
FROM DONS AS T, DONS AS R
WHERE T. DI D <> R. DI D AND T. SHI FTI D = R. SHI FTI D) ) ;

EXEC SQL OPEN cur 10;
sql er r ( " OPEN cur 10" ) ;

EXEC SQL FETCH cur 10 I NTO : i d;
i f ( SQLCODE==0)
pr i nt f ( " CON10 not sat i sf i ed\ n" ) ;
el se
pr i nt f ( " CON10 sat i sf i ed\ n" ) ;

EXEC SQL CLOSE cur 10;
sql er r ( " CLOSE cur 10" ) ;
}

voi d quer y11( ) {

/ / The quer y r et ur ns an empt y set i f CON11 i s sat i sf i ed
EXEC SQL DECLARE cur 11 CURSOR FOR
( ( SELECT SHI FTI D FROM SHI FT) EXCEPT ( SELECT SHI FTI D FROM DONS) )
UNI ON
( ( SELECT DI D FROM DOCTOR) EXCEPT ( SELECT DI D FROM DONS) ) ;

EXEC SQL OPEN cur 11;
sql er r ( " OPEN cur 11" ) ;

EXEC SQL FETCH cur 11 I NTO : i d;
i f ( SQLCODE==0)
pr i nt f ( " CON11 not sat i sf i ed\ n" ) ;
el se
pr i nt f ( " CON11 sat i sf i ed\ n" ) ;

Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

45

EXEC SQL CLOSE cur 11;


sql er r ( " CLOSE cur 11" ) ;
}

voi d quer y12( ) {

/ / The quer y r et ur ns an empt y set i f CON12 i s sat i sf i ed
EXEC SQL DECLARE cur 12 CURSOR FOR
( ( SELECT PI D FROM CASEDOC) EXCEPT ( SELECT PI D FROM BEDA) ) ;

EXEC SQL OPEN cur 12;
sql er r ( " OPEN cur 12" ) ;

EXEC SQL FETCH cur 12 I NTO : i d;
i f ( SQLCODE==0)
pr i nt f ( " CON12 not sat i sf i ed\ n" ) ;
el se
pr i nt f ( " CON12 sat i sf i ed\ n" ) ;

EXEC SQL CLOSE cur 12;
sql er r ( " CLOSE cur 12" ) ;
}

voi d quer y13( ) {

/ / The quer y r et ur ns an empt y set i f CON13 i s sat i sf i ed
EXEC SQL DECLARE cur 13 CURSOR FOR
( ( SELECT PI D FROM BEDA) EXCEPT ( SELECT PI D FROM CASEDOC) ) ;

EXEC SQL OPEN cur 13;
sql er r ( " OPEN cur 13" ) ;

EXEC SQL FETCH cur 13 I NTO : i d;
i f ( SQLCODE==0)
pr i nt f ( " CON13 not sat i sf i ed\ n" ) ;
el se
pr i nt f ( " CON13 sat i sf i ed\ n" ) ;

EXEC SQL CLOSE cur 13;
sql er r ( " CLOSE cur 13" ) ;
}

voi d quer y14( ) {

/ / The quer y r et ur ns an empt y set i f CON14 i s sat i sf i ed
EXEC SQL DECLARE cur 14 CURSOR FOR
( ( SELECT BED. NUMBER, SHI FTI D
FROM BED, SHI FT)
EXCEPT
( SELECT BED. NUMBER, SHI FTI D
FROM BED, SUPBY
WHERE BED. NUMBER=SUPBY. BEDNO) ) ;

EXEC SQL OPEN cur 14;
sql er r ( " OPEN cur 14" ) ;

EXEC SQL FETCH cur 14 I NTO : bedno,
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

46

: i d;
i f ( SQLCODE==0)
pr i nt f ( " CON14 not sat i sf i ed\ n" ) ;
el se
pr i nt f ( " CON14 sat i sf i ed\ n" ) ;

EXEC SQL CLOSE cur 14;
sql er r ( " CLOSE cur 14" ) ;
}

voi d quer y15( ) {

/ / The quer y r et ur ns an empt y set i f CON15 i s sat i sf i ed
EXEC SQL DECLARE cur 15 CURSOR FOR
( SELECT FROM, TO, ADMI SSI ON
FROM SHI FT, ADM
WHERE SHI FT. SHI FTI D=ADM. SHI FTI D
AND ( ADMI SSI ON < FROM OR TO < ADMI SSI ON) ) ;

EXEC SQL OPEN cur 15;
sql er r ( " OPEN cur 15" ) ;

EXEC SQL FETCH cur 15 I NTO : f r om,
: t o,
: admi ssi on;
i f ( SQLCODE==0)
pr i nt f ( " CON15 not sat i sf i ed\ n" ) ;
el se
pr i nt f ( " CON15 sat i sf i ed\ n" ) ;

EXEC SQL CLOSE cur 15;
sql er r ( " CLOSE cur 15" ) ;
}

voi d quer y16( ) {

/ / The quer y r et ur ns an empt y set i f CON16 i s sat i sf i ed
EXEC SQL DECLARE cur 16 CURSOR FOR
( ( SELECT PI D FROM TRI AGEBY)
EXCEPT
( SELECT TRI AGEBY. PI D
FROM DONS, ADM, TRI AGEBY
WHERE TRI AGEBY. PI D=ADM. PI D
AND ADM. SHI FTI D=DONS. SHI FTI D
AND DONS. DI D=TRI AGEBY. DI D) ) ;

EXEC SQL OPEN cur 16;
sql er r ( " OPEN cur 16" ) ;

EXEC SQL FETCH cur 16 I NTO : i d;
i f ( SQLCODE==0)
pr i nt f ( " CON16 not sat i sf i ed\ n" ) ;
el se
pr i nt f ( " CON16 sat i sf i ed\ n" ) ;
EXEC SQL CLOSE cur 16;
sql er r ( " CLOSE cur 16" ) ;
}
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

47

Appendix 6: Property Rental Application Program



Write a simple C program that executes the 10 queries from Section 9.5. The program follows this logic:
1. The program connects to the database OURDB.
2. Then the program prompts the user for what action should be taken by displaying
the following menu:
enter number of query you want to execute (1-10),
0 to quit, anything else all queries.
3. If the user enters 0, the program terminates.
4. If the user enters 1, the program executes query 1 and displays the results. Then it returns to the
menu.
5. If the user enters 2, the program executes query 2 and displays the results. Then it returns to the
menu.
6. Similarly for 3, 4, ..., 10.
7. If the user enters anything else, all the queries are executed and their results displayed one by one
in the order of the queries (i.e. first query 1, then query 2, ..., query 10). Then the program
terminates.
8. When the program terminates, it must disconnect from the database.
#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>
#i ncl ude <st r i ng. h>

EXEC SQL I NCLUDE SQLCA;

voi d quer y1( ) ;
voi d quer y2( ) ;
voi d quer y3( ) ;
voi d quer y4( ) ;
voi d quer y5( ) ;
voi d quer y6( ) ;
voi d quer y7( ) ;
voi d quer y8( ) ;
voi d quer y9( ) ;
voi d quer y10( ) ;
voi d do_al l ( ) ;

i nt connect ed=0;
voi d sql er r ( char * x) {
i f ( SQLCODE! =0) {
pr i nt f ( " er r or %s ( %d) \ n" , x, SQLCODE) ;
i f ( connect ed) {
EXEC SQL CONNECT RESET;
pr i nt f ( " di sconnect ed f r omOURDB\ n" ) ;
}
exi t ( 1) ;
}
}

voi d connect ( ) {
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

48

EXEC SQL CONNECT TO OURDB;


sql er r ( " CONNECT TO OURDB" ) ;
pr i nt f ( " Connect ed t o OURDB\ n" ) ;
connect ed = 1;
}

voi d di sconnect ( ) {
EXEC SQL CONNECT RESET;
sql er r ( " CONNECT RESET" ) ;
pr i nt f ( " Di sconnect ed f r omOURDB\ n" ) ;
connect ed = 0;
}

voi d depad( char * s) {
i nt i ;
i =st r l en( s) - 1;
whi l e( s[ i ] ==' ' ) s[ i - - ] =' \ 0' ;
}

char buf f er [ 300] ;

i nt mai n( ) {
i nt i , j ;
connect ( ) ;

whi l e( 1) {
A: pr i nt f ( " ent er number of quer y you want t o execut e "
" ( 1- 10) , \ n0 t o qui t , anyt hi ng el se al l quer i es\ n" ) ;
f get s( buf f er , 300, st di n) ;
i f ( buf f er [ 0] ==' \ n' ) {
pr i nt f ( " not hi ng ent er ed\ n" ) ;
cont i nue;
}
i =j =0;
whi l e( buf f er [ j ] ! =' \ n' ) {
i f ( buf f er [ j ] >=' 0' && buf f er [ j ] <=' 9' )
i = 10*i +buf f er [ j ] - ' 0' ;
el se{
pr i nt f ( " i ncor r ect ent r y\ n" ) ;
got o A;
}
j ++;
}
i f ( i == 0) br eak;
el se i f ( i == 1) quer y1( ) ;
el se i f ( i == 2) quer y2( ) ;
el se i f ( i == 3) quer y3( ) ;
el se i f ( i == 4) quer y4( ) ;
el se i f ( i == 5) quer y5( ) ;
el se i f ( i == 6) quer y6( ) ;
el se i f ( i == 7) quer y7( ) ;
el se i f ( i == 8) quer y8( ) ;
el se i f ( i == 9) quer y9( ) ;
el se i f ( i == 10) quer y10( ) ;
el se {
do_al l ( ) ;
br eak;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

49

}
}

di sconnect ( ) ;
r et ur n 0;
}

i nt count , l en, l en1;
char buf 1[ 80] ;

EXEC SQL BEGI N DECLARE SECTI ON;
char st af f _no[ 5] ;
char r ent er _no[ 5] ;
char ad_dat e[ 11] ;
char emai l _addr [ 21] ;
char pr oper t y_no[ 5] ;
char br anch_no[ 5] ;
char f i r st _name[ 11] ;
char mi ddl e_name[ 11] ;
sql i nt 16 mi ddl e_name_i nd;
char l ast _name[ 21] ;
doubl e avg_sal ar y;
char cust omer _no[ 5] ;
char t ype_of _cust omer [ 10] ;
sql i nt 32 ad_cost ;
EXEC SQL END DECLARE SECTI ON;

voi d quer y1( ) {
pr i nt f ( " di spl ayi ng r esul t of quer y 1\ n" ) ;
EXEC SQL DECLARE cur 1 CURSOR FOR
SELECT STAFF_NO
FROM STAFF
WHERE SALARY > 5000
ORDER BY STAFF_NO;
EXEC SQL OPEN cur 1;
sql er r ( " OPEN cur 1" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 1 I NTO : st af f _no;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " STAFF_NO\ n" ) ;
pr i nt f ( " - - - - - - - - \ n" ) ;
}
depad( st af f _no) ;
pr i nt f ( " %s\ n" , st af f _no) ;
count ++;
}

EXEC SQL CLOSE cur 1;
sql er r ( " CLOSE cur 1" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y2( ) {
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

50

pr i nt f ( " di spl ayi ng r esul t of quer y 2\ n" ) ;


EXEC SQL DECLARE cur 2 CURSOR FOR
SELECT DI STI NCT RENTER_NO
FROM VI EWI NG;
sql er r ( " DECLARE cur 2" ) ;

EXEC SQL OPEN cur 2;
sql er r ( " OPEN cur 2" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 2 I NTO : r ent er _no;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " RENTER_NO\ n" ) ;
pr i nt f ( " - - - - - - - - - \ n" ) ;
}
depad( r ent er _no) ;
pr i nt f ( " %s\ n" , r ent er _no) ;
count ++;
}

EXEC SQL CLOSE cur 2;
sql er r ( " CLOSE cur 2" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y3( ) {
pr i nt f ( " di spl ayi ng r esul t of quer y 3\ n" ) ;
EXEC SQL DECLARE cur 3 CURSOR FOR
SELECT DI STI NCT AD_DATE
FROM ADVERTI SEMENT
WHERE PAPER_NAME = ' THE GLOBE AND MAI L' AND
AD_DATE>=' 2005- 01- 01' AND
AD_DATE<=' 2005- 12- 31'
ORDER BY AD_DATE;
sql er r ( " DECLARE cur 3" ) ;

EXEC SQL OPEN cur 3;
sql er r ( " OPEN cur 3" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 3 I NTO : ad_dat e;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " AD_DATE\ n" ) ;
pr i nt f ( " - - - - - - - - - - \ n" ) ;
}
pr i nt f ( " %s\ n" , ad_dat e) ;
count ++;
}

EXEC SQL CLOSE cur 3;
sql er r ( " CLOSE cur 3" ) ;

Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

51

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;


}

voi d quer y4( ) {
i nt i ;
pr i nt f ( " di spl ayi ng r esul t of quer y 4\ n" ) ;
EXEC SQL DECLARE cur 4 CURSOR FOR
SELECT EMAI L_ADDR, RENTER. RENTER_NO
FROM RENTER_EMAI L, RENTER
WHERE RENTER_EMAI L. RENTER_NO = RENTER. RENTER_NO AND
TYPE_OF_BUSI NESS I S NULL
ORDER BY RENTER. RENTER_NO;
sql er r ( " DECLARE cur 4" ) ;

EXEC SQL OPEN cur 4;
sql er r ( " OPEN cur 4" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 4 I NTO : emai l _addr ,
: r ent er _no;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " EMAI L_ADDR RENTER_NO\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( emai l _addr ) ;
depad( r ent er _no) ;
pr i nt f ( " %s" , emai l _addr ) ;
f or ( i = 20- st r l en( emai l _addr ) ; i >=0; i - - ) f put c( ' ' , st dout ) ;
pr i nt f ( " %s\ n" , r ent er _no) ;
count ++;
}

EXEC SQL CLOSE cur 4;
sql er r ( " CLOSE cur 4" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y5( ) {
pr i nt f ( " di spl ayi ng r esul t of quer y 5\ n" ) ;
EXEC SQL DECLARE cur 5 CURSOR FOR
SELECT DI STI NCT PROPERTY_NO
FROM ADVERTI SEMENT
WHERE PROPERTY_NO NOT I N ( SELECT DI STI NCT PROPERTY_NO
FROM RENTAL_AGREEMENT) ;
sql er r ( " DECLARE cur 5" ) ;

EXEC SQL OPEN cur 5;
sql er r ( " OPEN cur 5" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 5 I NTO : pr oper t y_no;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

52

pr i nt f ( " PROPERTY_NO\ n" ) ;


pr i nt f ( " - - - - - - - - - - - \ n" ) ;
}
depad( pr oper t y_no) ;
pr i nt f ( " %s\ n" , pr oper t y_no) ;
count ++;
}

EXEC SQL CLOSE cur 5;
sql er r ( " CLOSE cur 5" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y6( ) {
i nt i ;
pr i nt f ( " di spl ayi ng r esul t of quer y 6\ n" ) ;
EXEC SQL DECLARE cur 6 CURSOR FOR
SELECT FI RST_NAME, MI DDLE_NAME, LAST_NAME, BRANCH_NO
FROM STAFF, BRANCH
WHERE STAFF. ALLOCATED_TO=BRANCH. BRANCH_NO AND
BRANCH. CI TY=' HAMI LTON'
ORDER BY LAST_NAME, FI RST_NAME, MI DDLE_NAME;
sql er r ( " DECLARE cur 6" ) ;

EXEC SQL OPEN cur 6;
sql er r ( " OPEN cur 6" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 6 I NTO : f i r st _name,
: mi ddl e_name: mi ddl e_name_i nd,
: l ast _name,
: br anch_no;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " FI RST_NAME MI DDLE_NAME LAST_NAME BRANCH_NO\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( f i r st _name) ;
i f ( mi ddl e_name_i nd==0)
depad( mi ddl e_name) ;
el se
st r cpy( mi ddl e_name, " - " ) ;
depad( l ast _name) ;
depad( br anch_no) ;
pr i nt f ( " %s" , f i r st _name) ;
f or ( i = st r l en( f i r st _name) ; i <11; put char ( ' ' ) , i ++) ;
pr i nt f ( " %s" , mi ddl e_name) ;
f or ( i += st r l en( mi ddl e_name) ; i <23; put char ( ' ' ) , i ++) ;
pr i nt f ( " %s" , l ast _name) ;
f or ( i += st r l en( l ast _name) ; i <44; put char ( ' ' ) , i ++) ;
pr i nt f ( " %s\ n" , br anch_no) ;
count ++;
}

EXEC SQL CLOSE cur 6;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

53

sql er r ( " CLOSE cur 6" ) ;



pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y7( ) {
i nt i ;
pr i nt f ( " di spl ayi ng r esul t of quer y 7\ n" ) ;
EXEC SQL DECLARE cur 7 CURSOR FOR
SELECT STAFF. STAFF_NO, FI RST_NAME, MI DDLE_NAME, LAST_NAME
FROM STAFF,
( SELECT STAFF_NO, BRANCH_NO, STAFF. STREET, STAFF. CI TY, STAFF. PROVI NCE
FROM STAFF, BRANCH
WHERE STAFF. STAFF_NO = BRANCH. MANAGER) AS T
WHERE STAFF. ALLOCATED_TO = T. BRANCH_NO AND
STAFF. STAFF_NO ! = T. STAFF_NO AND
STAFF. STREET = T. STREET AND
STAFF. CI TY = T. CI TY AND
STAFF. PROVI NCE = T. PROVI NCE
ORDER BY LAST_NAME, FI RST_NAME, MI DDLE_NAME;
sql er r ( " DECLARE cur 7" ) ;

EXEC SQL OPEN cur 7;
sql er r ( " OPEN cur 7" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 7 I NTO : st af f _no,
: f i r st _name,
: mi ddl e_name: mi ddl e_name_i nd,
: l ast _name;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " STAFF_NO FI RST_NAME MI DDLE_NAME LAST_NAME \ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( st af f _no) ;
depad( f i r st _name) ;
i f ( mi ddl e_name_i nd==0)
depad( mi ddl e_name) ;
el se
st r cpy( mi ddl e_name, " - " ) ;
depad( l ast _name) ;

pr i nt f ( " %s" , st af f _no) ;
f or ( i = st r l en( st af f _no) ; i <9; put char ( ' ' ) , i ++) ;
pr i nt f ( " %s" , f i r st _name) ;
f or ( i += st r l en( f i r st _name) ; i <20; put char ( ' ' ) , i ++) ;
pr i nt f ( " %s" , mi ddl e_name) ;
f or ( i += st r l en( mi ddl e_name) ; i <32; put char ( ' ' ) , i ++) ;
pr i nt f ( " %s\ n" , l ast _name) ;
count ++;
}

EXEC SQL CLOSE cur 7;
sql er r ( " CLOSE cur 7" ) ;

Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

54

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;


}

voi d quer y8( ) {
i nt i ;
pr i nt f ( " di spl ayi ng r esul t of quer y 8\ n" ) ;
EXEC SQL DECLARE cur 8 CURSOR FOR
( SELECT ALLOCATED_TO AS BRANCH_NO, AVG( SALARY) AS AVG_SALARY
FROM STAFF
GROUP BY ALLOCATED_TO)
EXCEPT
( SELECT T1. ALLOCATED_TO AS BRANCH_NO, T1. AVG_SALARY
FROM ( SELECT ALLOCATED_TO, AVG( SALARY) AS AVG_SALARY
FROM STAFF
GROUP BY ALLOCATED_TO) AS T1,
( SELECT ALLOCATED_TO, AVG( SALARY) AS AVG_SALARY
FROM STAFF
GROUP BY ALLOCATED_TO) AS T2
WHERE T1. AVG_SALARY < T2. AVG_SALARY) ;
sql er r ( " DECLARE cur 8" ) ;

EXEC SQL OPEN cur 8;
sql er r ( " OPEN cur 8" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 8 I NTO : br anch_no,
: avg_sal ar y;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " BRANCH_NO AVG_SALARY\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( br anch_no) ;

pr i nt f ( " %s" , br anch_no) ;
f or ( i = st r l en( br anch_no) ; i <10; put char ( ' ' ) , i ++) ;
pr i nt f ( " %. 24f \ n" , avg_sal ar y) ;
count ++;
}

EXEC SQL CLOSE cur 8;
sql er r ( " CLOSE cur 8" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y9( ) {
i nt i ;
pr i nt f ( " di spl ayi ng r esul t of quer y 9\ n" ) ;
EXEC SQL DECLARE cur 9 CURSOR FOR
( SELECT OWNER_NO AS CUSTOMER_NO, ' OWNER' AS TYPE_OF_CUSTOMER
FROM OWNER
WHERE OWNER_NO I N ( SELECT OWNER_NO
FROM OWNER_PHONE
GROUP BY OWNER_NO
HAVI NG COUNT( *) >= 2) )
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

55

UNI ON
( SELECT RENTER_NO AS CUSTOMER_NO, ' RENTER' AS TYPE_OF_CUSTOMER
FROM RENTER
WHERE RENTER_NO I N ( SELECT RENTER_NO
FROM RENTER_PHONE
GROUP BY RENTER_NO
HAVI NG COUNT( *) >= 2) ) ;
sql er r ( " DECLARE cur 9" ) ;

EXEC SQL OPEN cur 9;
sql er r ( " OPEN cur 9" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 9 I NTO : cust omer _no,
: t ype_of _cust omer ;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " CUSTOMER_NO TYPE_OF_CUSTOMER\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( cust omer _no) ;
depad( t ype_of _cust omer ) ;

pr i nt f ( " %s" , cust omer _no) ;
f or ( i = st r l en( cust omer _no) ; i <12; put char ( ' ' ) , i ++) ;
pr i nt f ( " %s\ n" , t ype_of _cust omer ) ;
count ++;
}

EXEC SQL CLOSE cur 9;
sql er r ( " CLOSE cur 9" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y10( ) {
i nt i ;
pr i nt f ( " di spl ayi ng r esul t of quer y 10\ n" ) ;
EXEC SQL DECLARE cur 10 CURSOR FOR
SELECT T2. ALLOCATED_TO AS BRANCH_NO, SUM( C) *100 AS AD_COST
FROM ( SELECT PROPERTY_NO, COUNT( *) AS C
FROM ADVERTI SEMENT
GROUP BY PROPERTY_NO) AS T1,
( SELECT PROPERTY_NO, ALLOCATED_TO
FROM PROPERTY, STAFF
WHERE PROPERTY. OVERSEEN_BY = STAFF. STAFF_NO) AS T2
WHERE T1. PROPERTY_NO = T2. PROPERTY_NO
GROUP BY T2. ALLOCATED_TO;
sql er r ( " DECLARE cur 10" ) ;

EXEC SQL OPEN cur 10;
sql er r ( " OPEN cur 10" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 10 I NTO : br anch_no,
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

56

: ad_cost ;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " BRANCH_NO AD_COST\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( br anch_no) ;

pr i nt f ( " %s" , br anch_no) ;
f or ( i = st r l en( br anch_no) ; i <10; put char ( ' ' ) , i ++) ;
pr i nt f ( " %d\ n" , ad_cost ) ;
count ++;
}

EXEC SQL CLOSE cur 10;
sql er r ( " CLOSE cur 10" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d do_al l ( ) {
quer y1( ) ;
quer y2( ) ;
quer y3( ) ;
quer y4( ) ;
quer y5( ) ;
quer y6( ) ;
quer y7( ) ;
quer y8( ) ;
quer y9( ) ;
quer y10( ) ;
}

Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

57

Appendix 7: Software Project Application Program

Write a C program that


1. prompts the user to enter the number of query to be executed or 0 to terminate the
program.
2. The entry should be checked and if it is anything except 0, 1, ... 10, the entry must
be rejected and the user prompted a new entry.
3. If 0 was entered, the program terminates.
4. If a number N between 1 and 10 inclusively was entered, queryN from Section 10.5 is to be
executed and the result displayed on the screen.
#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>
#i ncl ude <st r i ng. h>

EXEC SQL I NCLUDE SQLCA;

voi d quer y1( ) ;
voi d quer y2( ) ;
voi d quer y3( ) ;
voi d quer y4( ) ;
voi d quer y5( ) ;
voi d quer y6( ) ;
voi d quer y7( ) ;
voi d quer y8( ) ;
voi d quer y9( ) ;
voi d quer y10( ) ;

i nt connect ed=0;
voi d sql er r ( char * x) {
i f ( SQLCODE! =0) {
pr i nt f ( " er r or %s ( %d) \ n" , x, SQLCODE) ;
i f ( connect ed) {
EXEC SQL CONNECT RESET;
pr i nt f ( " di sconnect ed f r omOURDB\ n" ) ;
}
exi t ( 1) ;
}
}

voi d connect ( ) {
EXEC SQL CONNECT TO OURDB;
sql er r ( " CONNECT TO OURDB" ) ;
pr i nt f ( " Connect ed t o OURDB\ n" ) ;
connect ed = 1;
}

voi d di sconnect ( ) {
EXEC SQL CONNECT RESET;
sql er r ( " CONNECT RESET" ) ;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

58

pr i nt f ( " Di sconnect ed f r omOURDB\ n" ) ;


connect ed = 0;
}

voi d depad( char * s) {
i nt i ;
i =st r l en( s) - 1;
whi l e( s[ i ] ==' ' ) s[ i - - ] =' \ 0' ;
}

char buf f er [ 300] ;

i nt mai n( ) {
i nt i , j ;
connect ( ) ;

whi l e( 1) {
A: pr i nt f ( " ent er number of quer y you want t o execut e ( 1- 10) , 0 t o qui t \ n" ) ;
f get s( buf f er , 300, st di n) ;
i f ( buf f er [ 0] ==' \ n' ) {
pr i nt f ( " not hi ng ent er ed\ n" ) ;
cont i nue;
}
i =j =0;
whi l e( buf f er [ j ] ! =' \ n' ) {
i f ( buf f er [ i ] >=' 0' && buf f er [ i ] <=' 9' )
i = 10*i +buf f er [ i ] - ' 0' ;
el se{
pr i nt f ( " i ncor r ect ent r y\ n" ) ;
got o A;
}
j ++;
}
i f ( i > 10) {
pr i nt f ( " i ncor r ect ent r y\ n" ) ;
got o A;
}
i f ( i == 0) br eak;
el se i f ( i == 1) quer y1( ) ;
el se i f ( i == 2) quer y2( ) ;
el se i f ( i == 3) quer y3( ) ;
el se i f ( i == 4) quer y4( ) ;
el se i f ( i == 5) quer y5( ) ;
el se i f ( i == 6) quer y6( ) ;
el se i f ( i == 7) quer y7( ) ;
el se i f ( i == 8) quer y8( ) ;
el se i f ( i == 9) quer y9( ) ;
el se i f ( i == 10) quer y10( ) ;
el se pr i nt f ( " i ncor r ect ent r y\ n" ) ;
}

di sconnect ( ) ;
r et ur n 0;
}

i nt count ;

Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

59

EXEC SQL BEGI N DECLARE SECTI ON;


char user i d[ 9] ;
char user name[ 21] ;
char pr oj ect i d[ 9] ;
char depends_on[ 9] ;
sql i nt 32 pat ch_count ;
sql i nt 32 downl oad_count ;
sql i nt 32 bugi d;
char descr i pt i on[ 255] ;
EXEC SQL END DECLARE SECTI ON;



voi d quer y1( ) {
pr i nt f ( " di spl ayi ng quer y 1\ n" ) ;
get char ( ) ;

EXEC SQL DECLARE cur 1 CURSOR FOR
SELECT DI STI NCT DEVELOPER. USER_I D, USER. NAME
FROM DEVELOPER, USER, PROJ ECT
WHERE DEVELOPER. USER_I D=OWNED_BY
AND DEVELOPER. USER_I D=USER. USER_I D;
sql er r ( " DECLARE cur 1" ) ;

EXEC SQL OPEN cur 1;
sql er r ( " OPEN cur 1" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 1 I NTO : user i d,
: user name;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " USER_I D NAME\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( user i d) ;
depad( user name) ;
spr i nt f ( buf f er , " %s" , user i d) ;
whi l e( st r l en( buf f er ) <10) st r cat ( buf f er , " " ) ;
st r cat ( buf f er , user name) ;
pr i nt f ( " %s\ n" , buf f er ) ;
count ++;
}

EXEC SQL CLOSE cur 1;
sql er r ( " CLOSE cur 1" ) ;

pr i nt f ( " %d r ecor d( s) sel ect ed\ n" , count ) ;
get char ( ) ;
}

voi d quer y2( ) {
pr i nt f ( " di spl ayi ng quer y 2\ n" ) ;
get char ( ) ;

EXEC SQL DECLARE cur 2 CURSOR FOR
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

60

SELECT PROJ ECT_I D


FROM ( SELECT PROJ ECT. PROJ ECT_I D, C
FROM PROJ ECT, ( SELECT PROJ ECT_I D, COUNT( *) AS C
FROM PATCH
GROUP BY PROJ ECT_I D) AS T
WHERE PROJ ECT. PROJ ECT_I D=T. PROJ ECT_I D)
WHERE C > 2;
sql er r ( " DECLARE cur 2" ) ;


EXEC SQL OPEN cur 2;
sql er r ( " OPEN cur 2" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 2 I NTO : pr oj ect i d;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " PROJ ECT_I D\ n" ) ;
pr i nt f ( " - - - - - - - - \ n" ) ;
}
depad( pr oj ect i d) ;
pr i nt f ( " %s\ n" , pr oj ect i d) ;
count ++;
}

EXEC SQL CLOSE cur 2;
sql er r ( " CLOSE cur 2" ) ;

pr i nt f ( " %d r ecor d( s) sel ect ed\ n" , count ) ;
get char ( ) ;
}

voi d quer y3( ) {
pr i nt f ( " di spl ayi ng quer y 3\ n" ) ;
get char ( ) ;

EXEC SQL DECLARE cur 3 CURSOR FOR
SELECT T. PROJ ECT_I D, PATCH_COUNT, DOWNLOAD_COUNT
FROM ( SELECT PROJ ECT_I D, COUNT( *) AS PATCH_COUNT
FROM PATCH
GROUP BY PROJ ECT_I D) AS T,
( SELECT PROJ ECT_I D, COUNT( *) AS DOWNLOAD_COUNT
FROM DOWNLOAD
GROUP BY PROJ ECT_I D) AS S
WHERE T. PROJ ECT_I D=S. PROJ ECT_I D;
sql er r ( " DECLARE cur 3" ) ;


EXEC SQL OPEN cur 3;
sql er r ( " OPEN cur 3" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 3 I NTO : pr oj ect i d,
: pat ch_count ,
: downl oad_count ;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

61

i f ( SQLCODE! =0) br eak;


i f ( count ==0) {
pr i nt f ( " PROJ ECT_I D PATCH COUNT DOWNLOAD COUNT\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( pr oj ect i d) ;
spr i nt f ( buf f er , " %s" , pr oj ect i d) ;
whi l e( st r l en( buf f er ) < 16) st r cat ( buf f er , " " ) ;
spr i nt f ( &buf f er [ 16] , " %d" , pat ch_count ) ;
whi l e( st r l en( buf f er ) < 30) st r cat ( buf f er , " " ) ;
spr i nt f ( &buf f er [ 30] , " %d" , downl oad_count ) ;
pr i nt f ( " %s\ n" , buf f er ) ;
count ++;
}
EXEC SQL CLOSE cur 3;
sql er r ( " CLOSE cur 3" ) ;

pr i nt f ( " %d r ecor d( s) sel ect ed\ n" , count ) ;
get char ( ) ;
}

voi d quer y4( ) {
pr i nt f ( " di spl ayi ng quer y 4\ n" ) ;
get char ( ) ;

EXEC SQL DECLARE cur 4 CURSOR FOR
SELECT PROJ ECT_I D
FROM ( SELECT PROJ ECT_I D, COUNT( *) AS DOWNLOAD_COUNT
FROM DOWNLOAD
GROUP BY PROJ ECT_I D) ,
( SELECT MAX( DC) AS MAXDC
FROM ( SELECT COUNT( *) AS DC
FROM DOWNLOAD
GROUP BY PROJ ECT_I D) )
WHERE DOWNLOAD_COUNT=MAXDC;
sql er r ( " DECLARE cur 4" ) ;

EXEC SQL OPEN cur 4;
sql er r ( " OPEN cur 4" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 4 I NTO : pr oj ect i d;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " PROJ ECT_I D\ n" ) ;
pr i nt f ( " - - - - - - - - \ n" ) ;
}
depad( pr oj ect i d) ;
pr i nt f ( " %s\ n" , pr oj ect i d) ;
count ++;
}

EXEC SQL CLOSE cur 4;
sql er r ( " CLOSE cur 4" ) ;

pr i nt f ( " %d r ecor d( s) sel ect ed\ n" , count ) ;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

62

get char ( ) ;
}

voi d quer y5( ) {
pr i nt f ( " di spl ayi ng quer y 5\ n" ) ;
get char ( ) ;

EXEC SQL DECLARE cur 5 CURSOR FOR
SELECT PROJ ECT_I D
FROM ( SELECT PROJ ECT_I D, COUNT( *) AS PATCH_COUNT
FROM PATCH
GROUP BY PROJ ECT_I D) ,
( SELECT MAX( PC) AS MAXPC
FROM ( SELECT COUNT( *) AS PC
FROM PATCH
GROUP BY PROJ ECT_I D) )
WHERE PATCH_COUNT=MAXPC;
sql er r ( " DECLARE cur 5" ) ;


EXEC SQL OPEN cur 5;
sql er r ( " OPEN cur 5" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 5 I NTO : pr oj ect i d;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " PROJ ECT_I D\ n" ) ;
pr i nt f ( " - - - - - - - - \ n" ) ;
}
depad( pr oj ect i d) ;
pr i nt f ( " %s\ n" , pr oj ect i d) ;
count ++;
}

EXEC SQL CLOSE cur 5;
sql er r ( " CLOSE cur 5" ) ;

pr i nt f ( " %d r ecor d( s) sel ect ed\ n" , count ) ;
get char ( ) ;
}

voi d quer y6( ) {
pr i nt f ( " di spl ayi ng quer y 6\ n" ) ;
get char ( ) ;

EXEC SQL DECLARE cur 6 CURSOR FOR
SELECT * FROM DEPENDS;
sql er r ( " DECLARE cur 6" ) ;


EXEC SQL OPEN cur 6;
sql er r ( " OPEN cur 6" ) ;

count =0;
whi l e( 1) {
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

63

EXEC SQL FETCH cur 6 I NTO : pr oj ect i d,


: depends_on;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " PROJ ECT_I D DEPENDS_ON\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( pr oj ect i d) ;
depad( depends_on) ;
spr i nt f ( buf f er , " %s" , pr oj ect i d) ;
whi l e( st r l en( buf f er ) <12) st r cat ( buf f er , " " ) ;
st r cat ( buf f er , depends_on) ;
pr i nt f ( " %s\ n" , buf f er ) ;
count ++;
}
EXEC SQL CLOSE cur 6;
sql er r ( " CLOSE cur 6" ) ;

pr i nt f ( " %d r ecor d( s) sel ect ed\ n" , count ) ;
get char ( ) ;
}

voi d quer y7( ) {
pr i nt f ( " di spl ayi ng quer y 7\ n" ) ;
get char ( ) ;

EXEC SQL DECLARE cur 7 CURSOR FOR
( SELECT di st i nct PROJ ECT_I D
FROM PROJ ECT)
EXCEPT
( SELECT PROJ ECT_I D
FROM DEPENDS) ;
sql er r ( " DECLARE cur 7" ) ;


EXEC SQL OPEN cur 7;
sql er r ( " OPEN cur 7" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 7 I NTO : pr oj ect i d;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " PROJ ECT_I D\ n" ) ;
pr i nt f ( " - - - - - - - - \ n" ) ;
}
depad( pr oj ect i d) ;
pr i nt f ( " %s\ n" , pr oj ect i d) ;
count ++;
}

EXEC SQL CLOSE cur 7;
sql er r ( " CLOSE cur 7" ) ;

pr i nt f ( " %d r ecor d( s) sel ect ed\ n" , count ) ;
get char ( ) ;
}
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

64


voi d quer y8( ) {
pr i nt f ( " di spl ayi ng quer y 8\ n" ) ;
get char ( ) ;

EXEC SQL DECLARE cur 8 CURSOR FOR
SELECT T. PROJ ECT_I D
FROM ( SELECT PROJ ECT_I D, COUNT( *) AS DEPEND_COUNT
FROM DEPENDS
GROUP BY PROJ ECT_I D) AS T,
( SELECT MAX( DC) AS MAXDC
FROM ( SELECT COUNT( *) AS DC
FROM DEPENDS
GROUP BY PROJ ECT_I D) )
WHERE T. DEPEND_COUNT = MAXDC;
sql er r ( " DECLARE cur 8" ) ;

EXEC SQL OPEN cur 8;
sql er r ( " OPEN cur 8" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 8 I NTO : pr oj ect i d;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " PROJ ECT_I D\ n" ) ;
pr i nt f ( " - - - - - - - - \ n" ) ;
}
depad( pr oj ect i d) ;
pr i nt f ( " %s\ n" , pr oj ect i d) ;
count ++;
}

EXEC SQL CLOSE cur 8;
sql er r ( " CLOSE cur 8" ) ;

pr i nt f ( " %d r ecor d( s) sel ect ed\ n" , count ) ;
get char ( ) ;
}

voi d quer y9( ) {
pr i nt f ( " di spl ayi ng quer y 9\ n" ) ;
get char ( ) ;

EXEC SQL DECLARE cur 9 CURSOR FOR
SELECT BUG_I D, BUG. PROJ ECT_I D, DESCRI PTI ON
FROM BUG, ( SELECT T. PROJ ECT_I D, T. BC
FROM ( SELECT PROJ ECT_I D, COUNT( *) AS BC
FROM BUG
GROUP BY PROJ ECT_I D) AS T,
( SELECT MAX( BC1) AS MAXBC
FROM ( SELECT COUNT( *) AS BC1
FROM BUG
GROUP BY PROJ ECT_I D) )
WHERE T. BC=MAXBC) AS S
WHERE BUG. PROJ ECT_I D=S. PROJ ECT_I D;
sql er r ( " DECLARE cur 9" ) ;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

65


EXEC SQL OPEN cur 9;
sql er r ( " OPEN cur 9" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 9 I NTO : bugi d,
: pr oj ect i d,
: descr i pt i on;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " BUG_I D PROJ ECT_I D DESCRI PTI ON\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( pr oj ect i d) ;
depad( descr i pt i on) ;
descr i pt i on[ 16] =' \ 0' ;
spr i nt f ( buf f er , " %d" , bugi d) ;
whi l e( st r l en( buf f er ) <10) st r cat ( buf f er , " " ) ;
st r cat ( buf f er , pr oj ect i d) ;
whi l e( st r l en( buf f er ) <20) st r cat ( buf f er , " " ) ;
st r cat ( buf f er , descr i pt i on) ;
pr i nt f ( " %s\ n" , buf f er ) ;
count ++;
}

EXEC SQL CLOSE cur 9;
sql er r ( " CLOSE cur 9" ) ;

pr i nt f ( " %d r ecor d( s) sel ect ed\ n" , count ) ;
get char ( ) ;
}

voi d quer y10( ) {
pr i nt f ( " di spl ayi ng quer y 10\ n" ) ;
get char ( ) ;

EXEC SQL DECLARE cur 10 CURSOR FOR
SELECT USER_I D
FROM ( SELECT USER_I D, COUNT( *) AS BPD
FROM ( SELECT BUG_I D, BUG. PROJ ECT_I D, USER_I D
FROM BUG, PROJ ECT, DEVELOPER
WHERE BUG. PROJ ECT_I D=PROJ ECT. PROJ ECT_I D
AND OWNED_BY=USER_I D)
GROUP BY USER_I D)
WHERE BPD I N ( SELECT MI N( BPD) AS MI NBPD
FROM ( SELECT USER_I D, COUNT( *) AS BPD
FROM ( SELECT BUG_I D, BUG. PROJ ECT_I D, USER_I D
FROM BUG, PROJ ECT, DEVELOPER
WHERE BUG. PROJ ECT_I D=PROJ ECT. PROJ ECT_I D
AND OWNED_BY=USER_I D)
GROUP BY USER_I D) ) ;
sql er r ( " DECLARE cur 10" ) ;

EXEC SQL OPEN cur 10;
sql er r ( " OPEN cur 10" ) ;

Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

66

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 10 I NTO : user i d;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " USER_I D\ n" ) ;
pr i nt f ( " - - - - - - - - \ n" ) ;
}
depad( user i d) ;
pr i nt f ( " %s\ n" , user i d) ;
count ++;
}

EXEC SQL CLOSE cur 10;
sql er r ( " CLOSE cur 10" ) ;

pr i nt f ( " %d r ecor d( s) sel ect ed\ n" , count ) ;
get char ( ) ;
}

Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

67

Appendix 8: Tour Operator System Application Program



Write a simple C program with embedded SQL that works with the database OURDB designed and
created in Sections 11.1-11.4 . The program is simple. In a loop it prompts the user to enter a number. If
the number entered is 1 to 15, the program executes the query of that number from Section 11.5,
otherwise it terminates the loop and the whole program.
#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>
#i ncl ude <st r i ng. h>

EXEC SQL I NCLUDE SQLCA;

i nt connect ed=0;

voi d quer y1( ) ;
voi d quer y2( ) ;
voi d quer y3( ) ;
voi d quer y4( ) ;
voi d quer y5( ) ;
voi d quer y6( ) ;
voi d quer y7( ) ;
voi d quer y8( ) ;
voi d quer y9( ) ;
voi d quer y10( ) ;
voi d quer y11( ) ;
voi d quer y12( ) ;
voi d quer y13( ) ;
voi d quer y14( ) ;
voi d quer y15( ) ;

EXEC SQL BEGI N DECLARE SECTI ON;
shor t PI D;
char NAME[ 21] ;
char COUNTRY[ 4] , CI TY[ 11] , STREET[ 11] , STRNO[ 11] , POBox[ 11] ;
shor t STREET_I ND, STRNO_I ND, POBox_I ND;
doubl e AMOUNT, PENALTY;
char DESI G[ 6] ;
char VALI D_DATE[ 10] , PRI CI NG[ 2] , FROMD[ 10] , TOD[ 10] , DESI GN[ 11] ;
shor t MI NP, MAXP;
EXEC SQL END DECLARE SECTI ON;

i nt f i r st ;
char l i ne[ 100] ;
i nt t ab1, t ab2, t ab3, t ab4, t ab5, t ab6, t ab7, t ab8;

voi d sql er r ( char * x) {

i f ( SQLCODE! =0) {
pr i nt f ( " er r or %s\ n" , x) ;
i f ( connect ed)
EXEC SQL CONNECT RESET;
exi t ( 1) ;
}
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

68


}

i nt mai n( ) {

i nt i , c;

EXEC SQL CONNECT TO OURDB;
sql er r ( " CONNECT TO OURDB" ) ;
pr i nt f ( " Connect ed t o OURDB\ n" ) ;
connect ed = 1;

agai n:
pr i nt f ( " ent er t he number of t he quer y : " ) ; f f l ush( st dout ) ;
i = 0;
whi l e( ( c = get char ( ) ) ! = ' \ n' ) {
i f ( c < ' 0' | | c > ' 9' ) {
pr i nt f ( " i ncor r ect ent r y, r edo\ n" ) ;
got o agai n;
}
i = 10*i +c- ' 0' ;
i f ( i > 15) {
pr i nt f ( " i ncor r ect ent r y, r edo\ n" ) ;
got o agai n;
}
}/ / endwhi l e
i f ( i < 1 | | i > 15) {
pr i nt f ( " i ncor r ect ent r y, r edo\ n" ) ;
got o agai n;
}
pr i nt f ( " goi ng t o per f or mquer y %d\ n" , i ) ;

i f ( i == 1)
quer y1( ) ;
el se i f ( i == 2)
quer y2( ) ;
el se i f ( i == 3)
quer y3( ) ;
el se i f ( i == 4)
quer y4( ) ;
el se i f ( i == 5)
quer y5( ) ;
el se i f ( i == 6)
quer y6( ) ;
el se i f ( i == 7)
quer y7( ) ;
el se i f ( i == 8)
quer y8( ) ;
el se i f ( i == 9)
quer y9( ) ;
el se i f ( i == 10)
quer y10( ) ;
el se i f ( i == 11)
quer y11( ) ;
el se i f ( i == 12)
quer y12( ) ;
el se i f ( i == 13)
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

69

quer y13( ) ;
el se i f ( i == 14)
quer y14( ) ;
el se
quer y15( ) ;

EXEC SQL CONNECT RESET;
sql er r ( " CONNECT RESET" ) ;
pr i nt f ( " Di sconnect ed f r omOURDB\ n" ) ;
r et ur n 0;
}

voi d quer y1( ) {

EXEC SQL DECLARE cur 1 CURSOR FOR
SELECT CUSTOMERS. PI D, NAME
FROM CUSTOMERS, PERSONS
WHERE CUSTOMERS. PI D=PERSONS. PI D;

EXEC SQL OPEN cur 1;
sql er r ( " OPEN cur 1" ) ;

t ab1=7;

f i r st =1;
whi l e( 1) {
EXEC SQL FETCH cur 1 I NTO : PI D,
: NAME;
i f ( SQLCODE! =0) br eak;
i f ( f i r st ) {
pr i nt f ( " PI D Name\ n" ) ;
f i r st =0;
}
spr i nt f ( l i ne, " %d" , PI D) ;
whi l e( st r l en( l i ne) < t ab1) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , NAME) ;
pr i nt f ( " %s\ n" , l i ne) ;
}

EXEC SQL CLOSE cur 1;
sql er r ( " CLOSE cur 1" ) ;
}

voi d quer y2( ) {

EXEC SQL DECLARE cur 2 CURSOR FOR
SELECT CUSTOMERS. PI D, NAME, COUNTRY, CI TY, STREET, STRNO, POBox
FROM CUSTOMERS, PERSONS, ADDRESSES, HASA
WHERE CUSTOMERS. PI D=HASA. PI D
AND HASA. adI D=ADDRESSES. adI D
AND CUSTOMERS. PI D=PERSONS. PI D;

EXEC SQL OPEN cur 2;
sql er r ( " OPEN cur 2" ) ;

t ab1=7;
t ab2=18;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

70

t ab3=28;
t ab4=41;
t ab5=56;
t ab6=66;

f i r st =1;
whi l e( 1) {
EXEC SQL FETCH cur 2 I NTO : PI D,
: NAME,
: COUNTRY,
: CI TY,
: STREET: STREET_I ND,
: STRNO: STRNO_I ND,
: POBox: POBox_I ND;
i f ( SQLCODE! =0) br eak;
i f ( f i r st ) {
pr i nt f (
" PI D NAME COUNTRY CI TY STREET STRNO POBox\ n" ) ;
f i r st =0;
}

spr i nt f ( l i ne, " %d" , PI D) ;
whi l e( st r l en( l i ne) < t ab1) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , NAME) ;
whi l e( st r l en( l i ne) < t ab2) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , COUNTRY) ;
whi l e( st r l en( l i ne) < t ab3) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , CI TY) ;
whi l e( st r l en( l i ne) < t ab4) st r cat ( l i ne, " " ) ;
i f ( STREET_I ND==0)
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , STREET) ;
el se
spr i nt f ( l i ne+st r l en( l i ne) , " - - " ) ;
whi l e( st r l en( l i ne) < t ab5) st r cat ( l i ne, " " ) ;
i f ( STRNO_I ND==0)
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , STRNO) ;
el se
spr i nt f ( l i ne+st r l en( l i ne) , " - - " ) ;
whi l e( st r l en( l i ne) < t ab6) st r cat ( l i ne, " " ) ;
i f ( POBox_I ND==0)
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , POBox) ;
el se
spr i nt f ( l i ne+st r l en( l i ne) , " - - " ) ;
pr i nt f ( " %s\ n" , l i ne) ;

}/ * endwhi l e */


EXEC SQL CLOSE cur 2;
sql er r ( " CLOSE cur 2" ) ;
}

voi d quer y3( ) {

EXEC SQL DECLARE cur 3 CURSOR FOR
SELECT HASCO. PI D, NAME, DESI G, AMOUNT
FROM HASCO, PERSONS
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

71

WHERE HASCO. PI D=0


AND PERSONS. PI D=0;

EXEC SQL OPEN cur 3;
sql er r ( " OPEN cur 3" ) ;

t ab1=7;
t ab2=18;
t ab3=28;

f i r st =1;
whi l e( 1) {
EXEC SQL FETCH cur 3 I NTO : PI D,
: NAME,
: DESI G,
: AMOUNT;
i f ( SQLCODE! =0) br eak;
i f ( f i r st ) {
pr i nt f (
" PI D NAME DESI G AMOUNT\ n" ) ;
f i r st =0;
}

spr i nt f ( l i ne, " %d" , PI D) ;
whi l e( st r l en( l i ne) < t ab1) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , NAME) ;
whi l e( st r l en( l i ne) < t ab2) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , DESI G) ;
whi l e( st r l en( l i ne) < t ab3) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %f " , AMOUNT) ;
pr i nt f ( " %s\ n" , l i ne) ;

}/ * endwhi l e */


EXEC SQL CLOSE cur 3;
sql er r ( " CLOSE cur 3" ) ;
}

voi d quer y4( ) {

EXEC SQL DECLARE cur 4 CURSOR FOR
SELECT CUSTOMERS. PI D, NAME
FROM PERSONS, CUSTOMERS, GUI DES
WHERE CUSTOMERS. PI D=GUI DES. PI D
AND CUSTOMERS. PI D=PERSONS. PI D;

EXEC SQL OPEN cur 4;
sql er r ( " OPEN cur 4" ) ;

t ab1=7;

f i r st =1;
whi l e( 1) {
EXEC SQL FETCH cur 4 I NTO : PI D,
: NAME;
i f ( SQLCODE! =0) br eak;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

72

i f ( f i r st ) {
pr i nt f (
" PI D NAME\ n" ) ;
f i r st =0;
}

spr i nt f ( l i ne, " %d" , PI D) ;
whi l e( st r l en( l i ne) < t ab1) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , NAME) ;
pr i nt f ( " %s\ n" , l i ne) ;

}/ * endwhi l e */

EXEC SQL CLOSE cur 4;
sql er r ( " CLOSE cur 4" ) ;
}

voi d quer y5( ) {

EXEC SQL DECLARE cur 5 CURSOR FOR
SELECT DI STI NCT HASCO. PI D, NAME
FROM HASCO, I SLP, PERSONS
WHERE HASCO. DESI G=I SLP. DESI G
AND I SLP. adI D=100
AND HASCO. PI D=PERSONS. PI D;

EXEC SQL OPEN cur 5;
sql er r ( " OPEN cur 5" ) ;

t ab1=7;

f i r st =1;
whi l e( 1) {
EXEC SQL FETCH cur 5 I NTO : PI D,
: NAME;
i f ( SQLCODE! =0) br eak;
i f ( f i r st ) {
pr i nt f (
" PI D NAME\ n" ) ;
f i r st =0;
}

spr i nt f ( l i ne, " %d" , PI D) ;
whi l e( st r l en( l i ne) < t ab1) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , NAME) ;
pr i nt f ( " %s\ n" , l i ne) ;

}/ * endwhi l e */

EXEC SQL CLOSE cur 5;
sql er r ( " CLOSE cur 5" ) ;
}

voi d quer y6( ) {

EXEC SQL DECLARE cur 6 CURSOR FOR
SELECT DI STI NCT AMOUNT,
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

73

VALI D_DATE,
PRI CI NG,
FROMD,
TOD,
MI NP,
MAXP,
PENALTY,
DESI G
FROM I SDP
WHERE adI D=103;

EXEC SQL OPEN cur 6;
sql er r ( " OPEN cur 6" ) ;

t ab1=8;
t ab2=20;
t ab3=29;
t ab4=38;
t ab5=45;
t ab6=51;
t ab7=57;
t ab8=66;

f i r st =1;
whi l e( 1) {
EXEC SQL FETCH cur 6 I NTO : AMOUNT,
: VALI D_DATE,
: PRI CI NG,
: FROMD,
: TOD,
: MI NP,
: MAXP,
: PENALTY,
: DESI G;
i f ( SQLCODE! =0) br eak;
i f ( f i r st ) {
pr i nt f (
" AMOUNT VALI D_DATE PRI CI NG FROMD TOD MI NP MAXP PENALTY DESI G\ n" ) ;
f i r st =0;
}

spr i nt f ( l i ne, " %f " , AMOUNT) ;
whi l e( st r l en( l i ne) < t ab1) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , VALI D_DATE) ;
whi l e( st r l en( l i ne) < t ab2) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , PRI CI NG) ;
whi l e( st r l en( l i ne) < t ab3) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , FROMD) ;
whi l e( st r l en( l i ne) < t ab4) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , TOD) ;
whi l e( st r l en( l i ne) < t ab5) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %u" , MI NP) ;
whi l e( st r l en( l i ne) < t ab6) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %u" , MAXP) ;
whi l e( st r l en( l i ne) < t ab7) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %f " , PENALTY) ;
whi l e( st r l en( l i ne) < t ab8) st r cat ( l i ne, " " ) ;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

74

spr i nt f ( l i ne+st r l en( l i ne) , " %s" , DESI G) ;


pr i nt f ( " %s\ n" , l i ne) ;

}/ * endwhi l e */

EXEC SQL CLOSE cur 6;
sql er r ( " CLOSE cur 6" ) ;
}

voi d quer y7( ) {

EXEC SQL DECLARE cur 7 CURSOR FOR
SELECT DI STI NCT PLACES. DESI GN
FROM PLACES, I SSP
WHERE PLACES. adI D=I SSP. adI D;

EXEC SQL OPEN cur 7;
sql er r ( " OPEN cur 7" ) ;

f i r st =1;
whi l e( 1) {
EXEC SQL FETCH cur 7 I NTO : DESI GN;
i f ( SQLCODE! =0) br eak;
i f ( f i r st ) {
pr i nt f (
" DESI GN\ n" ) ;
f i r st =0;
}

spr i nt f ( l i ne, " %s" , DESI GN) ;
pr i nt f ( " %s\ n" , l i ne) ;

}/ * endwhi l e */

EXEC SQL CLOSE cur 7;
sql er r ( " CLOSE cur 7" ) ;
}

voi d quer y8( ) {

EXEC SQL DECLARE cur 8 CURSOR FOR
SELECT TOURS. DESI G
FROM TOURS, I SBP
WHERE TOURS. DESI G=I SBP. DESI G
AND I SBP. DATE=' 12/ 18/ 2002'
AND adI D=100;

EXEC SQL OPEN cur 8;
sql er r ( " OPEN cur 8" ) ;

f i r st =1;
whi l e( 1) {
EXEC SQL FETCH cur 8 I NTO : DESI G;
i f ( SQLCODE! =0) br eak;
i f ( f i r st ) {
pr i nt f (
" DESI G\ n" ) ;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

75

f i r st =0;
}

spr i nt f ( l i ne, " %s" , DESI G) ;
pr i nt f ( " %s\ n" , l i ne) ;

}/ * endwhi l e */

EXEC SQL CLOSE cur 8;
sql er r ( " CLOSE cur 8" ) ;

}

voi d quer y9( ) {

EXEC SQL DECLARE cur 9 CURSOR FOR
SELECT DI STI NCT EMPLOYEES. PI D, NAME
FROM EMPLOYEES, GUI DES, CUSTOMERS, PERSONS
WHERE ( EMPLOYEES. PI D=GUI DES. PI D
OR EMPLOYEES. PI D=CUSTOMERS. PI D)
AND EMPLOYEES. PI D=PERSONS. PI D;

EXEC SQL OPEN cur 9;
sql er r ( " OPEN cur 9" ) ;

t ab1=7;

f i r st =1;
whi l e( 1) {
EXEC SQL FETCH cur 9 I NTO : PI D,
: NAME;
i f ( SQLCODE! =0) br eak;
i f ( f i r st ) {
pr i nt f (
" PI D NAME\ n" ) ;
f i r st =0;
}

spr i nt f ( l i ne, " %d" , PI D) ;
whi l e( st r l en( l i ne) < t ab1) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , NAME) ;
pr i nt f ( " %s\ n" , l i ne) ;

}/ * endwhi l e */

EXEC SQL CLOSE cur 9;
sql er r ( " CLOSE cur 9" ) ;
}

voi d quer y10( ) {

EXEC SQL DECLARE cur 10 CURSOR FOR
SELECT DI STI NCT PARTI CI P. PI D, NAME
FROM PARTI CI P, I TI NERARI ES, PERSONS
WHERE PARTI CI P. DESI G=I TI NERARI ES. DESI G
AND I TI NERARI ES. DATE >= ' 12/ 18/ 2003'
AND PARTI CI P. PI D=PERSONS. PI D
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

76

AND NOT EXI STS ( SELECT I TI NERARI ES. DATE


FROM I TI NERARI ES
WHERE I TI NERARI ES. DATE < ' 12/ 18/ 2003'
AND I TI NERARI ES. DESI G=PARTI CI P. DESI G) ;

EXEC SQL OPEN cur 10;
sql er r ( " OPEN cur 10" ) ;

t ab1=7;

f i r st =1;
whi l e( 1) {
EXEC SQL FETCH cur 10 I NTO : PI D,
: NAME;
i f ( SQLCODE! =0) br eak;
i f ( f i r st ) {
pr i nt f (
" PI D NAME\ n" ) ;
f i r st =0;
}

spr i nt f ( l i ne, " %d" , PI D) ;
whi l e( st r l en( l i ne) < t ab1) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , NAME) ;
pr i nt f ( " %s\ n" , l i ne) ;

}/ * endwhi l e */

EXEC SQL CLOSE cur 10;
sql er r ( " CLOSE cur 10" ) ;
}

voi d quer y11( ) {

EXEC SQL DECLARE cur 11 CURSOR FOR
SELECT DI STI NCT AMOUNT,
VALI D_DATE,
PRI CI NG,
FROMD,
TOD,
MI NP,
MAXP,
PENALTY,
DESI G
FROM I SBP
WHERE adI D = 100
UNI ON
SELECT DI STI NCT AMOUNT,
VALI D_DATE,
PRI CI NG,
FROMD,
TOD,
MI NP,
MAXP,
PENALTY,
DESI G
FROM I SLP
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

77

WHERE adI D = 100


UNI ON
SELECT DI STI NCT AMOUNT,
VALI D_DATE,
PRI CI NG,
FROMD,
TOD,
MI NP,
MAXP,
PENALTY,
DESI G
FROM I SDP
WHERE adI D = 100
UNI ON
SELECT DI STI NCT AMOUNT,
VALI D_DATE,
PRI CI NG,
FROMD,
TOD,
MI NP,
MAXP,
PENALTY,
DESI G
FROM I SSP
WHERE adI D = 100;

EXEC SQL OPEN cur 11;
sql er r ( " OPEN cur 11" ) ;

t ab1=8;
t ab2=20;
t ab3=29;
t ab4=38;
t ab5=45;
t ab6=51;
t ab7=57;
t ab8=66;



f i r st =1;
whi l e( 1) {
EXEC SQL FETCH cur 11 I NTO : AMOUNT,
: VALI D_DATE,
: PRI CI NG,
: FROMD,
: TOD,
: MI NP,
: MAXP,
: PENALTY,
: DESI G;
i f ( SQLCODE! =0) br eak;
i f ( f i r st ) {
pr i nt f (
" AMOUNT VALI D_DATE PRI CI NG FROMD TOD MI NP MAXP PENALTY DESI G\ n" ) ;
f i r st =0;
}
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

78


spr i nt f ( l i ne, " %f " , AMOUNT) ;
whi l e( st r l en( l i ne) < t ab1) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , VALI D_DATE) ;
whi l e( st r l en( l i ne) < t ab2) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , PRI CI NG) ;
whi l e( st r l en( l i ne) < t ab3) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , FROMD) ;
whi l e( st r l en( l i ne) < t ab4) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , TOD) ;
whi l e( st r l en( l i ne) < t ab5) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %u" , MI NP) ;
whi l e( st r l en( l i ne) < t ab6) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %u" , MAXP) ;
whi l e( st r l en( l i ne) < t ab7) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %f " , PENALTY) ;
whi l e( st r l en( l i ne) < t ab8) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , DESI G) ;
pr i nt f ( " %s\ n" , l i ne) ;

}/ * endwhi l e */

EXEC SQL CLOSE cur 11;
sql er r ( " CLOSE cur 11" ) ;
}

voi d quer y12( ) {

EXEC SQL DECLARE cur 12 CURSOR FOR
SELECT DI STI NCT AMOUNT,
VALI D_DATE,
PRI CI NG,
FROMD,
TOD,
MI NP,
MAXP,
PENALTY,
DESI G
FROM I SBP, PLACES
WHERE I SBP. adI D=PLACES. adI D
AND PLACES. DESI GN=' pr ov1'
UNI ON
SELECT DI STI NCT AMOUNT,
VALI D_DATE,
PRI CI NG,
FROMD,
TOD,
MI NP,
MAXP,
PENALTY,
DESI G
FROM I SLP, PLACES
WHERE I SLP. adI D=PLACES. adI D
AND PLACES. DESI GN=' pr ov1'
UNI ON
SELECT DI STI NCT AMOUNT,
VALI D_DATE,
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

79

PRI CI NG,
FROMD,
TOD,
MI NP,
MAXP,
PENALTY,
DESI G
FROM I SDP, PLACES
WHERE I SDP. adI D=PLACES. adI D
AND PLACES. DESI GN=' pr ov1'
UNI ON
SELECT DI STI NCT AMOUNT,
VALI D_DATE,
PRI CI NG,
FROMD,
TOD,
MI NP,
MAXP,
PENALTY,
DESI G
FROM I SSP, PLACES
WHERE I SSP. adI D=PLACES. adI D
AND PLACES. DESI GN=' pr ov1' ;

EXEC SQL OPEN cur 12;
sql er r ( " OPEN cur 12" ) ;

t ab1=8;
t ab2=20;
t ab3=29;
t ab4=38;
t ab5=45;
t ab6=51;
t ab7=57;
t ab8=66;


f i r st =1;
whi l e( 1) {
EXEC SQL FETCH cur 12 I NTO : AMOUNT,
: VALI D_DATE,
: PRI CI NG,
: FROMD,
: TOD,
: MI NP,
: MAXP,
: PENALTY,
: DESI G;
i f ( SQLCODE! =0) br eak;
i f ( f i r st ) {
pr i nt f (
" AMOUNT VALI D_DATE PRI CI NG FROMD TOD MI NP MAXP PENALTY DESI G\ n" ) ;
f i r st =0;
}

spr i nt f ( l i ne, " %f " , AMOUNT) ;
whi l e( st r l en( l i ne) < t ab1) st r cat ( l i ne, " " ) ;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

80

spr i nt f ( l i ne+st r l en( l i ne) , " %s" , VALI D_DATE) ;


whi l e( st r l en( l i ne) < t ab2) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , PRI CI NG) ;
whi l e( st r l en( l i ne) < t ab3) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , FROMD) ;
whi l e( st r l en( l i ne) < t ab4) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , TOD) ;
whi l e( st r l en( l i ne) < t ab5) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %u" , MI NP) ;
whi l e( st r l en( l i ne) < t ab6) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %u" , MAXP) ;
whi l e( st r l en( l i ne) < t ab7) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %f " , PENALTY) ;
whi l e( st r l en( l i ne) < t ab8) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , DESI G) ;
pr i nt f ( " %s\ n" , l i ne) ;

}/ * endwhi l e */

EXEC SQL CLOSE cur 12;
sql er r ( " CLOSE cur 12" ) ;

}

voi d quer y13( ) {

EXEC SQL DECLARE cur 13 CURSOR FOR
SELECT DI STI NCT AMOUNT,
VALI D_DATE,
PRI CI NG,
FROMD,
TOD,
MI NP,
MAXP,
PENALTY,
DESI G
FROM I SBP
WHERE I SBP. DESI G=' t our 1'
UNI ON
SELECT DI STI NCT AMOUNT,
VALI D_DATE,
PRI CI NG,
FROMD,
TOD,
MI NP,
MAXP,
PENALTY,
DESI G
FROM I SLP
WHERE I SLP. DESI G=' t our 1'
UNI ON
SELECT DI STI NCT AMOUNT,
VALI D_DATE,
PRI CI NG,
FROMD,
TOD,
MI NP,
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

81

MAXP,
PENALTY,
DESI G
FROM I SDP
WHERE I SDP. DESI G=' t our 1'
UNI ON
SELECT DI STI NCT AMOUNT,
VALI D_DATE,
PRI CI NG,
FROMD,
TOD,
MI NP,
MAXP,
PENALTY,
DESI G
FROM I SSP
WHERE I SSP. DESI G=' t our 1' ;

EXEC SQL OPEN cur 13;
sql er r ( " OPEN cur 13" ) ;

t ab1=8;
t ab2=20;
t ab3=29;
t ab4=38;
t ab5=45;
t ab6=51;
t ab7=57;
t ab8=66;


f i r st =1;
whi l e( 1) {
EXEC SQL FETCH cur 13 I NTO : AMOUNT,
: VALI D_DATE,
: PRI CI NG,
: FROMD,
: TOD,
: MI NP,
: MAXP,
: PENALTY,
: DESI G;
i f ( SQLCODE! =0) br eak;
i f ( f i r st ) {
pr i nt f (
" AMOUNT VALI D_DATE PRI CI NG FROMD TOD MI NP MAXP PENALTY DESI G\ n" ) ;
f i r st =0;
}

spr i nt f ( l i ne, " %f " , AMOUNT) ;
whi l e( st r l en( l i ne) < t ab1) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , VALI D_DATE) ;
whi l e( st r l en( l i ne) < t ab2) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , PRI CI NG) ;
whi l e( st r l en( l i ne) < t ab3) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , FROMD) ;
whi l e( st r l en( l i ne) < t ab4) st r cat ( l i ne, " " ) ;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

82

spr i nt f ( l i ne+st r l en( l i ne) , " %s" , TOD) ;


whi l e( st r l en( l i ne) < t ab5) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %u" , MI NP) ;
whi l e( st r l en( l i ne) < t ab6) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %u" , MAXP) ;
whi l e( st r l en( l i ne) < t ab7) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %f " , PENALTY) ;
whi l e( st r l en( l i ne) < t ab8) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , DESI G) ;
pr i nt f ( " %s\ n" , l i ne) ;

}/ * endwhi l e */

EXEC SQL CLOSE cur 13;
sql er r ( " CLOSE cur 13" ) ;
}

voi d quer y14( ) {

EXEC SQL DECLARE cur 14 CURSOR FOR
SELECT PI D, AMOUNT
FROM HASCO
WHERE HASCO. DESI G=' t our 1' ;

EXEC SQL OPEN cur 14;
sql er r ( " OPEN cur 14" ) ;

t ab1=7;

f i r st =1;
whi l e( 1) {
EXEC SQL FETCH cur 14 I NTO : PI D,
: AMOUNT;
i f ( SQLCODE! =0) br eak;
i f ( f i r st ) {
pr i nt f ( " PI D Name\ n" ) ;
f i r st =0;
}
spr i nt f ( l i ne, " %d" , PI D) ;
whi l e( st r l en( l i ne) < t ab1) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %f " , AMOUNT) ;
pr i nt f ( " %s\ n" , l i ne) ;

}/ * endwhi l e */


EXEC SQL CLOSE cur 14;
sql er r ( " CLOSE cur 14" ) ;
}

voi d quer y15( ) {

EXEC SQL DECLARE cur 15 CURSOR FOR
SELECT DI STI NCT HASCO. PI D, NAME
FROM HASCO, PLACES, I SLP, PERSONS
WHERE HASCO. DESI G=I SLP. DESI G
AND HASCO. PI D=PERSONS. PI D
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

83

AND I SLP. adI D=103;



EXEC SQL OPEN cur 15;
sql er r ( " OPEN cur 15" ) ;

t ab1=7;

f i r st =1;
whi l e( 1) {
EXEC SQL FETCH cur 15 I NTO : PI D,
: NAME;
i f ( SQLCODE! =0) br eak;
i f ( f i r st ) {
pr i nt f ( " PI D Name\ n" ) ;
f i r st =0;
}
spr i nt f ( l i ne, " %d" , PI D) ;
whi l e( st r l en( l i ne) < t ab1) st r cat ( l i ne, " " ) ;
spr i nt f ( l i ne+st r l en( l i ne) , " %s" , NAME) ;
pr i nt f ( " %s\ n" , l i ne) ;

}/ * endwhi l e */

EXEC SQL CLOSE cur 15;
sql er r ( " CLOSE cur 15" ) ;
}












Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

84

Appendix 9: Warehouse System Application Program



Write a C program with embedded SQL that executes the eight queries from 12.5 and displays their
results on the screen. The high-level behavior of the program is:
1. Connect to database OURDB.
2. Prompt user for a query to be executed (queries are numbered 1 to 8).
3. Execute the query.
4. Display the result of the query on the screen.
5. Repeat 2.
6. Disconnect from the database and terminate the program, if 0 was selected by the user.
The display of the results of the queries is made to look like the one given by the interactive DB2
interpreter.

#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>
#i ncl ude <st r i ng. h>

EXEC SQL I NCLUDE SQLCA;

voi d quer y1( ) ;
voi d quer y2( ) ;
voi d quer y3( ) ;
voi d quer y4( ) ;
voi d quer y5( ) ;
voi d quer y6( ) ;
voi d quer y7( ) ;
voi d quer y8( ) ;

i nt connect ed=0;

voi d sql er r ( char * x) {
i f ( SQLCODE! =0) {
pr i nt f ( " er r or %s ( %d) \ n" , x, SQLCODE) ;
i f ( connect ed) {
EXEC SQL CONNECT RESET;
pr i nt f ( " di sconnect ed f r omOURDB\ n" ) ;
}
exi t ( 1) ;
}
}

voi d connect ( ) {
EXEC SQL CONNECT TO OURDB;
sql er r ( " CONNECT TO OURDB" ) ;
pr i nt f ( " Connect ed t o OURDB\ n" ) ;
connect ed = 1;
}


Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

85

voi d di sconnect ( ) {
EXEC SQL CONNECT RESET;
sql er r ( " CONNECT RESET" ) ;
pr i nt f ( " Di sconnect ed f r omOURDB\ n" ) ;
connect ed = 0;
}

voi d depad( char * s) {
i nt i ;
i =st r l en( s) - 1;
whi l e( s[ i ] ==' ' ) s[ i - - ] =' \ 0' ;
}

char buf f er [ 300] ;

i nt mai n( ) {
i nt i , j ;
connect ( ) ;

whi l e( 1) {
A: pr i nt f ( " ent er number of quer y you want t o execut e ( 1- 8) , 0 t o qui t \ n" ) ;
f get s( buf f er , 300, st di n) ;
i f ( buf f er [ 0] ==' \ n' ) {
pr i nt f ( " not hi ng ent er ed\ n" ) ;
cont i nue;
}
i =j =0;
whi l e( buf f er [ j ] ! =' \ n' ) {
i f ( buf f er [ i ] >=' 0' && buf f er [ i ] <=' 9' )
i = 10*i +buf f er [ i ] - ' 0' ;
el se{
pr i nt f ( " i ncor r ect ent r y\ n" ) ;
got o A;
}
j ++;
}
i f ( i > 8) {
pr i nt f ( " i ncor r ect ent r y\ n" ) ;
got o A;
}
i f ( i == 0) br eak;
el se i f ( i == 1) quer y1( ) ;
el se i f ( i == 2) quer y2( ) ;
el se i f ( i == 3) quer y3( ) ;
el se i f ( i == 4) quer y4( ) ;
el se i f ( i == 5) quer y5( ) ;
el se i f ( i == 6) quer y6( ) ;
el se i f ( i == 7) quer y7( ) ;
el se i f ( i == 8) quer y8( ) ;
el se pr i nt f ( " i ncor r ect ent r y\ n" ) ;
}
di sconnect ( ) ;
r et ur n 0;
}

i nt count , l en, l en1;
char buf 1[ 80] ;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

86


EXEC SQL BEGI N DECLARE SECTI ON;
char empl oyeeno[ 7] ;
char l ast [ 21] ;
char mi ddl e[ 11] ;
char f i r st [ 11] ;
shor t mi ddl e_i nd;
char ar ea_code[ 4] ;
char number [ 7] ;
char par t no[ 6] ;
sql i nt 32 or i g_quant i t y;
sql i nt 32 r emai ni ng_quant i t y;
char bo_dat e[ 11] ;
char backor der ed_by[ 7] ;
char f d[ 11] ;
char war ehousei d[ 5] ;
sql i nt 32 bi nno;
sql i nt 32 r emai ni ng_capaci t y;
char manager no[ 7] ;
sql i nt 32 number _managed;
EXEC SQL END DECLARE SECTI ON;

voi d quer y1( ) {
pr i nt f ( " di spl ayi ng quer y 1\ n" ) ;
EXEC SQL DECLARE cur 1 CURSOR FOR
SELECT WORKER. EMPLOYEENO
FROM WORKER,
( SELECT MANAGER. EMPLOYEENO
FROM MANAGER, HASNAME
WHERE MANAGER. EMPLOYEENO=HASNAME. EMPLOYEENO
AND HASNAME. FI RST=' TONY7'
AND HASNAME. MI DDLE I S NULL
AND HASNAME. LAST=' TONA7' ) AS T
WHERE WORKER. MANAGERNO=T. EMPLOYEENO;
sql er r ( " DECLARE cur 1" ) ;

EXEC SQL OPEN cur 1;
sql er r ( " OPEN cur 1" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 1 I NTO : empl oyeeno;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " EMPLOYEENO\ n" ) ;
pr i nt f ( " - - - - - - - - - - \ n" ) ;
}
depad( empl oyeeno) ;
pr i nt f ( " %s\ n" , empl oyeeno) ;
count ++;
}
EXEC SQL CLOSE cur 1;
sql er r ( " CLOSE cur 1" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

87

voi d quer y2( ) {


pr i nt f ( " di spl ayi ng quer y 2\ n" ) ;
EXEC SQL DECLARE cur 2 CURSOR FOR
SELECT WORKER. EMPLOYEENO, FI RST, MI DDLE, LAST
FROM WORKER, HASNAME
WHERE WORKER. EMPLOYEENO=HASNAME. EMPLOYEENO
ORDER BY LAST, FI RST, MI DDLE;
sql er r ( " DECLARE cur 2" ) ;

EXEC SQL OPEN cur 2;
sql er r ( " OPEN cur 2" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 2 I NTO : empl oyeeno,
: f i r st ,
: mi ddl e: mi ddl e_i nd,
: l ast ;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " EMPLOYEENO FI RST MI DDLE LAST \ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( empl oyeeno) ;
spr i nt f ( buf f er , " %s" , empl oyeeno) ;

f or ( l en=st r l en( buf f er ) ; l en < 12; l en++) st r cat ( buf f er , " " ) ;
depad( f i r st ) ;
spr i nt f ( buf f er +l en, " %s" , f i r st ) ;

f or ( l en=st r l en( buf f er ) ; l en < 23; l en++) st r cat ( buf f er , " " ) ;
i f ( mi ddl e_i nd==0) {
depad( mi ddl e) ;
spr i nt f ( buf f er +l en, " %s" , mi ddl e) ;
}el se
spr i nt f ( buf f er +l en, " - " ) ;

f or ( l en=st r l en( buf f er ) ; l en < 34; l en++) st r cat ( buf f er , " " ) ;
depad( l ast ) ;
spr i nt f ( buf f er +l en, " %s" , l ast ) ;

pr i nt f ( " %s\ n" , buf f er ) ;
count ++;
}
EXEC SQL CLOSE cur 2;
sql er r ( " CLOSE cur 2" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y3( ) {
pr i nt f ( " di spl ayi ng quer y 3\ n" ) ;
EXEC SQL DECLARE cur 3 CURSOR FOR
SELECT MANAGER. EMPLOYEENO, AREA_CODE, NUMBER
FROM MANAGER, HASPHONE
WHERE MANAGER. EMPLOYEENO=HASPHONE. EMPLOYEENO;
sql er r ( " DECLARE cur 3" ) ;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

88



EXEC SQL OPEN cur 3;
sql er r ( " OPEN cur 3" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 3 I NTO : empl oyeeno,
: ar ea_code,
: number ;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " EMPLOYEENO AREA_CODE NUMBER\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( empl oyeeno) ;
spr i nt f ( buf f er , " %s" , empl oyeeno) ;

f or ( l en=st r l en( buf f er ) ; l en < 12; l en++) st r cat ( buf f er , " " ) ;
depad( ar ea_code) ;
spr i nt f ( buf f er +l en, " %s" , ar ea_code) ;

f or ( l en=st r l en( buf f er ) ; l en < 22; l en++) st r cat ( buf f er , " " ) ;
depad( number ) ;
spr i nt f ( buf f er +l en, " %s" , number ) ;

pr i nt f ( " %s\ n" , buf f er ) ;
count ++;
}
EXEC SQL CLOSE cur 3;
sql er r ( " CLOSE cur 3" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y4( ) {
pr i nt f ( " di spl ayi ng quer y 4\ n" ) ;
EXEC SQL DECLARE cur 4 CURSOR FOR
SELECT DI STI NCT ASSEMBLYNO
FROM SUBPART
ORDER BY ASSEMBLYNO;
sql er r ( " DECLARE cur 4" ) ;

EXEC SQL OPEN cur 4;
sql er r ( " OPEN cur 4" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 4 I NTO : par t no;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " PARTNO\ n" ) ;
pr i nt f ( " - - - - - - \ n" ) ;
}
depad( par t no) ;
pr i nt f ( " %s\ n" , par t no) ;
count ++;
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

89

}
EXEC SQL CLOSE cur 4;
sql er r ( " CLOSE cur 4" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y5( ) {
pr i nt f ( " di spl ayi ng quer y 5\ n" ) ;
EXEC SQL DECLARE cur 5 CURSOR FOR
SELECT MANAGER. EMPLOYEENO, PARTNO, ORI G_QUANTI TY, REMAI NI NG_QUANTI TY,
BO_DATE, BACKORDERED_BY
FROM MANAGER, CURRENT_BACKORDER
WHERE MANAGER. EMPLOYEENO=CURRENT_BACKORDER. BACKORDERED_BY;
sql er r ( " DECLARE cur 5" ) ;

EXEC SQL OPEN cur 5;
sql er r ( " OPEN cur 5" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 5 I NTO : empl oyeeno,
: par t no,
: or i g_quant i t y,
: r emai ni ng_quant i t y,
: bo_dat e,
: backor der ed_by;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " EMPLOYEENO PARTNO ORI G_QUANTI TY REMAI NI NG_QUANTI TY BO_DATE
BACKORDERED_BY\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - \ n" ) ;
}
depad( empl oyeeno) ;
spr i nt f ( buf f er , " %s" , empl oyeeno) ;

f or ( l en=st r l en( buf f er ) ; l en < 11; l en++) st r cat ( buf f er , " " ) ;
depad( par t no) ;
spr i nt f ( buf f er +l en, " %s" , par t no) ;

f or ( l en=st r l en( buf f er ) ; l en < 18; l en++) st r cat ( buf f er , " " ) ;
spr i nt f ( buf 1, " %d" , or i g_quant i t y) ;
f or ( l en1=st r l en( buf 1) ; l en1 < 13; l en1++, l en++) st r cat ( buf f er , " " ) ;
spr i nt f ( buf f er +l en, " %s" , buf 1) ;

f or ( l en=st r l en( buf f er ) ; l en < 32; l en++) st r cat ( buf f er , " " ) ;
spr i nt f ( buf 1, " %d" , r emai ni ng_quant i t y) ;
f or ( l en1=st r l en( buf 1) ; l en1 < 18; l en1++, l en++) st r cat ( buf f er , " " ) ;
spr i nt f ( buf f er +l en, " %s" , buf 1) ;

f or ( l en=st r l en( buf f er ) ; l en < 51; l en++) st r cat ( buf f er , " " ) ;
spr i nt f ( buf f er +l en, " %s" , bo_dat e) ;

f or ( l en=st r l en( buf f er ) ; l en < 62; l en++) st r cat ( buf f er , " " ) ;
spr i nt f ( buf f er +l en, " %s" , backor der ed_by) ;

Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

90

pr i nt f ( " %s\ n" , buf f er ) ;


count ++;
}
EXEC SQL CLOSE cur 5;
sql er r ( " CLOSE cur 5" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y6( ) {
pr i nt f ( " di spl ayi ng quer y 6\ n" ) ;
EXEC SQL DECLARE cur 6 CURSOR FOR
( SELECT MANAGER. EMPLOYEENO, PARTNO, BO_DATE, ' 2000- 01- 01' AS FD
FROM MANAGER, CURRENT_BACKORDER
WHERE MANAGER. EMPLOYEENO=CURRENT_BACKORDER. BACKORDERED_BY
UNI ON
SELECT MANAGER. EMPLOYEENO, PARTNO, BO_DATE, DATE( FULFI LLED) AS FD
FROM MANAGER, OLD_BACKORDER
WHERE MANAGER. EMPLOYEENO=OLD_BACKORDER. BACKORDERED_BY
) ORDER BY EMPLOYEENO;
sql er r ( " DECLARE cur 6" ) ;

EXEC SQL OPEN cur 6;
sql er r ( " OPEN cur 6" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 6 I NTO : empl oyeeno,
: par t no,
: bo_dat e,
: f d;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " EMPLOYEENO PARTNO BO_DATE FD \ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( empl oyeeno) ;
spr i nt f ( buf f er , " %s" , empl oyeeno) ;

f or ( l en=st r l en( buf f er ) ; l en < 12; l en++) st r cat ( buf f er , " " ) ;
depad( par t no) ;
spr i nt f ( buf f er +l en, " %s" , par t no) ;

f or ( l en=st r l en( buf f er ) ; l en < 18; l en++) st r cat ( buf f er , " " ) ;
spr i nt f ( buf f er +l en, " %s" , bo_dat e) ;

f or ( l en=st r l en( buf f er ) ; l en < 29; l en++) st r cat ( buf f er , " " ) ;
spr i nt f ( buf f er +l en, " %s" , f d) ;

pr i nt f ( " %s\ n" , buf f er ) ;
count ++;
}
EXEC SQL CLOSE cur 6;
sql er r ( " CLOSE cur 6" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}/
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

91

voi d quer y7( ) {


pr i nt f ( " di spl ayi ng quer y 7\ n" ) ;
EXEC SQL DECLARE cur 7 CURSOR FOR
SELECT T1. WAREHOUSEI D, T1. BI NNO, CAPACI TY- C AS REMAI NI NG_CAPACI TY
FROM
( SELECT WAREHOUSEI D, BI NNO, CAPACI TY
FROM BI N) AS T1,
( SELECT BATCH. WAREHOUSEI D, BATCH. BI NNO, COUNT( I TEMNO) AS C
FROM I TEM, BATCH
WHERE I TEM. PARTNO=BATCH. PARTNO
AND I TEM. BATCHNO=BATCH. BATCHNO
GROUP BY BATCH. WAREHOUSEI D, BATCH. BI NNO) AS T2
WHERE T1. WAREHOUSEI D=T2. WAREHOUSEI D
AND T1. BI NNO=T2. BI NNO;
sql er r ( " DECLARE cur 7" ) ;

EXEC SQL OPEN cur 7;
sql er r ( " OPEN cur 7" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 7 I NTO : war ehousei d,
: bi nno,
: r emai ni ng_capaci t y;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " WAREHOUSEI D BI NNO REMAI NI NG_CAPACI TY\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( war ehousei d) ;
spr i nt f ( buf f er , " %s" , war ehousei d) ;

f or ( l en=st r l en( buf f er ) ; l en < 12; l en++) st r cat ( buf f er , " " ) ;
spr i nt f ( buf 1, " %d" , bi nno) ;
f or ( l en1=st r l en( buf 1) ; l en1 < 11; l en1++, l en++) st r cat ( buf f er , " " ) ;
spr i nt f ( buf f er +l en, " %s" , buf 1) ;

f or ( l en=st r l en( buf f er ) ; l en < 24; l en++) st r cat ( buf f er , " " ) ;
spr i nt f ( buf 1, " %d" , r emai ni ng_capaci t y) ;
f or ( l en1=st r l en( buf 1) ; l en1 < 18; l en1++, l en++) st r cat ( buf f er , " " ) ;
spr i nt f ( buf f er +l en, " %s" , buf 1) ;

pr i nt f ( " %s\ n" , buf f er ) ;
count ++;
}
EXEC SQL CLOSE cur 7;
sql er r ( " CLOSE cur 7" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

voi d quer y8( ) {
pr i nt f ( " di spl ayi ng quer y 8\ n" ) ;

EXEC SQL DECLARE cur 8 CURSOR FOR
SELECT MANAGERNO, NUMBER_MANAGED
FROM ( SELECT MANAGERNO, COUNT( *) AS NUMBER_MANAGED
Appendix to Master Thesis Weiguang Zhang McMaster University- Computing and Software

92

FROM WORKER
GROUP BY MANAGERNO) AS T1
EXCEPT
SELECT T1. MANAGERNO, T1. NUMBER_MANAGED
FROM ( SELECT MANAGERNO, COUNT( *) AS NUMBER_MANAGED
FROM WORKER
GROUP BY MANAGERNO) AS T1,
( SELECT MANAGERNO, COUNT( *) AS NUMBER_MANAGED
FROM WORKER
GROUP BY MANAGERNO) AS T2
WHERE T1. NUMBER_MANAGED > T2. NUMBER_MANAGED;
sql er r ( " DECLARE cur 8" ) ;

EXEC SQL OPEN cur 8;
sql er r ( " OPEN cur 8" ) ;

count =0;
whi l e( 1) {
EXEC SQL FETCH cur 8 I NTO : manager no,
: number _managed;
i f ( SQLCODE! =0) br eak;
i f ( count ==0) {
pr i nt f ( " MANAGERNO NUMBER_MANAGED\ n" ) ;
pr i nt f ( " - - - - - - - - - - - - - - - - - - - - - - - \ n" ) ;
}
depad( manager no) ;
spr i nt f ( buf f er , " %s" , manager no) ;

f or ( l en=st r l en( buf f er ) ; l en < 10; l en++) st r cat ( buf f er , " " ) ;
spr i nt f ( buf 1, " %d" , number _managed) ;
f or ( l en1=st r l en( buf 1) ; l en1 < 14; l en1++, l en++) st r cat ( buf f er , " " ) ;
spr i nt f ( buf f er +l en, " %s" , buf 1) ;

pr i nt f ( " %s\ n" , buf f er ) ;
count ++;
}
EXEC SQL CLOSE cur 8;
sql er r ( " CLOSE cur 8" ) ;

pr i nt f ( " \ n %d r ecor d( s) sel ect ed. \ n" , count ) ;
}

Vous aimerez peut-être aussi