Язык PL/SQL. Иван Сергеевич Задворьев
Чтение книги онлайн.
Читать онлайн книгу Язык PL/SQL - Иван Сергеевич Задворьев страница 14
Что же касается факультативов, то заранее известной верхней оценки их числа для одного студента нет и обеспечить упорядочение их названий по какому-то правилу не требуется. В этих условиях для хранения данных о факультативах целесообразно использовать вложенные таблицы – в ячейку студента Ильина вкладывается одностолбцовая таблица со списком прослушанных им факультативов, в ячейку студента Варина вкладывается другая таблица факультативов и так далее.
SQL> CREATE TYPE t_course_works AS VARRAY(6) OF INTEGER;
2 /
Type created.
SQL> CREATE TYPE t_elective_courses AS TABLE OF VARCHAR2(100);
2 /
Type created.
SQL> CREATE TABLE students(id INTEGER,
2 surname VARCHAR(100),
3 name VARCHAR(100),
4 course_works t_course_works,
5 elective_courses t_elective_courses)
6 NESTED TABLE elective_courses STORE AS elective_courses_tab;
Table created.
SQL> INSERT INTO students VALUES(18,'Ильин','Виктор',
2 t_course_works(4,4,NULL,5,5),
3 t_elective_courses('Оптимизация баз данных',
4 'Теория надежности'));
1 row created.
SQL> SET FEEDBACK ON
SQL> SELECT * FROM students;
ID SURNAME NAME COURSE_WORKS
– – – –
18 Ильин Виктор T_COURSE_WORKS(4, 4, NULL, 5, 5)
ELECTIVE_COURSES
–
T_ELECTIVE_COURSES('Оптимизация баз данных', 'Теория надежности')
1 row selected.
На физическом уровне в базе данных для столбца elective_courses будет неявно создана вспомогательная таблица (мы дали ей имя elective_courses_tab), в которой будут храниться все строки всех вложенных таблиц столбца elective_courses. Эти строки будут ссылаться на строки основной таблицы students, то есть фактически с помощью основной и вспомогательной таблиц и механизма ключей будет классическим способом моделироваться отношение «один ко многим» между студентами и факультативами. Рассмотрим теперь, как с массивами VARRAY и вложенными таблицами работают в коде PL/SQL. Напишем программу, которая выводит сведения о студенте, его оценки за курсовые работы на младших и старших курсах отдельно, а также о список прослушанных студентом факультативов.
SQL> DECLARE
2 l_surname students.surname%TYPE;
3 l_course_works t_course_works;
4 l_elective_courses t_elective_courses;
5 l_row_index PLS_INTEGER;
6 l_student_id students.id%TYPE := 18;
7 BEGIN
8
9 SELECT surname,course_works,elective_courses
10 INTO l_surname,l_course_works,l_elective_courses
11 FROM students WHERE id=l_student_id;
12
13 DBMS_OUTPUT.PUT_LINE('Студент: '||l_surname);
14
15 IF l_course_works.EXISTS(1) or l_course_works.EXISTS(2) THEN
16 DBMS_OUTPUT.PUT_LINE('Курсовые на младших курсах:');
17 ELSE
18 DBMS_OUTPUT.PUT_LINE('Курсовые на младших курсах отсутствуют')
19 END IF;
20
21 FOR i in 1..2 LOOP
22 IF l_course_works.EXISTS(i) THEN
23 DBMS_OUTPUT.PUT_LINE(' Курсовая на '||i||' курсе: ' ||
24 ' оценка '||l_course_works(i));
25 END IF;
26 END LOOP;
27