Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Фокс и Оракл  [new]
Hayko
Member

Откуда: Ереван
Сообщений: 13
Добый день

Как можно из фокса блокироварь табличку/запись в Оракле?

У меня клиенты одновременно создают разные документы которые нужно нумеровать. В фоксе просто блокировал строчку в таблице DOCUMENTS на секунду ...

А если это не возможно или не правильно – как из ХП Оракла получить нужное значение поля...

заранее спасибо за ответы


П.с.
просьба методы типа REQUERY() не предлогать - у меня очень часто случаются ошибки - очень часто одновременно создаются документы с одинаковым номером ...
21 авг 07, 19:08    [4556464]     Ответить | Цитировать Сообщить модератору
 Re: Фокс и Оракл  [new]
mvictor
Member

Откуда: Украина, Киев
Сообщений: 184
если проблема только в нумерации (последовательной), то у Oracle есть SEQUENCE
21 авг 07, 19:45    [4556582]     Ответить | Цитировать Сообщить модератору
 Re: Фокс и Оракл  [new]
Hayko
Member

Откуда: Ереван
Сообщений: 13
так как типы документов не фиксированы - они создаются пользователем, для меня очень трудно будет написать код для создания сиквенса для каждого документа из фокса ...

а таблица 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 авг 07, 21:48    [4556861]     Ответить | Цитировать Сообщить модератору
 Re: Фокс и Оракл  [new]
FM32YO aka KID
Member

Откуда: Ukraine
Сообщений: 884
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-й случай - то СИКВЕНСЫ и никакого кода по созданию их писать не надо....
Но, если действительно нужно именно по порядку - то надо думать....
в любом случае
update documents set docno=docno+1 where id=_id_from_list
звучит странно.. Вы создаете документы или редактируете их? Ваш пример указывает не на создание ИМХО :-)
Нл, если действительно нужно апдейтить.. то я бы посмотрел в сторону
SELECT.. for UPDATE
точно не укажу.. так как я дома... ночь и страшно и Оракла под рукой нету
21 авг 07, 23:13    [4556967]     Ответить | Цитировать Сообщить модератору
 Re: Фокс и Оракл  [new]
Hayko
Member

Откуда: Ереван
Сообщений: 13
номера нужны по порядку

новый документ создаетця не в таблице DOCUMENTS - в другом, в DOCUMENTS хранится список типов документов который пользователь может создать и последние номера документов.

пример:
ID,desctiption,docno
1, Счет Фактура, 45
2, Кассовый чек, 12
3, Накладная, 98
4, Акт, 3
...

Новый "Акт" созданный пользователем должен иметь номер 4
22 авг 07, 07:28    [4557431]     Ответить | Цитировать Сообщить модератору
 Re: Фокс и Оракл  [new]
Hayko
Member

Откуда: Ереван
Сообщений: 13
неужели программеры в этом саб-форуме так далеки от Оракла?

я-то думал простой вопрос...
23 авг 07, 17:52    [4568302]     Ответить | Цитировать Сообщить модератору
 Re: Фокс и Оракл  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
Hayko
неужели программеры в этом саб-форуме так далеки от Оракла?

я-то думал простой вопрос...


Дык в чем проблема создать на каждый тип документа свой Sequence (например, в триггере на добавление типа)? Всякие самопальные вещи типа +1 - не для многопользовательской работы...
23 авг 07, 17:56    [4568332]     Ответить | Цитировать Сообщить модератору
 Re: Фокс и Оракл  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1273
зайди на фоксклуб в решения
скац=чай там статью Журавлева
она хоть и старая но полезная
там много чего есть
23 авг 07, 19:51    [4568846]     Ответить | Цитировать Сообщить модератору
 Re: Фокс и Оракл  [new]
Sergey Ch
Member

Откуда: Благовещенск
Сообщений: 8873
Hayko
неужели программеры в этом саб-форуме так далеки от Оракла?

я-то думал простой вопрос...

Никто таблицы для подобных вещей в Oracle не блокирует - это большое "НИ-НИ"...

