Do the specified lab 7 review exercises.
Given the Student and Enrollment tables, what do the following relational algebra queries return?
Student ⨯ Enrollment
πfirstName,lastName,email(σgrade=‘A’(σS.id=E.studentId(S ⨯ E)))
πfirstName,lastName,email(σgrade=‘A’(S ⋈S.id=E.studentId E))
πfirstName,lastName,email(S ⋈S.id=E.studentId σgrade=‘A’(E))
πfirstName,lastName,email(S) ⋈S.id=E.studentId σgrade=‘A’(E)
x ← πs.id(ρs(Student) ⋈m.id=s.mentorId ρm(Student))
y ← πm.id(ρs(Student) ⋈m.id=s.mentorId ρm(Student))
result ← x ∪ y
What do the following relational calculus queries return?
{s.firstName, s.lastName, s.email |
Student(s) ∧ ∃e(Enrollment(e) ∧ e.grade=‘A’ ∧ e.studentId=s.id)}
{s.firstName, s.lastName, s.email |
Student(s) ∧ Enrollment(e) ∧ e.grade=‘A’ ∧ e.studentId=s.id}
{s | ¬Student(s)}
Consider the following questions.
If possible, specify a useful database command of some sort that can’t be implemented using standard SQL.
What are the basic approaches to database programming that abstract above raw SQL? Have you used technologies that implement any of them?
For each of the following code segments:
BEGIN
dbms_output.put_line('Hello, PL/SQL!');
END;
DECLARE
CURSOR namesOut IS
SELECT firstName, lastName
FROM Student
ORDER BY lastName, firstName;
BEGIN
FOR nOut IN namesOut LOOP
dbms_output.put_line(nOut.firstName || ' ' || nOut.lastName);
END LOOP;
END;
CREATE PROCEDURE skipCount(limit IN INTEGER, step IN INTEGER) AS
BEGIN
FOR i IN 1..limit LOOP
IF MOD(i, step) = 1 THEN
dbms_output.put_line(i);
ELSE
dbms_output.put_line('-');
END IF;
END LOOP;
END;
CREATE PROCEDURE enrollStudent
(studentIDIn IN Student.ID%type,sectionIDIn IN Section.ID%type) AS
counter INTEGER;
BEGIN
SELECT COUNT(*) INTO counter FROM Enrollment
WHERE sectionID = sectionIDIn AND studentID = studentIDIn;
IF counter >= 1 THEN
RAISE_APPLICATION_ERROR(-20000, 'Student ' || studentIDIn ||
' is already enrolled in section ' || sectionIDIn);
END IF;
INSERT INTO Enrollment(studentID, sectionID)
VALUES (studentIDIn, sectionIDIn);
dbms_output.put_line('Student ' || studentIDIn ||
' enrolled in section ' || sectionIDIn);
END;
CREATE FUNCTION factorial (n IN POSITIVE) RETURN INTEGER AS
BEGIN
IF n = 1 THEN
RETURN 1;
ELSE
RETURN n * factorial(n - 1);
END IF;
END factorial;
CREATE TRIGGER noOverflow BEFORE INSERT ON Enrollment FOR each row
DECLARE
counter INTEGER;
sectionTooBig EXCEPTION;
BEGIN
SELECT COUNT(*) INTO counter FROM Enrollment
WHERE sectionID = :new.sectionID;
dbms_output.put_line('First, check the size of that section.');
IF counter >= 5 THEN
raise sectionTooBig;
END IF;
EXCEPTION
WHEN sectionTooBig THEN
RAISE_APPLICATION_ERROR(-20001,'full sect:'||:new.sectionID);
END;