Database Application
Development
CSC343 – Introduction to databases – A. Vaisman
Overview
Concepts:
SQL in application code
Embedded SQL
Cursors
Dynamic SQL
Stored procedures
CSC343 – Introduction to databases – A. Vaisman
SQL in Application Code
SQL commands can be called from within a
host language (e.g., C++ or Java) program.
SQL statements can refer to host variables
(including special variables used to return
status).
Must include a statement to connect to the right
database.
Two main integration approaches:
Embed SQL in the host language (Embedded
SQL, SQLJ)
Create special API to call SQL commands (JDBC)
CSC343 – Introduction to databases – A. Vaisman
SQL in Application Code
(Contd.)
Impedance mismatch:
SQL relations are (multi-) sets of
records, with no a priori bound on the
number of records. No such data
structure exist traditionally in
procedural programming languages
such as C or C++.
SQL supports a mechanism called a
cursor to handle this.
CSC343 – Introduction to databases – A. Vaisman
Overview
Concepts:
SQL in application code
Embedded SQL
Cursors
Dynamic SQL
Stored procedures
CSC343 – Introduction to databases – A. Vaisman
Embedded SQL
Approach: Embed SQL in the host
language.
A preprocessor converts the SQL statements
into special API calls.
Then a regular compiler is used to compile
the code.
Language constructs:
Connecting to a database:
EXEC SQL CONNECT
Declaring variables:
EXEC SQL BEGIN (END) DECLARE SECTION
Statements:
EXEC SQL Statement
CSC343 – Introduction to databases – A. Vaisman
Embedded SQL: Variables
In the host program:
EXEC SQL BEGIN DECLARE SECTION
char c_sname[20];
long c_sid;
short c_rating;
float c_age;
EXEC SQL END DECLARE SECTION
Two special “error” variables:
SQLCODE (long, is negative if an error has occurred)
SQLSTATE (char[6], predefined codes for common errors)
CSC343 – Introduction to databases – A. Vaisman
Overview
Concepts:
SQL in application code
Embedded SQL
Cursors
Stored procedures
CSC343 – Introduction to databases – A. Vaisman
Cursors
Can declare a cursor on a relation or query
statement (which generates a relation).
Can open a cursor, and repeatedly fetch a
tuple then move the cursor, until all tuples
have been retrieved.
Can use the ORDER BY clause, in queries that are
accessed through a cursor, to control the order in
which tuples are returned.
• Fields in ORDER BY clause must also appear in SELECT
clause.
Can also modify/delete tuple pointed to by a
cursor.
CSC343 – Introduction to databases – A. Vaisman
Cursor that gets names of
sailors who’ve reserved a red
boat, in alphabetical order
EXEC SQL DECLARE sinfo CURSOR FOR
SELECT S.sname
FROM Sailors S, Boats B, Reserves R
WHERE S.sid=R.sid AND R.bid=B.bid AND B.color=‘red’
ORDER BY S.sname
CSC343 – Introduction to databases – A. Vaisman 1
Embedding SQL in C: An
Example
char SQLSTATE[6];
EXEC SQL BEGIN DECLARE SECTION ;(=>declare section)
char c_sname[20]; short c_minrating; float c_age;
EXEC SQL END DECLARE SECTION
c_minrating = random();
EXEC SQL DECLARE sinfo CURSOR FOR ;(=>declare section)
SELECT S.sname, S.age
FROM Sailors S
WHERE S.rating > :c_minrating
ORDER BY S.sname;
EXEC SQL OPEN CURSOR sinfo ;(=>statement)
do {
EXEC SQL FETCH sinfo INTO :c_sname, :c_age;(=>statement)
printf(“%s is %d years old\n”, c_sname, c_age);
} while (SQLSTATE != ‘02000’);
EXEC SQL CLOSE sinfo; ;(=>statement)
CSC343 – Introduction to databases – A. Vaisman 1
Overview
Concepts:
SQL in application code
Embedded SQL
Cursors
Dynamic SQL
Stored procedures
CSC343 – Introduction to databases – A. Vaisman 1
Dynamic SQL
SQL query strings are now always known at
compile time (e.g., spreadsheet, graphical
DBMS frontend): allow construction of SQL
statements on-the-fly.
Example:
EXEC SQL BEGIN DECLARE SECTION
char c_sqlstring[]=
{“DELETE FROM Sailors WHERE raiting>5”};
EXEC SQL END DECLARE SECTION
EXEC SQL PREPARE readytogo FROM :c_sqlstring;
EXEC SQL EXECUTE readytogo;
CSC343 – Introduction to databases – A. Vaisman 1
Stored Procedures
What is a stored procedure:
Program executed through a single SQL
statement
Executed in the process space of the server
Advantages:
Can encapsulate application logic while
staying “close” to the data
Reuse of application logic by different users
Avoid tuple-at-a-time return of records
through cursors
CSC343 – Introduction to databases – A. Vaisman 1
Stored Procedures: Examples
CREATE PROCEDURE ShowNumReservations
SELECT S.sid, S.sname, COUNT(*)
FROM Sailors S, Reserves R
WHERE S.sid = R.sid
GROUP BY S.sid, S.sname
Stored procedures can have parameters:
Three different modes: IN, OUT, INOUT
CREATE PROCEDURE IncreaseRating(
IN sailor_sid INTEGER, IN increase INTEGER)
UPDATE Sailors
SET rating = rating + increase
WHERE sid = sailor_sid
CSC343 – Introduction to databases – A. Vaisman 1
Stored Procedures: Examples
(Contd.)
Stored procedure do not have to be
written in SQL:
CREATE PROCEDURE TopSailors(
IN num INTEGER)
LANGUAGE JAVA
EXTERNAL NAME “file:///c:/storedProcs/rank.jar”
CSC343 – Introduction to databases – A. Vaisman 1
Calling Stored Procedures
EXEC SQL BEGIN DECLARE SECTION
Int sid;
Int rating;
EXEC SQL END DECLARE SECTION
// now increase the rating of this sailor
EXEC CALL IncreaseRating(:sid,:rating);
CSC343 – Introduction to databases – A. Vaisman 1
Calling Stored Procedures
(Contd.)
JDBC: SQLJ:
CallableStatement #sql iterator
cstmt= ShowSailors(…);
con.prepareCall(“{call
ShowSailors showsailors;
ShowSailors});
#sql showsailors={CALL
ResultSet rs =
ShowSailors};
cstmt.executeQuery();
while (rs.next()) { while
(showsailors.next()) {
…
…
}
}
CSC343 – Introduction to databases – A. Vaisman 1
SQL/PSM
Most DBMSs allow users to write stored procedures
in a simple, general-purpose language (close to
SQL) SQL/PSM standard is a representative
Declare a stored procedure:
CREATE PROCEDURE name(p1, p2, …, pn)
local variable declarations
procedure code;
Declare a function:
CREATE FUNCTION name (p1, …, pn) RETURNS
sqlDataType
local variable declarations
function code;
CSC343 – Introduction to databases – A. Vaisman 1
Main SQL/PSM Constructs
CREATE FUNCTION rate Sailor
(IN sailorId INTEGER)
RETURNS INTEGER
DECLARE rating INTEGER
DECLARE numRes INTEGER
SET numRes = (SELECT COUNT(*)
FROM Reserves R
WHERE R.sid = sailorId)
IF (numRes > 10) THEN rating =1;
ELSE rating = 0;
END IF;
RETURN rating;
CSC343 – Introduction to databases – A. Vaisman 2
Main SQL/PSM Constructs
(Contd.)
Local variables (DECLARE)
RETURN values for FUNCTION
Assign variables with SET
Branches and loops:
IF (condition) THEN statements;
ELSEIF (condition) statements;
… ELSE statements; END IF;
LOOP statements; END LOOP
Queries can be parts of expressions
Can use cursors naturally without “EXEC SQL”
CSC343 – Introduction to databases – A. Vaisman 2