Иван Сергеевич Задворьев

Язык PL/SQL


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

Код '||l_code||' есть в справочнике');

      15 END IF;

      16 END;

      17 /

      1) Термин для MD – Молдавия

      2) Код UA есть в справочнике

      PL/SQL procedure successfully completed.

      Массивы переменной длины и вложенные таблицы

      Типы данных на основе вложенных таблиц и массивов переменной длины в основном создаются как объекты баз данных и используются в объектно-реляционных расширениях Oracle. Соответственно, для работы со считываемыми из баз данных массивами и вложенными таблицами в программах PL/SQL следует использовать переменные таких же типов данных.

      Рассмотрим объектные расширения Oracle и работу с ними в PL/SQL на следующем примере.

      Пусть есть таблица students со сведениями о студентах, у которой первые три столбца имеют скалярные типы данных, а столбцы course_works (курсовые работы) и elective_courses (факультативы) объявлены как массив переменной длины и вложенная таблица.

      Считаем, что студенты учатся максимум 6 лет (могут меньше) и на каждом курсе может быть только одна курсовая работа (на каких-то курсах курсовых работ может не быть). Из сказанного следует, что

      больше 6 курсовых работ точно быть не может;

      если оценки за курсовые работы выписать в виде упорядоченного множества (списка), то порядковый номер оценки будет соответствовать курсу обучения (для курсов, на которых не было курсовых работ, следует на эти места поместить значения NULL).

      Массивы переменной длины как раз и предназначены для представления упорядоченных множеств (списков) с заданным ограничением на максимальное число элементов. На физическом уровне в базах данных 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, то есть фактически с помощью основной и вспомогательной таблиц и механизма ключей будет классическим способом моделироваться