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 — так для каждой записи можем сказать, есть ли там слова, похожие на искомые).
Стоит хотя бы попробовать, а применения в голову полезу во время первого перекура)
Началось всё безобидно… я не знал, что такое 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 — так для каждой записи можем сказать, есть ли там слова, похожие на искомые).
Стоит хотя бы попробовать, а применения в голову полезу во время первого перекура)