Язык PL/SQL. Иван Сергеевич Задворьев

Чтение книги онлайн.

Читать онлайн книгу Язык PL/SQL - Иван Сергеевич Задворьев страница 14

Язык PL/SQL - Иван Сергеевич Задворьев

Скачать книгу

число элементов. На физическом уровне в базах данных Oracle такие массивы хранятся в строках таблицы, рядом со значениями скалярных типов.

      Что же касается факультативов, то заранее известной верхней оценки их числа для одного студента нет и обеспечить упорядочение их названий по какому-то правилу не требуется. В этих условиях для хранения данных о факультативах целесообразно использовать вложенные таблицы – в ячейку студента Ильина вкладывается одностолбцовая таблица со списком прослушанных им факультативов, в ячейку студента Варина вкладывается другая таблица факультативов и так далее.

      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

      28

Скачать книгу