Pull to refresh

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 — так для каждой записи можем сказать, есть ли там слова, похожие на искомые).

Стоит хотя бы попробовать, а применения в голову полезу во время первого перекура)
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.