Ответ Вам дал FM32YO aka KID ...

P.S. Лично предпочитаю MS SQL Server...
23 авг 07, 20:24    [4568920]     Ответить | Цитировать Сообщить модератору
 Re: Фокс и Оракл  [new]
Urri
Member

Откуда: Москва
Сообщений: 2693
В простом случае хватит сиквенсов. А вообще - учите pl/sql. Пишите хранимые процедуры, исполняемые на сервере. Вызывайте их из приложения в качестве API работы с таблицами.
________
Не дадим распространиться заразе политкорректности!
23 авг 07, 21:43    [4569110]     Ответить | Цитировать Сообщить модератору
 Re: Фокс и Оракл  [new]
FM32YO aka KID
Member

Откуда: Ukraine
Сообщений: 884
Sequence не дадут ему номера документов по порядку (дадут ему всего-лишь уникальный номер), как бы этого не хотелось...
соответственно нужно реализовать какой-нибудь свой алгоритм..
например сохранение документа поручить ХП сервера, которая бы проверяла предыдущий номер, блокировала на мгновение таблицу и вставляла новый документ
23 авг 07, 22:57    [4569326]     Ответить | Цитировать Сообщить модератору
 Re: Фокс и Оракл  [new]
к
Guest
Читай мат. часть: блокировки, уровни изоляции, для начала... .
24 авг 07, 01:18    [4569559]     Ответить | Цитировать Сообщить модератору
 Re: Фокс и Оракл  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
FM32YO aka KID
Sequence не дадут ему номера документов по порядку (дадут ему всего-лишь уникальный номер), как бы этого не хотелось...
соответственно нужно реализовать какой-нибудь свой алгоритм..
например сохранение документа поручить ХП сервера, которая бы проверяла предыдущий номер, блокировала на мгновение таблицу и вставляла новый документ


Не понял фразу про "по порядку"
А про всякие вещи типа подобных блокировок в многопользовательской среде - это ерунда. Что будет, если один взял номер первым, а зафиксировал транзакцию десятым + откаты транзакций + многое другое.
24 авг 07, 10:38    [4570469]     Ответить | Цитировать Сообщить модератору
 Re: Фокс и Оракл  [new]
FM32YO aka KID
Member

Откуда: Ukraine
Сообщений: 884
tru55
FM32YO aka KID
Sequence не дадут ему номера документов по порядку (дадут ему всего-лишь уникальный номер), как бы этого не хотелось...
соответственно нужно реализовать какой-нибудь свой алгоритм..
например сохранение документа поручить ХП сервера, которая бы проверяла предыдущий номер, блокировала на мгновение таблицу и вставляла новый документ


Не понял фразу про "по порядку"


по порядку - это ИМХО
1 человек в 10-00 начал набавить документ с порядковым номером 125

2 - другой человек начал на 2 минуты позже набивать следующий документ, который ДОЛЖЕН иметь стало быть номер 126, и никакой иной....

ИМХО Сиквенсы не дают номера по порядку... по крайней мере даже в однопользовательском режиме, сам пробовал - вставляешь одну строку, и через 5 минут другую (никто кроме меня не вставлял) и номера не по порядку, а каким-то слоучайным образом...
автору это не подходит, по крайней мере я так понял

tru55

А про всякие вещи типа подобных блокировок в многопользовательской среде - это ерунда. Что будет, если один взял номер первым, а зафиксировал транзакцию десятым + откаты транзакций + многое другое.


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

идея на коленке так сказать.. сам так никогда не делал и бо не было потребности в такой задаче
но видел приблуду ВБА + Оракл... увы там было (Максимум + 1)
дивелоперы видимо иначе не умели
24 авг 07, 10:57    [4570601]     Ответить | Цитировать Сообщить модератору
 Re: Фокс и Оракл  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
1. как согласуются эти две вещи?

по порядку - это ИМХО
1 человек в 10-00 начал набавить документ с порядковым номером 125

