DBMS Module-III
DBMS Module-III
DBMS Module-III
SQL has various rules for dealing with NULL values.NULLis used to represent a missing value,but that it usually
has one of three different interpretations—value unknown (exists but is not known),value not available (exists but is
purposely withheld),or value not applicable (the attribute is undefined for this tuple).
In Tables 5.1(a) and 5.1(b),the rows and columns represent the values of the results of comparison
conditions,which would typically appear in the WHERE clause of an SQL query. Each expression result would have
a value of TRUE, FALSE, or UNKNOWN. The result of combining the two values using the AND logical
connective is shown by the entries in Table 5.1(a).Table 5.1(b)shows the result of using the
Page 1
MODULE –III NOTES DBMS -18CS53
ORlogicalconnective.Forexample,the result of (FALSE AND UNKNOWN) is FALSE, whereas the result of
(FALSE OR UNKNOWN) is UNKNOWN.Table 5.1(c) shows the result of the NOT logical operation. Notice that
in standard Boolean logic, only TRUEor FALSE values are permitted; there is no UNKNOWNvalue.
SQL allows queries that check whether an attribute value is NULL.Rather than using = or <> to compare an
attribute value to NULL,SQL uses the comparison operators ISor IS NOT.This is because SQL considers each
NULLvalue as being distinct from every other NULL value, so equality comparison is not appropriate.
Query 18. Retrieve the names of all employees who do not have supervisors.
SELECT Fname,Lname
FROM EMPLOYEE WHERE Super_ssnIS NULL;
IN operator:
whichis a comparison operator that compares a value v with a set (or multiset) of values V and evaluates to
TRUE if v is one of the elements in V.
ex: Query 17. Retrieve the Social Security numbers of all employees who work on project numbers
1,2,or 3.
SELECT DISTINCTEssn
FROM WORKS_ON WHEREPnoIN (1, 2, 3);
SQL allows the use of tuples of values in comparisons by placing them within parentheses.To illustrate
this,consider the following query:
SELECT DISTINCT Essn
FROM WORKS_ON WHERE (Pno, Hours) IN( SELECTPno, Hours FROM WORKS_ON
WHERE Essn=‘123456789’);
This query will select the Essns of all employees who work the same (project,hours) combination on some
project that employee ‘John Smith’ (whose Ssn = ‘123456789’) works on. In this example, the IN operator
compares the subtuple of values in parentheses (Pno, Hours) within each tuple in WORKS_ON with the set of type-
compatible tuples produced by the nested query.
In addition to the INoperator,a number of other comparison operators can be used to compare a single value
v (typically an attribute name) to a set or multiset v (typically a nested query).The = ANY (or = SOME) operator
returns TRUEif the value v is equal to some value in the set V and is hence equivalent to IN. The two keywords
ANY and SOME have the same effect. Other operators that can be combined with ANY (or SOME) include >, >=,
<, <=, and <>. The keyword ALL can also be combined with each of these operators.For example,the comparison
condition (v>ALL V) returns TRUEif the value vis greater than allthe values in the set (or multiset) V.
An example is the following query, which returns the names of employees whose salary is greater than the
salary of all the employees in department 5:
SELECT Lname,Fname
FROM EMPLOYEE WHERE Salary > ALL( SELECT Salary FROM EMPLOYEE
WHERE Dno=5 );
Page 2
MODULE –III NOTES DBMS -18CS53
Whenever a condition in the WHEREclause of a nested query references some attribute of a relation
declared in the outer query,the two queries are said to be correlated. We can understand a correlated query better
by considering that the nested query is evaluated once for each tuple (or combination of tuples) in the outer query.
Example for Correlated Nested Querie:
Retrieve the name of each employee who has a dependent with the same first name and is the same sex as
the employee.
Q16: SELECT E.Fname, E.Lname FROM EMPLOYEE AS E
WHERE E.Ssn IN ( SELECTEssn FROM DEPENDENT AS D
WHERE E.Fname=D.Dependent_name AND E.Sex=D.Sex );
For example, we can think of Q16 as follows: For each EMPLOYEE tuple, evaluate the nested query, which
retrieves the Essn values for all DEPENDENT tuples with the same sex and name as that EMPLOYEEtuple; if the
Ssn value of the EMPLOYEEtuple is in the result of the nested query,then select that EMPLOYEEtuple.
In generala query written with nested select-from-where blocks and using the = or INcomparison operators
can always be expressed as a single block query.For example,Q16 may be written as in Q16A:
Q16A:SELECT E.Fname, E.Lname
FROM EMPLOYEE AS E, DEPENDENT AS D
WHERE E.Ssn=D.Essn AND E.Sex=D.Sex AND E.Fname=D.Dependent_name;
Page 3
MODULE –III NOTES DBMS -18CS53
EXISTS and NOT EXISTS are typically used in conjunction with a correlated nested query.In Q16B,the
nested query references the Ssn,Fname,andSexattributes of the EMPLOYEErelation from the outer query.We can
think of Q16Bas follows:For each EMPLOYEE tuple, evaluate the nested query, which retrieves all DEPENDENT
tuples with the same Essn,Sex,andDependent_name as the EMPLOYEEtuple; if at least one tuple EXISTS in the
result of the nested query, then select that EMPLOYEE tuple.
In general, EXISTS(Q) returns TRUE if there is at least one tuple in the result of the nested query Q,and it
returns FALSE otherwise.
On the other hand,NOT EXISTS(Q) returns TRUE if there are no tuples in the result of nested query Q,
and it returns FALSE otherwise.Next,we illustrate the use of NOT EXISTS.
Query 6.Retrieve the names of employees who have no dependents.
SELECT Fname,Lname
FROM EMPLOYEE
WHERE NOT EXISTS ( SELECT * FROM DEPENDENT
WHERE Ssn=Essn );
In Q6, the correlated nested query retrieves all DEPENDENTtuples related to a particular EMPLOYEE
tuple. If none exist, the EMPLOYEE tuple is selected because the WHERE-clause condition will evaluate to TRUE
in this case. We can explain Q6 as follows: For each EMPLOYEE tuple, the correlated nested query selects all
DEPENDENT tuples whose Essn value matches the EMPLOYEE Ssn; if the result isempty, no dependents are
related to the employee, so we select that EMPLOYEE tuple and retrieve its Fname and Lname.
5.1.5 Explicit Sets and Renaming of Attributes in SQL
Explicit Sets
We have seen several queries with a nested query in the WHEREclause.It is also possible to use an explicit
set of values in the WHERE clause, rather than a nested query.Such a set is enclosed in parentheses in SQL.
Query 17.Retrieve the Social Security numbers of all employees who work on project numbers 1,2,or
3.
SELECT DISTINCT Essn FROM WORKS_ON WHERE Pno IN (1, 2, 3);
Renaming of Attributes
In SQL,it is possible to rename any attribute that appears in the result of a query by adding the qualifier AS
followed by the desired new name. Hence, the AS construct can be used to alias both attribute and relation
names,and it can be used in both the SELECT and FROM clauses.
Page 4
MODULE –III NOTES DBMS -18CS53
For example, to retrieve the last name of each employee and his or her supervisor,while renaming the
resulting attribute names as Employee_name and Supervisor_name.The new names will appear as column headers
in the query result.
SELECT E.LnameASEmployee_name, S.LnameASSupervisor_name
FROM EMPLOYEE AS E, EMPLOYEE AS S
WHERE E.Super_ssn=S.Ssn;
The default type of join in a joined table is called an inner join, where a tuple is included in the result only
if a matching tuple exists in the other relation
There are a variety of outer join operations.
1) LEFT OUTER JOIN (every tuple in the left table must appear in the result;if it does not have a
matching tuple,it is padded with NULLvalues for the attributes of the right table).
2) RIGHT OUTER JOIN (every tuple in the right table must appear in the result;if it does not
have a matching tuple,it is padded with NULLvalues for the attributes of the left table).
3) FULL OUTER JOIN :It is a combination of left and right outer joins .
In the latter three options, the keyword OUTER may be omitted.If the join attributes have the same
name,one can also specify the natural join variation of outer joins by using the keyword NATURAL before
the operation (for example, NATURAL LEFT OUTER JOIN).
The keyword CROSS JOIN is used to specify the CARTESIAN PRODUCT operationalthough this
should be used only with the utmost care because it generates all possible tuple combinations.
It is also possible to nest join specifications; that is, one of the tables in a join may itself be a joined table.
This allows the specification of the join of three or more tables as a single joined table,which is called a multiway
join.
EX: SELECT Pnumber, Dnum, Lname, Address, Bdate
Page 5
MODULE –III NOTES DBMS -18CS53
FROM ((PROJECT JOIN DEPARTMENT ON Dnum=Dnumber)
JOIN EMPLOYEE ON Mgr_ssn=Ssn) WHERE Plocation=‘Stafford’;
Not all SQL implementations have implemented the new syntax of joined tables.In some systems, a different syntax
was used to specify outer joins by using the comparison operators +=, =+, and +=+ for left, right, and full outer
join, respectively, when specifying the join condition. For example, this syntax is available in Oracle. To specify
the left outer join using this syntax, we could write the query as follows:
SELECT E.Lname, S.Lname
FROM EMPLOYEE E, EMPLOYEE S
WHERE E.Super_ssn +=S.Ssn;
If we want to get the preceding function values for employees of a specific department—say, the ‘Research’
department—we can write Query 20, where the EMPLOYEEtuples are restricted by the WHERE clause to those
employees who work for the ‘Research’department.
Query 20. Find the sum of the salaries of all employees of the ‘Research’ department,as well as the
maximum salary,the minimum salary,and the average salary in this department.
SELECT SUM (Salary), MAX (Salary), MIN (Salary), AVG (Salary)
FROM (EMPLOYEE JOIN DEPARTMENT ON Dno=Dnumber)
WHERE Dname=‘Research’;
Queries 21 and 22. Retrieve the total number of employees in the company (Q21) and the number of
employees in the ‘Research’department (Q22).
Page 6
MODULE –III NOTES DBMS -18CS53
Page 7
MODULE –III NOTES DBMS -18CS53
HAVING clause
SQL provides aHAVING clause,which can appear in conjunction with a GROUP BY clause. HAVING provides a
condition on the summary information regarding the group of tuples associated with each value of the grouping
attributes. Only the groups that satisfy the condition are retrieved in the result of the query.This is illustrated by
Query 26.
Page 8
MODULE –III NOTES DBMS -18CS53
In order to formulate queries correctly, it is useful to consider the steps that define the meaning or semantics of each
query. A query is evaluated conceptually by first applying the FROMclause (to identify all tables involved in the
query or to materialize any joined tables), followed by the WHERE clause to select and join tuples, and then by
GROUP BY and HAVING. Conceptually, ORDER BY is applied at the end to sort the query result.
Page 9
MODULE –III NOTES DBMS -18CS53
5.2 Specifying Constraints as Assertions and Actions as Triggers
In this section, we introduce two additional features of SQL: the CREATE ASSERTION statement and the
CREATE TRIGGER statement.
CREATE ASSERTION, which can be used to specify additional types of constraints that are outside the
scope of the built-in relational model constraints (primary and unique keys, entity integrity, and referential integrity)
that we presented early.
CREATE TRIGGER,which can be used to specify automatic actions that the database system will perform
when certain events and conditions occur. This type of functionality is generally referred to as active databases.
The basic technique for writing such assertions is to specify a query that selects any tuples that violate the desired
condition.By including this query inside a NOT EXISTSclause, the assertion will specify that the result of this query
must be empty so that the condition will always be TRUE.Thus,the assertion is violated if the result of the query is
not empty.In the preceding example,the query selects all employees whose salaries are greater than the salary of the
manager of their department. If the result of the query is not empty,the assertion is violated.
Page 11
MODULE –III NOTES DBMS -18CS53
Trigger: Condition
Page 12
MODULE –III NOTES DBMS -18CS53
Example 2
Trigger: Action
Example 1
Page 13
MODULE –III NOTES DBMS -18CS53
A view is a single table that is derived from one or more base tables or other views
Views neither exist physically nor contain data itself, it depends on the base tables for its existence
A view contains rows and columns, just like a real table. The fields in a view are fields from one or more
real tables in the database.
Query Modification
Page 14
MODULE –III NOTES DBMS -18CS53
Modifying the view query into a query on the underlying base tables
Disadvantage: inefficient for views defined via complex queries that are time-consuming to execute ,
especially if multiple queries are applied to the view within a short period of time.
Example
The query example# would be automatically modified to the following query by the DBMS
SELECT Fname, Lname
FROM EMPLOYEE, PROJECT, WORKS_ON
WHERE Ssn=Essn ANDPno=Pnumber
AND Pname=”ProductX’;
View Materialization
Physically create a temporary view table when the view is first queried
Keep that table on the assumption that other queries on the view will follow
Requires efficient strategy for automatically updating the view table when the base tables are updated, that
is Incremental Update
Incremental Update determines what new tuples must be inserted, deleted, or modified in a materialized
view table when a change is applied to one of the defining base table
View Update
Updating of views is complicated and can be ambiguous
An update on view defined on a single table without any aggregate functions can be mapped to an update on
the underlying base table under certain conditions.
View involving joins, an update operation may be mapped to update operations on the underlying base
relations in multiple ways.
Example
Update the Pname attribute of ‘john smith’ from ‘ProductX’ to ‘ProductY’
UPDATE WORKS_ON1
SET Pname= ‘ProductY’
WHERE Lname=‘smith’ ANDFname=‘john’
AND Pname= ‘ProductX’
This query can be mapped into several updates on the base relations to give the desired effect on the view.
Two possible updates (a) and (b) on the base relations corresponding to above query .
(a) UPDATE WORKS_ON
SET Pno= (SELECT Pnumber
FROM PROJECT
WHERE Pname= ‘ProductY’)
WHERE Essn IN (SELECT Ssn
FROM EMPLOYEE
WHERE Lname=‘smith’ ANDFname=‘john’)
AND
Pno= (SELECT Pnumber
FROM PROJECT
WHERE Pname=‘ProductX’ );
In this section,we give an overview of the schema evolution commandsavailable in SQL, which can be used to alter
a schema by adding or dropping tables, attributes, constraints, and other schema elements. This can be done while
the database is operational and does not require recompilation of the database schema. Certain checks must be done
by the DBMS to ensure that the changes do not affect the rest of the database and make it inconsistent.
Page 16
MODULE –III NOTES DBMS -18CS53
The definition of a base table or of other named schema elements can be changed by using the ALTER
command. For base tables, the possible alter table actions include adding or dropping a column (attribute),changing
a column definition,and adding or dropping table constraints.
For example, to add an attribute for keeping track of jobs of employees to the EMPLOYEE base relation in the
COMPANY schema ,we can use the command.
ALTER TABLE COMPANY.EMPLOYEE ADD COLUMN Job VARCHAR(12);
We must still enter a value for the new attribute Job for each individual EMPLOYEE tuple.This can be done either
by specifying a default clause or by using the UPDATEcommand individually on each tuple..If no default clause is
specified,the new attribute will have NULLs in all the tuples of the relation immediately after the command is
executed;hence,the NOT NULLconstraint is not allowedin this case.
Page 17
MODULE –III NOTES DBMS -18CS53
Page 18
MODULE –III NOTES DBMS -18CS53
Database Application Development
Applications that rely on the DBMS to manage data run as separate processes that connect to the DBMS
to interact with it. Once a connection is established,SQL commands can be used to insert, delete, and
modify data. SQL queries canbe used to retrieve desired data. but we need to bridge an important
differencein how a database system sees data and how an application program in alanguage like Java or C
sees data: The result of a database query is a set (ormultiset) or records, hut Java has no set or multiset
data type. This mismatchis resolved through additional SQL constructs that allow applications to obtain
a handle on a collection and iterate over the records one at a time.
In this section, we cover how SQL commands can be executed from within aprogram in a host language
such as C or Java. The use of SQL commandswithin a host language program is called Embedded SQL.
Details of Embedded SQL also depend on the host language. Although similar capabilities are
supported for a variety of host languages, the syntax sometimes varies.
Embedded SQL
Conceptually, embedding SQL commands in a host language program is straightforward.SQL
statements (i.e., not declarations) can be used wherever a statementin the host language is allowed (with a
few restrictions). SQL statementsmust be clearly marked so that a preprocessor can deal with them before
invokingthe compiler for the host language. Also, any host language variablesused to pass arguments into
an SQL command must be declared in SQL. Inparticular, some special host language variables must be
declared in SQL (sothat, for example, any error conditions arising during SQL execution can
becommunicated back to the main application program in the host language).
There are, however, two complications to bear in mind. First, the data typesrecognized by SQL
may not be recognized by the host language and vice versa.This mismatch is typically addressed by
casting data values appropriately beforepassing them to or frorn SQL commands.The second
complication hasto do with SQL being set-oriented,and is addressed using cursors.
short crating;
float cage;
Page 19
MODULE –III NOTES DBMS -18CS53
The SQL-92 standard defines a correspondence between the host language types and SQL types
for a number of host languages. In our example, c_snamc has the type CHARACTER(20) when referred
to in an SQL statement, csid has the type INTEGER, crating has the type SMALLINT, and cage has the
type REAL.
The SQL-92 standard recognizes two special variables for reporting errors, SQLCODE and
SQLSTATE.
Cursors
A major problem in embedding SQL statements in a host language like C is that an impedance
mismatch occurs because SQL operates on set of records, whereas languages like C do not cleanly
support a set-of-records abstraction. The solution is to essentially provide a mechanism that allows us to
retrieve rows one at a time from a relation.This mechanism is called a cursor.
We can declare a cursor on any relation or on any SQL query (because every query returns a set
of rows). Once a cursor is declared, we can open it (which positions the cursor just before the first row);
fetch the next row; move the cursor (to the next row, to the row after the next n, to the first row, or to the
previous row, etc., by specifying additional parameters for the FETCH command); or close the cursor.
Thus, a cursor essentially allows us to retrieve the rows in a table by positioning the cursor at a particular
row and reading its contents.
Page 20
MODULE –III NOTES DBMS -18CS53
But what about the following query, which computes the names and ages of all sailors with a rating
greater than the current value of the host variable c_minrating?
SELECT S.sname, S.age
FROM Sailors S
WHERE S.rating> :c_minrating
A cursor can be thought of as 'pointing' to a row in the collection of answers to the query
associated with it. When a cursor is opened, it is positioned just before the first row. We can use the
FETCH command to read the first row of cursor sinfo into host language variables:
FETCH sinfoINTO :c_sname, :c_age;
When the FETCH statement is executed, the cursor is positioned to point at the next row (which
is the first row in the table when FETCH is executed for the first time after opening the cursor) and the
column values in the row are copied into the corresponding host variables. By repeatedly executing this
FETCH statement (say, in a while-loop in the C program), we can read all the rows computed by the
query, one row at a time. Additional parameters to the FETCH command allow us to position a cursor in
very flexible ways.
How do we know when we have looked at all the rows associated with the cursor? By looking at
the special variables SQLCODE or SQLSTATE, of course. SQLSTATE, for example, is set to the value
02000, which denotes NO DATA, to indicate that there are no more rows ifthe FETCH statement
positions the cursor after the last row.
When we are done with a cursor, we can close it:
CLOSE sinfo;
It can be opened again if neededand the value of :c_minrating in the SQL query associated with
the cursor would be the value of the host variable c_minrating at that time.
Page 21
MODULE –III NOTES DBMS -18CS53
DELETE commands allow us to update or delete the row on which the cursor is positioned.If the keyword
SCROLL is specified, the cursor is scrollable, which means that variants of the FETCH command can be
used to position the cursor in very flexible ways;If the keyword INSENSITIVE is specified, the cursor
behaves as if it is ranging over a private copy of the collection of answer rows.A holdable cursor is
specified using the WITH HOLD clause, and is not closed when the transaction is conunitted.Finally, in
what order do FETCH commands retrieve rows? In general this order is unspecified, but the optional
ORDER BY clause can be used to specify a sort order. Note that columns mentioned in the ORDER BY
clause cannot be updated through the cursor!
Dynamic SQL
The first statement declares the C variable c_sqlstring and initializes its value to the string representation
of an SQL command. The second statement results in this string being parsed and compiled as an SQL
command, with the resulting executable bound to the SQL variable readytogo. (Since readytogo is an
SQL variable, just like a cursor name, it is not prefixed by a colon.) The third statement executes the
command.
Page 22
MODULE –III NOTES DBMS -18CS53
6.2 AN INTRODUCTION TO JDBC
ODBC and JDBC, short for Open DataBase Connectivity and Java DataBase Connectivity, also
enable the integration of SQL with a general-purpose programming language. Both ODBC and JDBC
expose database capabilities in a standardized way to the application programmer through an application
programming interface (API).
An application that interacts with a data source through ODBC or JDBC selects a data source,
dynamically loads the corresponding driver, and establishes a connection with the data source.
The application initiates and terminates the connection with a data source. It sets transaction
boundaries, submits SQL statements, and retrieves the results all through a well-defined interface as
specified by the JDBC API.
The primary goal of the driver manager is to load JDBC drivers and pass JDBC function calls
from the application to the correct driver.
The driver establishes the connection with the data source.
The data source processes commands from the driver and returns the results.
Driversin JDBC are classified into four types depending on the architectural relationship between the
application and the data source:
Page 23
MODULE –III NOTES DBMS -18CS53
JDBC is a collection of Java classes and interfaces that enables database access from programs
written in the Java language. It contains methods for connecting to a remote data source, executing SQL
statements, examining sets of results from SQL statements, transaction management, and exception
handling. The classes and interfaces are part of the java.sql package. Thus, all code fragments in the
remainder of this section should include the statement import java. sql .* at the beginning of the code;
Connections
A session with a data source is started through creation of a Connection object; A connection identifies a
logical session with a data source; multiple connections within the same Java program can refer to
different data sources or the same data source. Connections are specified through a JDBC URL, a URL
that uses the jdbc protocol. Such a URL has the form
jdbc:<subprotocol>:<otherParameters>
The code example shown in Figure 6.2 establishes a connection to an Oracle database assuming that the
strings userld and password are set to valid values.
Page 24
MODULE –III NOTES DBMS -18CS53
Establishing a connection to a data source is a costly operation since it involves several steps, such as
establishing a network connection to the data source, authentication, and allocation of resources such as
memory. In case an application establishes many different connections from different parties (such as a
Web server), connections are often pooled to avoid this overhead. A connection pool is a set of
established connections to a data source. Whenever a new connection is needed, one of the connections
from the pool is used, instead of creating a new connection to the data source.
Page 25
MODULE –III NOTES DBMS -18CS53
The executeUpdate method returns an integer indicating the number of rows the SQL statement
modified; it returns 0 for successful execution without modifying any rows.
The executeQuery method is used if the SQL statement returns data, such &"l in a regular
SELECT query.JDBC has its own cursor mechanism in the form of a ResultSet object, which we discuss
next. The execute method is more general than executeQuery and executeUpdate.
ResultSets
The statement executeQuery returns a, ResultSet object, which is similar to a cursor. ResultSet
cursors in JDBC 2.0 are very powerful; they allow forward and reverse scrolling and in-place editing and
insertions.
In its most basic form, the ResultSet object allows us to read one row of the output of the query at
a time. Initially, the ResultSet is positioned before the first row, and we have to retrieve the first row with
an explicit call to the next0 method. The next method returns false if there are no more rows in the query
answer, and true other\vise. The code fragment shown in Figure 6.4 illustrates the basic usage of a
ResultSet object.
Page 26
MODULE –III NOTES DBMS -18CS53
Matching Java and SQL Data Types
JDBC provides special data types and specifies their relationship to corresponding SQL data
types. Figure 6.5 shows the accessor methods in a ResultSet object for the most common SQL datatypes.
With these accessor methods, we can retrieve values from the current row of the query result referenced
by the ResultSet object. There are two forms for each accessor method: One method retrieves values by
column index, starting at one, and the other retrieves values by column name. The following example
shows how to access fields of the current ResultSet row using accesssor methods.
An SQL Warning is a subclass of SQLException. Warnings are not severe as errors and the program can
usually proceed without special handling of warnings. Warnings are not thrown like other exceptions, and
Page 27
MODULE –III NOTES DBMS -18CS53
they are not caught as part of the try"-catch block around a java.sql statement. We Heed to specifically
test whether warnings exist. Connection, Statement, and ResultSet objects all have a getWarnings 0
method with which we can retrieve SQL warnings if they exist. Statement objects clear warnings
automatically on execution of the next statement; ResultSet objects clear warnings every time a new tuple
is accessed.
Page 28
MODULE –III NOTES DBMS -18CS53
2) publicintgetMaxConnections0 throws SqLException. This function returns the ma.ximum number of
connections possible.
We will conclude our discussion of JDBC with an example code fragment that examines all database
metadata shown in Figure 6.7.
SQLJ
SQLJ (short for 'SQL-Java') was developed by the SQLJ Group, a group of database vendors and
Sun. SQLJ was developed to complement the dynamic way of creating queries in JDBC with a static
model. It is therefore very close to Embedded SQL. Unlike JDBC, having semi-static SQL queries allows
the compiler to perform SQL syntax checks, strong type checks of the compatibility of the host variables
with the respective SQL attributes, and consistency of the query with the database schema-tables,
attributes, views, and stored procedures--all at compilation time. For example, in both SQLJ and
Embedded SQL, variables in the host language always are bound statically to the same arguments,
whereas in JDBC, we need separate statements to bind each variable to an argument and to retrieve the
Page 29
MODULE –III NOTES DBMS -18CS53
result. For example, the following SQLJ statement binds host language variables title, price, and author to
the return values of the cursor books.
#sql books = { SELECT title, price INTO :title, :price
FROM Books WHERE author = :author
};
In JDBC, we can dynamically decide which host language variables will hold the query result. In the
following example, we read the title of the book into variable ftitle if the book was written by Feynman,
and into variable otitle otherwise:
/ / assume we have a ResultSet cursor rs
author = rs.getString(3);
if (author=="Feynman")
{ ftitle = rs.getString(2):
}
else { otitle = rs.getString(2);
}
When writing SQLJ applications, we just write regular Java code and embed SQL statements according to
a set of rules. SQLJ applications are pre-processed through an SQLJ translation program that replaces the
embedded SQLJ code with calls to an SQLJ Java library. The modified program code can then be
compiled by any Java compiler. Usually the SQLJ Java library makes calls to a JDBC driver, which
handles the connection to the database system.
Page 30
MODULE –III NOTES DBMS -18CS53
The corresponding JDBC code fragment looks as follows (assuming we also declared price, name, and
author:
Comparing the JDBC and SQLJ code, we see that the SQLJ code is much easier to read than the JDBC
code. Thus, SQLJ reduces software development and maintenance costs.
Let us consider the individual components of the SQLJ code in more detail. All SQLJ statements
have the special prefix #sql. In SQLJ, we retrieve the results of SQL queries with iterator objects, which
are basically cursors. An iterator is an instance of an iterator class. Usage of an iterator in SQLJ goes
through five steps:
There are two types of iterator classes: named iterators and positional iterators. For named iterators, we
specify both the variable type and the name of each column of the iterator. This allows us to retrieve
individual columns by name as in our previous example where we could retrieve the title colunm from the
Books table using the expression books.titIe(). For positional iterators, we need to specifY only the
variable type for each column of the iterator. To access the individual columns of the iterator, we use a
FETCH ... INTO construct, similar to Embedded SQL. Both iterator types have the same performance;
which iterator to use depends on the programmer's taste.
Page 31
MODULE –III NOTES DBMS -18CS53
6.5 STORED PROCEDURES
It is often important to execute some parts of the application logic directly in the process space of
the database system. Running application logic directly at the database has the advantage that the amount
of data that is transferred between the database server and the client issuing the SQL statement can be
minimized, while at the same time utilizing the full power of the databa.se server.
When SQL statements are issued from a remote application, the records in the result of the query
need to be transferred from the database system back to the application. If we use a cursor to remotely
access the results of an SQL statement, the DBMS has resources such as locks and memory tied up while
the application is processing the records retrieved through the cursor.
In contrast, a stored procedure is a program that is executed through a single SQL statement that
can be locally executed and completed within the process space of the database server. The results can be
packaged into one big result and returned to the application, or the application logic can be performed
directly at the server, without having to transmit the results to the client at all.
Once a stored procedure is registered with the database server, different users can re-use the
stored procedure, eliminating duplication of efforts in writing SQL queries or application logic, and
making code maintenance ea."lY. In addition, application programmers do not need to know the the
databa.se schema if we encapsulate all databa.'3e access into stored procedures.
Although theyare called stored procedur'es, they do not have to be procedures in a programming
language sense; they can be functions.
Let us look at an example of a stored procedure with arguments. The stored procedure shown in Figure
6.9 has two arguments: book_isbn and addedQty. It updates the available number of copies of a book with
the quantity from a new shipment.
Page 32
MODULE –III NOTES DBMS -18CS53
Stored procedures do not have to be written in SQL; they can be written in any host language. As an
example, the stored procedure shown in Figure 6.10 is a Java function that is dynamically executed by the
database server whenever it is called by the client:
Page 33
MODULE –III NOTES DBMS -18CS53
SQL/PSM
All major database systems provide ways for users to write stored procedures in a simple,
general purpose language closely aligned with SQL. In this section, we briefly discuss the SQL/PSM
standard, which is representative of most vendorspecific languages. In PSM, we define modules, which
are collections of stored procedures, temporary relations, and other declarations.
Each parameter is a triple consisting of the mode (IN, OUT, or INOUT as discussed in the previous
section), the parameter name, and the SQL datatype of the parameter.
We start out with an example of a SQL/PSM function that illustrates the main SQL/PSM
constructs. The function takes as input a customer identified by her cid and a year. The function returns
the rating of the customer, which is defined a...'3 follows: Customers who have bought more than ten
books during the year are rated 'two'; customer who have purchased between 5 and 10 books are rated
'one', otherwise the customer is rated 'zero'. The following SQL/PSM code computes the rating for a given
customer and year.
Page 34
MODULE –III NOTES DBMS -18CS53
CREATE PROCEDURE RateCustomer(IN custId INTEGER, IN year INTEGER)
RETURNS INTEGER
DECLARE rating INTEGER;
DECLARE numOrders INTEGER;
SET numOrders = (SELECT COUNT(*) FROM Orders 0 WHERE O.tid = custId);
IF (numOrders>10) THEN rating=2;
ELSEIF (numOrders>5) THEN rating=1;
ELSE rating=O;
END IF;
RETURN rating;
Let us use this example to give a short overview of some SQL/PSM constructs:
Page 35
MODULE –III NOTES DBMS -18CS53
Page 36
MODULE –III NOTES DBMS -18CS53
DBDudes writes other JDBC code and stored procedures for all of the remaining tasks. They use code
similar to some of the fragments that we have seen in this chapter.
DBDudcs takes care to make the application robust by processing exceptions and warnings, as
shown in Figure 6.6.
DBDudes also decide to write a trigger, which is shown in Figure 6.12. Whenever a new order is
entered into the Orders table, it is inserted with ship~date set to NULL. The trigger processes each row in
the order and calls the stored procedure 'UpdateShipDate'. This stored procedure (whose code is not
shown here) updates the (anticipated) ship_date of the new order to 'tomorrow', in case qtyjlLstock of the
corresponding book in the Books table is greater than zero. Otherwise, the stored procedme sets the
ship_date to two weeks.
Page 37
MODULE –III NOTES DBMS -18CS53
Internet Applications:
Single-Tier
In this section, we provide some perspective on the three-tier architecture by discussing single-
tier and client-server architectures, the predecessors of the three-tier architecture. Initially, data-intensive
applications were combined into a single tier, including the DBMS, application logic, and user interface,
as illustrated in Figure 7.5. The application typically ran on a mainframe, and users accessed it through
dumb terminals that could perform only data input and display. This approach has the benefit of being
easily maintained by a central administrator.
Single-tier architectures have an important drawback: Users expect graphical interfaces that
require much more computational power than simple dumb terminals. Centralized computation of the
graphical displays of such interfaces requires much more computational power than a single server has
available, and thus single-tier architectures do not scale to thousands of users.
Page 38
MODULE –III NOTES DBMS -18CS53
Other divisions are possible, such as more powerful clients that implement both user interface and
business logic, or clients that implement user interface and part of the business logic, with the remaining
part being implemented at the server level; such clients are often called thick clients, and this architecture
is illustrated in Figure 7.7
The thick-client model has several disadvantages when compared to the thinclient model. First,
there is no central place to update and maintain the business logic, since the application code runs at many
client sites. Second, a large amount of trust is required between the server and the clients.A third
disadvantage of the thick-client architecture is that it does not scale with the number of clients; it typically
cannot handle more than a few hundred clients.
Page 39
MODULE –III NOTES DBMS -18CS53
Different technologies have been developed to enable distribution of the three tiers of an application
across multiple hardware platforms and different physical sites. Figure 7.9 shows the technologies
relevant to each tier.
Page 40
MODULE –III NOTES DBMS -18CS53
5) Software Development Benefits: By dividing the application cleanly into parts that address
presentation, data access, and business logic, we gain many advantages. The business logic is
centralized, and is therefore easy to maintain, debug, and change. Interaction between tiers occurs
through well- defined, standardized APls. Therefore, each application tier can be built out of reusable
components that can be individually developed, debugged, and tested.
HTML Forms
HTML forms are a common way of communicating data from the client tier to the middle tier. The
general format of a form is the following:
<FORM ACTION="page.jsp" METHOD="GET" NAME="LoginForm">
</FORM>
A single HTML document can contain more than one form. Inside an HTML form, we can have any
HTML tags except another FORM element.
The FORM tag has three important attributes:
a) ACTION: Specifies the URI of the page to which the form contents are submitted; if the ACTION
attribute is absent, then the URI of the current page is used.
b) METHOD: The HTTP/1.0 method used to submit the user input from the filled-out form to the
webserver. There are two choices, GET and POST
c) NAME: This attribute gives the form a name. Although not necessary, naming forms is good style
Inside HTML forms, the INPUT, SELECT, and TEXTAREA tags are used to specify user input
elements; a form can have many elements of each type. The simplest user input element is an INPUT
field, a standalone tag with no terminating tag. An example of an INPUT tag is the following:
<INPUT TYPE=ltext" NAME="title">
The INPUT tag has several attributes. The three most important ones are TYPE, NAME, and VALUE.
The TYPE attribute determines the type of the input field. If the TYPE attribute has value text, then the
field is a text input field. If the TYPE attribute has value password, then the input field is a text field
where the entered characters are displayed as stars on the screen. If the TYPE attribute has value reset, it
is a simple button that resets all input fields within the form to their default values. If the TYPE attribute
has value submit, then it is a button that sends the values of the different inputfields in the form to the
server. Note that reset and submit input fields affect the entire form.
The NAME attribute of the INPUT tag specifies the symbolic name for this field and is used to
identify the value of this input field when it is sent to the server.
The VALUE attribute of an input tag can be used for text or password fields to specify the default
contents of the field. For submit or reset buttons, VALUE determines the label of the button.
The form in Figure 7.11 shows two text fields, one regular text input field and one password field.
It also contains two buttons, a reset button labeled 'Reset Values' and a submit button labeled 'Log on.'
Note that the two input fields are named, whereas the reset and submit button have no NAME attributes.
<FORM ACTION="page.jsp" METHoD="GET" NAME="LoginForm">
<INPUT TYPE="text" NAME="username" VALUE=" Joe"><P>
Page 41
MODULE –III NOTES DBMS -18CS53
<INPUT TYPE="submit" VALUE="Log on">
</FoRM>
Figure 7.11 HTML Form with Two Text Fields and Two Buttons
Passing Arguments to Server Side Scripts
There are two different ways to submit HTML Form data to the webserver. If the method GET is used,
then the contents of the form are assembled into a query URI (as discussed next) and sent to the server. If
the method POST is used, then the contents of the form are encoded as in the GET method, but the
contents are sent in a separate data block instead of appending them directly to the URI. Thus, in the GET
method the form contents are directly visible to the user as the constructed URI, whereas in the POST
method, the form contents are sent inside the HTTP request message body and are not visible to the user.
Let us look at the encoding of the URI when the GET method is used. The encoded URI has the following
form:
action?name1=value1&name2=value2&name3=value3
JavaScript
JavaScript is a scripting language at the client tier with which we can add programs to webpages that run
directly at the client (Le., at the machine running the Web browser). JavaScript is often used for the
following types of computation at the client:
1) Browser Detection: JavaScript can be used to detect the browser type and load a browser-specific
page.
2) Form Validation: JavaScript is used to perform simple consistency checks on form fields. For example,
a JavaScript program might check whether aform input that asks for an email address contains the
character '@,' or if all required fields have been input by the user.
3) Browser Control: This includes opening pages in customized windows; examples include the annoying
pop-up advertisements that you see at many websites, which are programmed using JavaScript.
JavaScript is usually embedded into an HTML document with a special tag, the SCRIPT tag. The
SCRIPT tag has the attribute LANGUAGE, which indicates the language in which the script is written.
Another attribute of the SCRIPT tag is the SRC attribute, which specifies an external file with JavaScript
code that is automatically embedded into the HTML document. Usually JavaScript source code files use a
'.js' extension. The following fragment shows a JavaScript file included in an HTML document:
<SCRIPT LANGUAGE=" JavaScript" SRC="validateForm.js"></SCRIPT>
We enclose the JavaScipt code inside HTML comments for the reasons just mentioned.
<SCRIPT LANGUAGE=" JavaScript">
<I--
alert(" Welcome to our bookstore");
//-->
</SCRIPT>
JavaScript provides two different commenting styles: single-line comments that start with the '//'
character, and multi-line comments starting with '/*' and ending with ,*/' characters.
JavaScript allows us to create functions using the function keyword: function f (argl, arg2)
{statements;}. We can call functions from JavaScript code, and functions can return values using the
keyword return.
We conclude this introduction to JavaScript with a larger example of a JavaScript function that
tests whether the login and password fields of a HTML form are not empty. Figure 7.12 shows the
JavaScript function and the HTML form. The JavaScript code is a function called testLoginEmptyO that
tests whether either of the two input fields in the form named LoginForm is empty. In the function
Page 42
MODULE –III NOTES DBMS -18CS53
testLoginEmpty, we first use variable loginForm to refer to the form LoginForm using the implicitly
defined variable document, which refers to the current HTML page. (JavaScript has a library of objects
that are implicitly defined.) We then check whether either of the strings loginForm.userif.value or
loginForm.password.value is empty.
Style Sheets
Different clients have different displays, and we need correspondingly different ways of
displaying the same information. For example, in the simplest ca.se, we might need to use different font
sizes or colors that provide high-contrast on a black-and-white screen.
A style sheet is a method to adapt the same document contents to different presentation formats.
A style sheet contains instructions that tell a 'Web browser (or whatever the client uses to display the
webpage) how to translate the data of a document into a presentation that is suitable for the client's
display.
There are two style sheet languages: XSL and ess. ess was created for HTML with the goal of
separating the display characteristics of different formatting tags from the tags themselves. XSL is an
extension of ess to arbitrary XML docurnents; besides allowing us to define ways of formatting objects,
XSL contains a transformation language that enables us to rearrange objects. The target files for ess are
HTML files, whereas the target files for XSL are XML files.
Page 43
MODULE –III NOTES DBMS -18CS53
Each line in a CSS sheet consists of three parts; a selector, a property, and a value. They are syntactically
arranged in the following way:
selector {property: value}
The selector is the element or tag whose format we are defining. The property indicates the tag's
attribute whose value we want to set in the style sheet, and the property is the actual value of the attribute.
As an example, consider the first line of the example style sheet shown in Figure 7.13:
BODY {BACKGROUND-COLOR: yellow}
XSL
XSL is a language for expressing style sheets. An XSL style sheet is, like CSS, a file that describes how
to display an XML document of a given type. XSL shares the functionality of CSS and is compatible with
it (although it uses a different syntax).
XSL contains the XSL Transformation language, or XSLT, a language that allows 11S to
transform the input XML document into a XML document with another structure.
XSL also contains the XML Path Language (XPath), a language that allows us to refer to parts of
an XML document.
Page 44
MODULE –III NOTES DBMS -18CS53
Figure 7.15 illustrates the processes created when using the CGl protocol.
Figure 7.16 shows the example CGl script, written in Perl. We omit errorchecking code for
simplicity. Perl is an interpreted language that is often used for CGl scripting and many Perl libraries,
called modules, provide high-level interfaces to the CGl protocol. We use one such library, called the DBI
library, in our example. The CGI module is a convenient collection of functions for creating CGl scripts.
In part 1 of the sample script, we extract the argument of the HTML form that is passed along from the
client as follows:
$authorName = $dataln- >paramCauthorName');
Page 45
MODULE –III NOTES DBMS -18CS53
Application Servers
Application logic can be enforced through server-side programs that are invoked using the CGl protocol.
However, since each page request results in the creation of a new process, this solution does not scale
well to a large number of simultaneous requests. This performance problem led to the development
ofspecialized programs called application servers. An application server maintains a pool of threads or
processes and uses these to execute requests. Thus, it avoids the startup cost of creating a new process for
each request.
A possible architecture for a website with an application server is shown in Figure 7.17. The
client (a Web browser) interacts with the webserver through the HTTP protocol. The webserver delivers
static HTML or XML pages directly to the client. To assemble dynamic pages, the webserver sends a
request to the application server. The application server contacts one or more data sources to retrieve
necessary data or sends update requests to the data sources. After the interaction with the data sources is
completed, the application server assembles the webpage and reports the result to the webserver, which
retrieves the page and delivers it to the client.
Servlets
Java servlets are pieces of Java code that run on the middle tier, in either webservers or
application servers. There are special conventions on how to read the input from the user request and how
to write output generated by the servlet. Servlets are truly platform-independent, and so they have become
very popular with Web developers.
Since servlets are Java programs, they are very versatile. For example, servlets can build
webpages, access databases, and maintain state. Servlets have accessto all Java APls, including JDBC. All
servlets must implement the Servlet interface. In most cases, servlets extend the specific HttpServlet class
for servers that communicate with clients via HTTP. The HttpServlet class provides methods such as
doGet and doPost to receive arguments from HTML forms, and it sends its output back to the elient via
HTTP. Servlets that communicate through other protocols (such as ftp) need to extend the class
GenericServlet.
Servlets are compiled Java classes executed and maintained by a servlet container. The servlet
container manages the lifespan of individual servlets by creating and destroying them. Although servlets
can respond to any type of request, they are commonly used to extend the applications hosted by
webservers. For such applications, there is a useful library of HTTP-specific servlet classes.
Servlets usually handle requests from HTML forms and maintain state between the client and the
server.A template of a generic servlet structure is shown in Figure 7.18. This simple servlet just outputs
the two words "Hello World," but it shows the general structure of a full-fledged servlet. The request
object is used to read HTML form data. The response object is used to specify the HTTP response status
Page 46
MODULE –III NOTES DBMS -18CS53
code and headers of the HTTP response. The object out is used to compose the content that is returned to
the client.
JavaServer Pages
JavaServer pages (.JSPs) interchange the roles of output and application logic. JavaServer pages are
written in HTML with servlet-like code embedded in special HTML tags. Thus, in comparison to servlets,
JavaServer pages are better suited to quickly building interfaces that have some logic inside, whereas
servlets are better suited for complex application logic.
While there is a big difference for the programmer, the middle tier handles JavaServer pages in a
very simple way: They are usually compiled into a servlet, which is then handled by a servlet container
analogous to other servlets.
The code fragment in Figure 7.20 shows a simple JSP example. In the middle of the HTML code,
we access information that was passed from a form.
Page 47
MODULE –III NOTES DBMS -17CS53
Maintaining State
As discussed in previous sections, there is a need to maintain a user's state across
different pages. As an example, consider a user who wants to make a purchase at the Barnes
and Nobble website. The user must first add items into her shopping basket, which persists
while she navigates through the site. Thus, we use the notion of state mainly to remember
information as the user navigates through the site.
The HTTP protocol is stateless. We call an interaction with a webserver stateless if no
information is retained from one request to the next request. We call an interaction with a
webserver stateful, or we say that state is maintained, if some memory is stored between
requests to the server, and different actions are taken depending on the contents stored.
Page 48