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;