2 - другой человек начал на 2 минуты позже набивать следующий документ, который ДОЛЖЕН иметь стало быть номер 126, и никакой иной....


и


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


На мой взгляд, если важен порядок фиксации документов, для этого надо использовать не номер, а date / timestamp

2. ИМХО Сиквенсы не дают номера по порядку... по крайней мере даже в однопользовательском режиме, сам пробовал - вставляешь одну строку, и через 5 минут другую (никто кроме меня не вставлял) и номера не по порядку, а каким-то слоучайным образом...

Честно говоря, сомнительное утверждение. Для подробного обсуждения нужен основательный test case. Реально это м.б. в некоторых случаях, если, например, sequence создана с опцией CACHE, в противном случае работа с последовательностями реализована точно так, как предлагается сделать руками - тогда какой смысл?

3. если речь идет о НЕПРЕРЫВНОЙ последовательности, то это реализовать очень сложно, т.к. возможны откаты транзакций, удаление документов, ввод документов задним числом и т.д. (сам когда-то с этим сталкивался при создании/сопровождении проги по ведению счетов-фактур)
24 авг 07, 11:12    [4570722]     Ответить | Цитировать Сообщить модератору
 Re: Фокс и Оракл  [new]
fm32yo......
Guest
tru55
1. как согласуются эти две вещи?

по порядку - это ИМХО
1 человек в 10-00 начал набавить документ с порядковым номером 125

2 - другой человек начал на 2 минуты позже набивать следующий документ, который ДОЛЖЕН иметь стало быть номер 126, и никакой иной....


и


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



перечитал ника не согласуется.. пятница блин


tru55

2. ИМХО Сиквенсы не дают номера по порядку... по крайней мере даже в однопользовательском режиме, сам пробовал - вставляешь одну строку, и через 5 минут другую (никто кроме меня не вставлял) и номера не по порядку, а каким-то случайным образом...

Честно говоря, сомнительное утверждение. Для подробного обсуждения нужен основательный test case. Реально это м.б. в некоторых случаях, если, например, sequence создана с опцией CACHE


вот не помню... но заметил, что в одной своей наработке просто добавлял в качествен теста записи с таблицу, и... первичный ключ, который как раз через сиквенс формировался увы не давал мне 1-2-3-4-5...
а пол каким-то причинам появлялись дырки в нумерации.
Точно не вспомню, но, вроде дырки появлялись, когда в первый день добавил 10 записей, и на следующий день добавлял еще.
На 100% утверждать, что делалось не стану, но дырки в нумерации были.
Однако для первичного ключа это совершенно никакого значения не имеет, поэтому дальне не вникал. Хотя, казалось бы, что сиквенс должен генерить строгую последовательность...

Однако, а где же автор? (а то мы тут рассуждаем....)
24 авг 07, 14:17    [4572415]     Ответить | Цитировать Сообщить модератору
 Re: Фокс и Оракл  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
На 100% утверждать, что делалось не стану, но дырки в нумерации были.
Однако для первичного ключа это совершенно никакого значения не имеет, поэтому дальне не вникал. Хотя, казалось бы, что сиквенс должен генерить строгую последовательность


Э-э-э, нарушения порядка и пропуски - две большие разницы :)

Пропуски могут быть, например, кто-то сделал NEXTVAL, а потом ROLLBACK. Поскольку значения sequence в словаре изменяются в автономной транзакции, то на енто действие откат НЕ распространяется.

Или другой вариант. Создается последовательность со значением CACHE 20 (если в команде CREATE этот параметр не указываешь, то это значение по умолчанию). Это означает, что когда ты делаешь первый раз NEXTVAL, то 20 значений забираются в память (т.е. значение sequence в словаре увеличивается сразу на 20). Если еще раз делаешь NEXTVAL, то сначала ищется значения в памяти (в shared pool), если есть там, то берется оттуда. Т.е., если последовательность используется часто, то это ускоряет работу с ней. Однако, если обращение к ней происходит редко, то по алгоритму LRU она м.б. выгружена из памяти (для освобождения места другим объектам), тогда забранные в память значения потеряются. Аналогично будет потеря при перезагрузке сервера. Поэтому, если последовательность используется нечасто (например, первичный ключ какого-нибудь справочника), то лучше ее создавать с опцией NOCACHE
24 авг 07, 15:34    [4573116]     Ответить | Цитировать Сообщить модератору
 Re: Фокс и Оракл  [new]
