Как стать автором
Обновить

Nested Tables в Oracle для чайников.

Cегодня таки пришлось столкнуться с nested tables в Oracle.
Началось всё безобидно… я не знал, что такое nested tables.

chuma
мозг себе взорвал
чтобы так искать по идее нужно чтобы в табличке было поле типа pic_search_word_tabtype например. Зачем оно нужно, или когда заполняется, не могу понять…
Артур
ты почитал что такое nested table? =)
chuma
а
chuma
сейчас почитаю

И я полез читать. Такого левелапа не получал уже месяца 2 ^_^ Зато теперь знаю и умею, может пригодится когда-нибудь) Смысл этих табличек — хранить в поле записи таблицы, а не значения.

Делается оно вот так:
1. Создаем свой тип. у меня тип назывался NEAR_WORD_TABTYPE и представлял собой список строк:

CREATE TYPE «SERVICE».«NEAR_WORD_TABTYPE» AS
TABLE OF VARCHAR2(200)

2. Задача — хранить в записях таблицы список строк. Для этого добавляем поле такого типа в таблицу.

ALTER TABLE NEAR_ADDRESS
ADD (S_WORDS NEAR_WORD_TABTYPE) NESTED TABLE S_WORDS STORE AS S_WORDS_TABLE;

т.е. добавили поле с именем S_WORDS моего пользовательского типа, и указали что имя таблицы (ведь мы типа храним в записи еще 1 таблицу) будет S_WORDS_TABLE. Мне это имя потом не пригодилось

3. Как запихивать туда значения? Делается это в 2 этапа. Изначально это поле NULL и добавить туда ничего нельзя. Чтобы было можно — надо при вставке нормальной записи указать, что в поле S_WORDS таки будет список. При этом вставляется пустой список:

INSERT INTO NEAR_ADDRESS (S_WORDS, ID)
VALUES
(NEAR_WORD_TABTYPE(), 500);
commit;

4. Теперь можно вставить что-нибудь в нашу таблицу в таблице.

INSERT INTO
THE
(
SELECT S_WORDS FROM NEAR_ADDRESS A WHERE ID = 500
)
VALUES ('hello');

при этом внимание! запрос внутри THE() должен возвращать четко одну запись. А вставить туда можно сколько угодно значений, выполняя предыдущий запрос с THE() несколько раз.

5. Проверяем, получилось ли у нас вставить туда что-нибудь?

SELECT * FROM NEAR_ADDRESS, TABLE(CAST(S_WORDS AS NEAR_WORD_TABTYPE)) WHERE ID= 500;

Запрос вернет столько строк, сколько записей в поле S_WORDS, в поле param_value (само прибьется) будут значения.

Мне это пригодилось для фуллтекст поиска (в S_WORDS хранится список всех слов текста, который находится в другом поле той же записи. При поиске юзаем алгоритм Левенштейна и сравниваем искомые слова со словами в S_WORDS — так для каждой записи можем сказать, есть ли там слова, похожие на искомые).

Стоит хотя бы попробовать, а применения в голову полезу во время первого перекура)
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.