Базы данных Oracle - статьи

         

Просмотр входивших


Пример просмотра (SELECT * …) уже приводился. Однако для получения данных в табличном виде запрос придется усложнить. Проблема, которую придется учитывать в таком запросе - наличие в поле PERSON разных строк одной и той же таблицы значений разных типов. Бороться с проблемой позволяет специальное расширение SQL:

SELECT TREAT (person AS person_typ).name FROM checkpoint;

(В скобках отмечу, что к сожалению для выдачи данных базового типа ANYTYPE в Oracle придумано отдельное решение).

Обратите внимание, что столбец для выдачи можно формировать, трактуя поле PERSON отправной таблицы и как, например, EMPLOYEE_TYP, несмотря на то, что в CHECKPOINT имеются и строки другого типа:

SELECT TREAT (person AS employee_typ).empid FROM checkpoint;

(Действительно, строки выводятся даже для персон, не являющихся сотрудниками, вследствие чего не имеющих табельного номера EMPID).

Отбор входивших персон конкретного типа можно сформулировать во фразе WHERE, для которой придуманы другие специальные конструкции:

SELECT * FROM checkpoint WHERE person IS OF (employee_typ);

Обратите внимание, что выдались строки с данными типа EMPLOYEE_TYP и всех его подтипов. Если же строки с данными подтипов выдавать не нужно, можно указать следующее:

SELECT * FROM checkpoint WHERE person IS OF (ONLY employee_typ);

Вот как можно объединить два приведенные выше варианта отбора - строк по типам во фразе WHERE и столбцов с атрибутами, возможно других, типов:

SELECT SYSDATE, c.person.name, TREAT (c.person AS doctor_typ).phone FROM checkpoint c WHERE person IS OF (employee_typ);

Обратите внимание, что по синтаксису, принятом в Oracle написать во фразе SELECT выдачу C.PERSON.PHONE, наподобие C.PERSON.NAME, не получится. Не получится даже написать SELECT c.person.empid …, несмотря на то, что фразой WHERE отбираются сотрудники, которые имеют табельный номер EMPID. Для обращения к свойствам подтипов вам все равно придется написать SELECT TREAT (c.person AS doctor_typ).empid …, указав явно подтип, где возникло это свойство. Для свойства NAME приведения типа не требуется, так как оно задано для ("основного") типа столбца PERSONS, то есть PERSONS_TYP, а не для подтипов PERSONS_TYP.



Содержание раздела