FM32YO aka KID
Member

Откуда: Ukraine
Сообщений: 884
tru55

Э-э-э, нарушения порядка и пропуски - две большие разницы :)

Пропуски могут быть, например, кто-то сделал NEXTVAL, а потом ROLLBACK. Поскольку значения sequence в словаре изменяются в автономной транзакции, то на енто действие откат НЕ распространяется.


нет этого не было,и бо = сам писал = сам тестил, то есть никто больше не делал операций с данными


tru55

..... CACHE 20

.... NOCACHE


а вот это уже более вероятно, увы - было то давно, и я совершенно не помню КЭШ или НОКЭШ там было.....
выйду из отпуска гляну
24 авг 07, 18:03    [4574112]     Ответить | Цитировать Сообщить модератору
 Re: Фокс и Оракл  [new]
FM32YO aka KID
Member

Откуда: Ukraine
Сообщений: 884
tru55

Создается последовательность со значением CACHE 20 (если в команде CREATE этот параметр не указываешь, то это значение по умолчанию).
...........
Поэтому, если последовательность используется нечасто (например, первичный ключ какого-нибудь справочника), то лучше ее создавать с опцией NOCACHE


скорев всего так и было
И конечно же я сиквенсы использую исключительно для Примари кеевских полей.

Вот о том, что ты сказал - не знал := стыдно
24 авг 07, 18:07    [4574122]     Ответить | Цитировать Сообщить модератору
 Re: Фокс и Оракл  [new]
4kin
Member

Откуда: Северодвинск
Сообщений: 13
Hayko
Добый день

Как можно из фокса блокироварь табличку/запись в Оракле?

У меня клиенты одновременно создают разные документы которые нужно нумеровать. В фоксе просто блокировал строчку в таблице DOCUMENTS на секунду ...

А если это не возможно или не правильно – как из ХП Оракла получить нужное значение поля...

заранее спасибо за ответы


П.с.
просьба методы типа REQUERY() не предлогать - у меня очень часто случаются ошибки - очень часто одновременно создаются документы с одинаковым номером ...
Читайте Тома Кайта "Оракле для професионалов" про транзакциии(том 1) и автономные транзакции (том 2), там все подробно изложенно и на русском (:

В руском хелпе по FoxPro (на foxclub) можно почитать про КурсорАдаптеры, безних никуда при разработки приложений типа клиент-сервер.
30 авг 07, 14:09    [4597881]     Ответить | Цитировать Сообщить модератору
 Re: Фокс и Оракл  [new]
Hayko
Member

Откуда: Ереван
Сообщений: 13
большое спасибо за ответы
2 сен 07, 19:43    [4610417]     Ответить | Цитировать Сообщить модератору
 Re: Фокс и Оракл  [new]
exBB
Member

Откуда:
Сообщений: 17238
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;
и блокировать ничего не надо...не для такого оракл придумывали чтоб делать блокировки целой таблицы
4 сен 07, 15:13    [4618424]     Ответить | Цитировать Сообщить модератору
 Re: Фокс и Оракл  [new]
Maltsev Max
Member

Откуда: Россия, Пермь
Сообщений: 352
Сиквенс выдает значения ПО ПОРЯДКУ !!!

Я в таких ситуациях поступал следующим образом:

1: Заполнял переменные на клиенте
2: Отсылал инсерт на сервер с ключевым словом "Returning Pk_Doc into :locPk_Dok"
3: На сервере вешал тригер на инсерт, который заполнял PK_Doc из последовательности


т.е. Следуюшее значение последовательности запрашивалось только на кнопке "Сохратить"
6 сен 07, 10:27    [4627575]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить