|
|
|
Фокс и Оракл
|
|||
|---|---|---|---|
|
#18+
Добый день Как можно из фокса блокироварь табличку/запись в Оракле? У меня клиенты одновременно создают разные документы которые нужно нумеровать. В фоксе просто блокировал строчку в таблице DOCUMENTS на секунду ... А если это не возможно или не правильно – как из ХП Оракла получить нужное значение поля... заранее спасибо за ответы П.с. просьба методы типа REQUERY() не предлогать - у меня очень часто случаются ошибки - очень часто одновременно создаются документы с одинаковым номером ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2007, 19:08 |
|
||
|
Фокс и Оракл
|
|||
|---|---|---|---|
|
#18+
если проблема только в нумерации (последовательной), то у Oracle есть SEQUENCE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2007, 19:45 |
|
||
|
Фокс и Оракл
|
|||
|---|---|---|---|
|
#18+
так как типы документов не фиксированы - они создаются пользователем, для меня очень трудно будет написать код для создания сиквенса для каждого документа из фокса ... а таблица documents иммеет структуру: id n(10), docprefix c(10), docno n(10), docpost c(10) , descritpion c(30),type n(1) ... и работает просто update documents set docno=docno+1 where id=_id_from_list так как пользователи активно создают документы, иногда 2 пользователя могут получить один и тот же номер документа. а если будет блокировка или же update будет в ХП с возвратом значения в Фокс, проблеммы не будет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2007, 21:48 |
|
||
|
Фокс и Оракл
|
|||
|---|---|---|---|
|
#18+
Haykoтак как типы документов не фиксированы - они создаются пользователем, для меня очень трудно будет написать код для создания сиквенса для каждого документа из фокса ... а таблица documents иммеет структуру: id n(10), docprefix c(10), docno n(10), docpost c(10) , descritpion c(30),type n(1) ... и работает просто update documents set docno=docno+1 where id=_id_from_list так как пользователи активно создают документы, иногда 2 пользователя могут получить один и тот же номер документа. а если будет блокировка или же update будет в ХП с возвратом значения в Фокс, проблеммы не будет кто-то кого-то не понимает.. Вам нужно, чтобы номера документов следовали строго по порядку??? то есть 1-2-3---125-126.... или же Вам нужно просто, чтобы номер документа был уникален? если 2-й случай - то СИКВЕНСЫ и никакого кода по созданию их писать не надо.... Но, если действительно нужно именно по порядку - то надо думать.... в любом случае Код: plaintext Нл, если действительно нужно апдейтить.. то я бы посмотрел в сторону Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2007, 23:13 |
|
||
|
Фокс и Оракл
|
|||
|---|---|---|---|
|
#18+
номера нужны по порядку новый документ создаетця не в таблице DOCUMENTS - в другом, в DOCUMENTS хранится список типов документов который пользователь может создать и последние номера документов. пример: ID,desctiption,docno 1, Счет Фактура, 45 2, Кассовый чек, 12 3, Накладная, 98 4, Акт, 3 ... Новый "Акт" созданный пользователем должен иметь номер 4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2007, 07:28 |
|
||
|
Фокс и Оракл
|
|||
|---|---|---|---|
|
#18+
неужели программеры в этом саб-форуме так далеки от Оракла? я-то думал простой вопрос... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2007, 17:52 |
|
||
|
Фокс и Оракл
|
|||
|---|---|---|---|
|
#18+
Haykoнеужели программеры в этом саб-форуме так далеки от Оракла? я-то думал простой вопрос... Дык в чем проблема создать на каждый тип документа свой Sequence (например, в триггере на добавление типа)? Всякие самопальные вещи типа +1 - не для многопользовательской работы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2007, 17:56 |
|
||
|
Фокс и Оракл
|
|||
|---|---|---|---|
|
#18+
зайди на фоксклуб в решения скац=чай там статью Журавлева она хоть и старая но полезная там много чего есть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2007, 19:51 |
|
||
|
Фокс и Оракл
|
|||
|---|---|---|---|
|
#18+
Haykoнеужели программеры в этом саб-форуме так далеки от Оракла? я-то думал простой вопрос... Никто таблицы для подобных вещей в Oracle не блокирует - это большое "НИ-НИ"... Ответ Вам дал FM32YO aka KID ... P.S. Лично предпочитаю MS SQL Server... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2007, 20:24 |
|
||
|
Фокс и Оракл
|
|||
|---|---|---|---|
|
#18+
В простом случае хватит сиквенсов. А вообще - учите pl/sql. Пишите хранимые процедуры, исполняемые на сервере. Вызывайте их из приложения в качестве API работы с таблицами. ________ Не дадим распространиться заразе политкорректности! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2007, 21:43 |
|
||
|
Фокс и Оракл
|
|||
|---|---|---|---|
|
#18+
Sequence не дадут ему номера документов по порядку (дадут ему всего-лишь уникальный номер), как бы этого не хотелось... соответственно нужно реализовать какой-нибудь свой алгоритм.. например сохранение документа поручить ХП сервера, которая бы проверяла предыдущий номер, блокировала на мгновение таблицу и вставляла новый документ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2007, 22:57 |
|
||
|
Фокс и Оракл
|
|||
|---|---|---|---|
|
#18+
Читай мат. часть: блокировки, уровни изоляции, для начала... . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2007, 01:18 |
|
||
|
Фокс и Оракл
|
|||
|---|---|---|---|
|
#18+
FM32YO aka KIDSequence не дадут ему номера документов по порядку (дадут ему всего-лишь уникальный номер), как бы этого не хотелось... соответственно нужно реализовать какой-нибудь свой алгоритм.. например сохранение документа поручить ХП сервера, которая бы проверяла предыдущий номер, блокировала на мгновение таблицу и вставляла новый документ Не понял фразу про "по порядку" А про всякие вещи типа подобных блокировок в многопользовательской среде - это ерунда. Что будет, если один взял номер первым, а зафиксировал транзакцию десятым + откаты транзакций + многое другое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2007, 10:38 |
|
||
|
Фокс и Оракл
|
|||
|---|---|---|---|
|
#18+
tru55 FM32YO aka KIDSequence не дадут ему номера документов по порядку (дадут ему всего-лишь уникальный номер), как бы этого не хотелось... соответственно нужно реализовать какой-нибудь свой алгоритм.. например сохранение документа поручить ХП сервера, которая бы проверяла предыдущий номер, блокировала на мгновение таблицу и вставляла новый документ Не понял фразу про "по порядку" по порядку - это ИМХО 1 человек в 10-00 начал набавить документ с порядковым номером 125 2 - другой человек начал на 2 минуты позже набивать следующий документ, который ДОЛЖЕН иметь стало быть номер 126, и никакой иной.... ИМХО Сиквенсы не дают номера по порядку... по крайней мере даже в однопользовательском режиме, сам пробовал - вставляешь одну строку, и через 5 минут другую (никто кроме меня не вставлял) и номера не по порядку, а каким-то слоучайным образом... автору это не подходит, по крайней мере я так понял tru55 А про всякие вещи типа подобных блокировок в многопользовательской среде - это ерунда. Что будет, если один взял номер первым, а зафиксировал транзакцию десятым + откаты транзакций + многое другое. Я и говорю, что фиксацию ИМХО нужно поручить ХП.. то есть неважно как долго человек, создавший документ пил кофе не сохраняя его, при сохранении ХП должны проверить последний номер документа, заблокировать на очень короткое время (собственно на время отработки самой ХП, которое нужно свести к минимуму) таблицу с порядковыми номерами, вставить туда следующий - разблочить и все... идея на коленке так сказать.. сам так никогда не делал и бо не было потребности в такой задаче но видел приблуду ВБА + Оракл... увы там было (Максимум + 1) дивелоперы видимо иначе не умели ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2007, 10:57 |
|
||
|
Фокс и Оракл
|
|||
|---|---|---|---|
|
#18+
1. как согласуются эти две вещи? по порядку - это ИМХО 1 человек в 10-00 начал набавить документ с порядковым номером 125 2 - другой человек начал на 2 минуты позже набивать следующий документ, который ДОЛЖЕН иметь стало быть номер 126, и никакой иной.... и Я и говорю, что фиксацию ИМХО нужно поручить ХП.. то есть неважно как долго человек, создавший документ пил кофе не сохраняя его, при сохранении ХП должны проверить последний номер документа, заблокировать на очень короткое время (собственно на время отработки самой ХП, которое нужно свести к минимуму) таблицу с порядковыми номерами, вставить туда следующий - разблочить и все На мой взгляд, если важен порядок фиксации документов, для этого надо использовать не номер, а date / timestamp 2. ИМХО Сиквенсы не дают номера по порядку... по крайней мере даже в однопользовательском режиме, сам пробовал - вставляешь одну строку, и через 5 минут другую (никто кроме меня не вставлял) и номера не по порядку, а каким-то слоучайным образом... Честно говоря, сомнительное утверждение. Для подробного обсуждения нужен основательный test case. Реально это м.б. в некоторых случаях, если, например, sequence создана с опцией CACHE, в противном случае работа с последовательностями реализована точно так, как предлагается сделать руками - тогда какой смысл? 3. если речь идет о НЕПРЕРЫВНОЙ последовательности, то это реализовать очень сложно, т.к. возможны откаты транзакций, удаление документов, ввод документов задним числом и т.д. (сам когда-то с этим сталкивался при создании/сопровождении проги по ведению счетов-фактур) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2007, 11:12 |
|
||
|
Фокс и Оракл
|
|||
|---|---|---|---|
|
#18+
tru551. как согласуются эти две вещи? по порядку - это ИМХО 1 человек в 10-00 начал набавить документ с порядковым номером 125 2 - другой человек начал на 2 минуты позже набивать следующий документ, который ДОЛЖЕН иметь стало быть номер 126, и никакой иной.... и Я и говорю, что фиксацию ИМХО нужно поручить ХП.. то есть неважно как долго человек, создавший документ пил кофе не сохраняя его, при сохранении ХП должны проверить последний номер документа, заблокировать на очень короткое время (собственно на время отработки самой ХП, которое нужно свести к минимуму) таблицу с порядковыми номерами, вставить туда следующий - разблочить и все перечитал ника не согласуется.. пятница блин tru55 2. ИМХО Сиквенсы не дают номера по порядку... по крайней мере даже в однопользовательском режиме, сам пробовал - вставляешь одну строку, и через 5 минут другую (никто кроме меня не вставлял) и номера не по порядку, а каким-то случайным образом... Честно говоря, сомнительное утверждение. Для подробного обсуждения нужен основательный test case. Реально это м.б. в некоторых случаях, если, например, sequence создана с опцией CACHE вот не помню... но заметил, что в одной своей наработке просто добавлял в качествен теста записи с таблицу, и... первичный ключ, который как раз через сиквенс формировался увы не давал мне 1-2-3-4-5... а пол каким-то причинам появлялись дырки в нумерации. Точно не вспомню, но, вроде дырки появлялись, когда в первый день добавил 10 записей, и на следующий день добавлял еще. На 100% утверждать, что делалось не стану, но дырки в нумерации были. Однако для первичного ключа это совершенно никакого значения не имеет, поэтому дальне не вникал. Хотя, казалось бы, что сиквенс должен генерить строгую последовательность... Однако, а где же автор? (а то мы тут рассуждаем....) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2007, 14:17 |
|
||
|
Фокс и Оракл
|
|||
|---|---|---|---|
|
#18+
На 100% утверждать, что делалось не стану, но дырки в нумерации были. Однако для первичного ключа это совершенно никакого значения не имеет, поэтому дальне не вникал. Хотя, казалось бы, что сиквенс должен генерить строгую последовательность Э-э-э, нарушения порядка и пропуски - две большие разницы :) Пропуски могут быть, например, кто-то сделал NEXTVAL, а потом ROLLBACK. Поскольку значения sequence в словаре изменяются в автономной транзакции, то на енто действие откат НЕ распространяется. Или другой вариант. Создается последовательность со значением CACHE 20 (если в команде CREATE этот параметр не указываешь, то это значение по умолчанию). Это означает, что когда ты делаешь первый раз NEXTVAL, то 20 значений забираются в память (т.е. значение sequence в словаре увеличивается сразу на 20). Если еще раз делаешь NEXTVAL, то сначала ищется значения в памяти (в shared pool), если есть там, то берется оттуда. Т.е., если последовательность используется часто, то это ускоряет работу с ней. Однако, если обращение к ней происходит редко, то по алгоритму LRU она м.б. выгружена из памяти (для освобождения места другим объектам), тогда забранные в память значения потеряются. Аналогично будет потеря при перезагрузке сервера. Поэтому, если последовательность используется нечасто (например, первичный ключ какого-нибудь справочника), то лучше ее создавать с опцией NOCACHE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2007, 15:34 |
|
||
|
Фокс и Оракл
|
|||
|---|---|---|---|
|
#18+
tru55 Э-э-э, нарушения порядка и пропуски - две большие разницы :) Пропуски могут быть, например, кто-то сделал NEXTVAL, а потом ROLLBACK. Поскольку значения sequence в словаре изменяются в автономной транзакции, то на енто действие откат НЕ распространяется. нет этого не было,и бо = сам писал = сам тестил, то есть никто больше не делал операций с данными tru55 ..... CACHE 20 .... NOCACHE а вот это уже более вероятно, увы - было то давно, и я совершенно не помню КЭШ или НОКЭШ там было..... выйду из отпуска гляну ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2007, 18:03 |
|
||
|
Фокс и Оракл
|
|||
|---|---|---|---|
|
#18+
tru55 Создается последовательность со значением CACHE 20 (если в команде CREATE этот параметр не указываешь, то это значение по умолчанию). ........... Поэтому, если последовательность используется нечасто (например, первичный ключ какого-нибудь справочника), то лучше ее создавать с опцией NOCACHE скорев всего так и было И конечно же я сиквенсы использую исключительно для Примари кеевских полей. Вот о том, что ты сказал - не знал := стыдно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2007, 18:07 |
|
||
|
Фокс и Оракл
|
|||
|---|---|---|---|
|
#18+
HaykoДобый день Как можно из фокса блокироварь табличку/запись в Оракле? У меня клиенты одновременно создают разные документы которые нужно нумеровать. В фоксе просто блокировал строчку в таблице DOCUMENTS на секунду ... А если это не возможно или не правильно – как из ХП Оракла получить нужное значение поля... заранее спасибо за ответы П.с. просьба методы типа REQUERY() не предлогать - у меня очень часто случаются ошибки - очень часто одновременно создаются документы с одинаковым номером ...Читайте Тома Кайта "Оракле для професионалов" про транзакциии(том 1) и автономные транзакции (том 2), там все подробно изложенно и на русском (: В руском хелпе по FoxPro (на foxclub) можно почитать про КурсорАдаптеры, безних никуда при разработки приложений типа клиент-сервер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 14:09 |
|
||
|
Фокс и Оракл
|
|||
|---|---|---|---|
|
#18+
большое спасибо за ответы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2007, 19:43 |
|
||
|
Фокс и Оракл
|
|||
|---|---|---|---|
|
#18+
Haykoтак как типы документов не фиксированы - они создаются пользователем, для меня очень трудно будет написать код для создания сиквенса для каждого документа из фокса ... а таблица documents иммеет структуру: id n(10), docprefix c(10), docno n(10), docpost c(10) , descritpion c(30),type n(1) ... и работает просто update documents set docno=docno+1 where id=_id_from_list так как пользователи активно создают документы, иногда 2 пользователя могут получить один и тот же номер документа. а если будет блокировка или же update будет в ХП с возвратом значения в Фокс, проблеммы не будет надо было сделать ключ на уникальность на стороне базы alter table documents add constraint C_documents _docno_UK unique (docprefix, docno) потом если сделать нумерацию на автомате(без возможности ручного редактирования на клиенте) то триггер на вставку create or replace trigger T_documents _BINSERT before insert on documents for each row begin select max(d.docno)+1 into :new.docno from documents d where d.docprefix = :new.docprefix ; end; и блокировать ничего не надо...не для такого оракл придумывали чтоб делать блокировки целой таблицы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2007, 15:13 |
|
||
|
Фокс и Оракл
|
|||
|---|---|---|---|
|
#18+
Сиквенс выдает значения ПО ПОРЯДКУ !!! Я в таких ситуациях поступал следующим образом: 1: Заполнял переменные на клиенте 2: Отсылал инсерт на сервер с ключевым словом "Returning Pk_Doc into :locPk_Dok" 3: На сервере вешал тригер на инсерт, который заполнял PK_Doc из последовательности т.е. Следуюшее значение последовательности запрашивалось только на кнопке "Сохратить" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2007, 10:27 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=34774772&tid=1588807]: |
0ms |
get settings: |
11ms |
get forum list: |
21ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
75ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 229ms |
| total: | 407ms |

| 0 / 0 |
