Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Oracle Tutorial.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
402 Кб
Скачать
☆

Задача. Простая расклейка-склейка.

Дана строка, представляющая собой последовательность натуральных чисел, соединенных символом ';': '12;657;34;11;90;213;1221;227'

Написать запрос, который делает из нее строку, соединенную символами ',', но отсортированную по возрастанию.

Решаем задачу, воспользовавшись запросами, приведенными в главе ""Расклейка" и "Склейка" строк".

В подзапросе q1 получаем отсортированный расклеенный набор, который затем склеиваем:

select ids

from (select ltrim(sys_connect_by_path(id, ','), ',') as ids

from (select id, lag(id) over(order by id) as prev_id

from (select to_number(regexp_substr(s, '[^;]+', 1, level)) id

from (select '12;657;34;11;90;213;1221;227' s

from dual)

connect by regexp_substr(s, '[^;]+', 1, level) is not null

order by id) q1)

start with prev_id is null

connect by prev_id = prior id

order by level desc)

where rownum = 1;

Теперь усложним задачу. Допустим, во входных данных возможны повторения, например, '12;657;34;11;90;213;11;213'.

Отсортируем набор, дав каждому элементу свой уникальный номер (ordr) в отсортированном наборе:

select id, row_number() over(order by id) ordr

from (select to_number(regexp_substr(s, '[^;]+', 1, level)) id

from (select '12;657;34;11;90;213;11;213' s from dual)

connect by regexp_substr(s, '[^;]+', 1, level) is not null);

Воспользуемся этим запросом (в качестве подзапроса q1) для решения задачи. Иерархию раскручиваем по ordr вместо id:

select ids

from (select ltrim(sys_connect_by_path(id, ','), ',') as ids

from (select id, ordr, lag(ordr) over(order by ordr) as prev_ordr

from (select id, row_number() over(order by id) ordr

from (select to_number(regexp_substr(s,

'[^;]+',

1,

level)) id

from (select '12;657;34;11;90;213;11;213' s

from dual)

connect by regexp_substr(s, '[^;]+', 1, level) is not null)) q1)

start with prev_ordr is null

connect by prev_ordr = prior ordr

order by level desc)

where rownum = 1;

Задача. Скрипт создания индексов.

Получить из словаря данных упрощенный скрипт создания всех индексов текущей схемы.

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

Индексы бывают неуникальными и уникальными. Уникальные индексы запрещают вставлять в проиндексированные наборы поле дублирующиеся значения (кроме NULL).

Кроме того индексы бывают различных типов (по организации) NORMAL, BITMAP, FUNCTION-BASED и т.п. Но в нашей задаче мы не будем детально расписывать эти опции в получаемом скрипте создания индексов.

Напишем запрос по вьюшкам словаря данных USER_INDEXES и USER_IND_COLUMNS. Агрегирующая функция WM_CONCAT собирает список значений своего аргумента через запятую (без возможности указания порядка):

SELECT INDEX_NAME,

'CREATE ' || DECODE(UNIQUENESS, 'UNIQUE', 'UNIQUE ') || 'INDEX ' ||

INDEX_NAME || ' ON ' || TABLE_NAME || '(' || COLUMN_LIST || ');' INDEX_CREATE_SCRIPT

FROM (SELECT I.UNIQUENESS,

I.INDEX_NAME,

IC.TABLE_NAME,

WM_CONCAT(IC.COLUMN_NAME) COLUMN_LIST

FROM USER_INDEXES I, USER_IND_COLUMNS IC

WHERE I.INDEX_NAME = IC.INDEX_NAME

GROUP BY I.UNIQUENESS, I.INDEX_NAME, IC.TABLE_NAME);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]