green_fr: (Default)
[personal profile] green_fr

Есть некий файл, который надо загрузить в базу данных.
В файле есть 2 различных видов записи, какая запись перед нами можно понять по первому полю файла.
Я сделал 2 таблицы и написал SQLLoader control file, который вполне прилично грузит записи по соответствующим файлам.
Проблема в том, что записи первого рода являются заголовками для серии (переменного размера) записей второго рода. Никаких данных, позволяющих провести связывание, во вторых записях нет. А связать нужно.

Первый вариант - вставлять в базу номер строки в исходном файле. Теоретически должно было бы работать, но тут у меня небольшое осложнение. Я пишу файлы не replace, а append, т.е. к моменту загрузки очередного файла в таблицах могут уже находиться строки из предыдущих файлов.
Т.е. для этого варианта мне не хватает какого-нибудь идентификатора файла (факта загрузки).

Теоретически для этого можно было бы использовать текущую дату, но по понятным причинам (2 загрузки в 1 день, загрузка ровно в полночь и т.п.) мне это не нравится.

Другой вариант - вставлять ещё и некий глобальный (в пределах одной таблицы) sequence number, позволяющий отделять группы линий, относящихся к одному файлу. Это не работает, если придёт файл только с записями первого рода.

Какой-нибудь совершенно другое решение?

Date: 2006-04-12 07:20 am (UTC)
From: [identity profile] aguti.livejournal.com
Я не очень поняла проблему. Чем не подходят sequence? Ты вставляешь в первую таблицу (заголовки) sequenceName.NEXTVAL (уникальный индентификатор), а во вторую sequenceName.CURRVAL (ссылка на этот идентификатор).
Или я что-то не понимаю?

Date: 2006-04-12 08:15 pm (UTC)
From: [identity profile] green-fr.livejournal.com
Ты не поняла, что бывают люди, которые до этого просто не догоняют :-)
Похоже, это и есть решение, что мне нужно. Проверю завтра, спасибо!

Date: 2006-04-22 12:20 pm (UTC)
From: [identity profile] green-fr.livejournal.com
Кстати, а как оно в параллельном режиме работает? Если между nextval и currval кто-то другой попросит nextval? Можно как-то заблокировать sequenca на время исполнения моего скрипта?
Вопрос наверняка в FAQ какого-нибудь fido7.oracle.ru :-)

Date: 2006-04-24 02:02 pm (UTC)
From: [identity profile] aguti.livejournal.com
Секвансы - такая уникальная штука, которая никогда не бывает транзакционной. То есть они изначально заточены работать с несколькими параллельными режимами (для этого и делались, собственно - гарантировать уникальность).

Date: 2006-04-24 02:29 pm (UTC)
From: [identity profile] aguti.livejournal.com
Прочла что написала - решила разъяснить. CURRVAL в Оракле привязан к сессии - то есть он останется неизменным, пока в этой же сессии ты не вызовешь новый NEXTVAL, а если никогда не вызовешь - то хоть до следующего года, главное - не закрывать сессию :). Но это не мешает в другой сессии вызывать NEXTVAL и получать новое значение.

То есть лочить ничего не нужно, секвенсы и так работают как тебе нужно. Короче, секвенсы - это очень круто :)

offtopic

Date: 2006-04-18 03:32 pm (UTC)
From: [identity profile] kkk-ddd.livejournal.com
Privet, ya poterjal tvoj telefon, budem v gorode 18-23
moj telefon: +972.52.680.1078

Profile

green_fr: (Default)
green_fr

January 2026

S M T W T F S
    123
4 5 6 7 8 910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 12th, 2026 05:01 am
Powered by Dreamwidth Studios