The University of Texas
CS 327e Spring 2003 Test
2
NAME:
__________________________________ LAST 4 DIGITS of SSN: __________________
Date: 2003-03-28 Duration:
60 mins Total: 11 Qs (100 pts)
For
the multiple-choice questions 1 through 10, Use a pencil to circle the correct
answer. Each multiple-choice question carries 8 points.
Each correct answer is marked
in bold.
1) Procedural SQL
allows you to use procedural code and SQL statements that are stored in the
database.
|
a. |
True. |
|
b. |
False. |
2) Triggers can be used to call other stored procedures.
|
a. |
True. |
|
b. |
False. |
3) A trigger
|
a. |
Is always associated with a view. |
|
b. |
Is always invoked after a row is deleted. |
|
c. |
Can never be used to enforce constraints. |
|
d. |
All of the above. |
|
e. |
None of the above. |
4) A stored procedure
|
a. |
Is a named collection of processes that
need to be followed and stored in a refrigerator |
|
b. |
Reduces network traffic. |
|
c. |
All of the above |
|
d. |
None of the above |
5) Operational data storage differs from decision support in main
areas, which are:
|
a. |
Timespan |
|
b. |
Granularity |
|
c. |
Directionality |
|
d. |
a) And b) |
|
e. |
a) And c) |
6) A rule that defines the data warehouse is
|
a. |
Data warehouse data are mainly read-only
with periodic batch updates from the operational data. |
|
b. |
Data warehouse contains historical data
over a time horizon. |
|
c. |
a) And b) |
7) The kinds of
permissions that you can grant in sql server are:
|
a. |
Server |
|
b. |
Database Object |
|
c. |
Database Statement |
|
d. |
All of the above |
|
e. |
None of the above |
8) Facts are non-numeric measurements that represent a specific
business aspect or activity.
|
a. |
True. |
|
b. |
False. |
9) Views can be built using
other views.
|
a. |
True. |
|
b. |
False. |
10) Views can be used to
enforce security.
|
a. |
True. |
|
b. |
False. |
For question 11,
Consider the
suppliers-parts-projects database, sample data (same as lab1) for which is
shown in the last page. There are 4 tables containing relevant data:
1) SUPPLIER (SID, Name,
Status, City)
2) PART (PID, Name,
Color, Weight, City)
3) PROJECT (JID, Name,
City)
4) SHIPMENT (SID, PID, JID,
Qty)
Suppliers (S), parts (P), and
projects (J) are uniquely identified (PK) by supplier id (SID), part id (PID),
and project id (JID), respectively. The significance of an SPJ (shipment) row
is that the specified supplier supplies the specified part to the specified
project in the specified quantity (and the combination SID-PID-JID uniquely
identifies (PK) such a row). Assume none of the columns in all of the tables
allow Nulls.
Use the following SQL
Server CREATE PROCEDURE syntax:
CREATE PROC [EDURE] procedure_name
[ ; number ]
[ { @parameter data_type }
[ VARYING ] [ = default ]
[ OUTPUT ]
] [ ,...n ]
[ WITH
{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
[ FOR REPLICATION ]
AS sql_statement [ ...n ]
Use the following SQL
Server IF…ELSE syntax (only if required):
IF
Boolean_expression
{sql_statement | statement_block}
[ELSE
{sql_statement | statement_block}]
e.g.
IF (SELECT AVG (price)
FROM titles WHERE type = 'mod_cook') < $15
BEGIN
PRINT 'The following titles are excellent
mod_cook books:'
SELECT SUBSTRING (title, 1, 35) AS Title
FROM titles
WHERE type = 'mod_cook'
END
ELSE
IF
(SELECT AVG (price) FROM titles WHERE type = 'mod_cook') > $15
BEGIN
PRINT 'The following titles are expensive
mod_cook books:'
SELECT UPPER (RTRIM (title)) AS Title
FROM titles
WHERE type = 'mod_cook'
END
11) (20 points) Write a procedure
that lists the count of all the suppliers, parts, and projects that exist in a
given (case-insensitive) city. The procedure will check for non-null input,
and then return three counts:
NumSuppliers: Number of
suppliers belonging to the city
NumParts: Number of parts
belonging to the city
NumProjects: Number of
projects belonging to the city
In addition, return a status
of 0 for success, and –1 for all other situations. When the status is –1, the 3
counts should be set to 0.
Assume all SPJ tables exist.
Note that for this procedure, the SHIPMENT table does not play any role.
Hence, for the data shown in
the last page, if we execute the following statements on Query Analyzer in
SQLServer:
DECLARE @mySuppliers int
DECLARE @myParts int
DECLARE @myProjects int
DECLARE @myStatus int
EXEC GET_SPJCOUNTS_FOR_CITY 'Athens', @mySuppliers OUTPUT, @myParts
OUTPUT, @myProjects OUTPUT, @myStatus OUTPUT
IF @myStatus = 0
BEGIN
PRINT 'There are ' + CAST (@mySuppliers AS
nvarchar (20)) + ' suppliers in your city.'
PRINT 'There are ' + CAST (@myParts AS nvarchar
(20)) + ' parts in your city.'
PRINT 'There are ' + CAST (@myProjects AS
nvarchar (20)) + ' projects in your city.'
PRINT 'Your Procedure was successful!'
END
ELSE
BEGIN
PRINT 'Your Procedure was not successful. Please check
your input for non-NULL values. '
END
GO
Should result in:
There are 1 suppliers in your
city.
There are 0 parts in your
city.
There are 2 projects in your
city.
Your Procedure was successful!
Clearly state any assumptions.
HINT: You may need to use the CAST, RTRIM, and UPPER built-in
functions, usage of which is shown above, syntax is shown below.
1)
CAST
CAST ( expression
AS data_type )
Returns the
“expression” converted as “data_type”
2) RTRIM
RTRIM ( character_expression
)
Returns a character string
after truncating all trailing blanks.
3) UPPER
UPPER ( character_expression
)
Returns
a character expression with any (lower, upper, or mixed) case character data
converted to uppercase.
Write the solution to this
problem on next page.
CREATE PROCEDURE
GET_SPJCOUNTS_FOR_CITY
@City nvarchar
(255),
@NumSuppliers int OUTPUT,
@NumParts int OUTPUT,
@NumProjects int OUTPUT,
@Status int OUTPUT
AS
BEGIN
--
Initialize output variables
SET
@NumSuppliers = 0
SET
@NumParts = 0
SET
@NumProjects = 0
SET
@Status = -1
--
Get Number of Suppliers belonging to @City
SELECT
@NumSuppliers = COUNT (DISTINCT SID) FROM SUPPLIER
WHERE
UPPER (RTRIM (SUPPLIER.City)) = UPPER (RTRIM (@City));
--
Get Number of Parts belonging to @City
SELECT
@NumParts = COUNT (DISTINCT PID) FROM PART
WHERE
UPPER (RTRIM (PART.City)) = UPPER (RTRIM (@City));
--
Get Number of Projects belonging to @City
SELECT
@NumProjects = COUNT (DISTINCT JID) FROM PROJECT
WHERE
UPPER (RTRIM (PROJECT.City)) = UPPER (RTRIM (@City));
--
Set Successful Status
SET
@Status = 0
END
SUPPLIER
|
SID |
Name |
Status |
City |
|
S1 |
Smith |
20 |
London |
|
S2 |
Jones |
10 |
Paris |
|
S3 |
Blake |
30 |
Paris |
|
S4 |
Clark |
20 |
London |
|
S5 |
Adams |
30 |
Athens |
PART
|
PID |
Name |
Color |
Weight |
City |
|
P1 |
Nut |
Red |
12.2 |
London |
|
P2 |
Bolt |
Green |
17.0 |
Paris |
|
P3 |
Screw |
Blue |
17.0 |
Rome |
|
P4 |
Screw |
Red |
14.0 |
London |
|
P5 |
Cam |
Blue |
12.0 |
Paris |
|
P6 |
Cog |
Red |
19.0 |
London |
PROJECT
|
JID |
Name |
City |
|
J1 |
Sorter |
Paris |
|
J2 |
Display |
Rome |
|
J3 |
OCR |
Athens |
|
J4 |
Console |
Athens |
|
J5 |
RAID |
London |
|
J6 |
EDS |
Oslo |
|
J7 |
Tape |
London |
SHIPMENT
|
SID |
PID |
JID |
Qty |
|
S1 |
P1 |
J1 |
200 |
|
S1 |
P1 |
J4 |
700 |
|
S2 |
P3 |
J1 |
400 |
|
S2 |
P3 |
J2 |
200 |
|
S2 |
P3 |
J3 |
200 |
|
S2 |
P3 |
J4 |
500 |
|
S2 |
P3 |
J5 |
600 |
|
S2 |
P3 |
J6 |
400 |
|
S2 |
P3 |
J7 |
800 |
|
S2 |
P5 |
J2 |
100 |
|
S3 |
P3 |
J1 |
200 |
|
S3 |
P4 |
J2 |
500 |
|
S4 |
P6 |
J3 |
300 |
|
S4 |
P6 |
J7 |
300 |
|
S5 |
P2 |
J2 |
200 |
|
S5 |
P2 |
J4 |
100 |
|
S5 |
P5 |
J5 |
500 |
|
S5 |
P5 |
J7 |
100 |
|
S5 |
P6 |
J2 |
200 |
|
S5 |
P1 |
J4 |
100 |
|
S5 |
P3 |
J4 |
200 |
|
S5 |
P4 |
J4 |
800 |
|
S5 |
P5 |
J4 |
400 |
|
S5 |
P6 |
J4 |
500 |