:: Visual Foxpro, Foxpro for DOS
Re: Транзакции
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
Божья_коровка
И что значит при полном их отключении? В двух словах объясни, что ты имеешь в виду...

Надо полагать, of63 предлагает перейти с Oracle на древний MySQL.
Ratings: 0 negative/0 positive
Re: Транзакции
Владимир Максимов

Сообщений: 14097
Откуда: Москва
Дата регистрации: 02.09.2000
Еще один "детский" вопрос: А по каким полям ты проверяешь, что данные до/после изменения?

У тебя в псевдокоде

IF curTest.pole1 = 'обновленное значение'

А остальные поля? Т.е., может с одним единственным полем все хорошо, но остальные вообще не изменялись?

Ну, и проверять все-таки надо из одного места. Если вставка через VFP, то и проверку надо делать в VFP

* Настраиваем ручной режим завершения транзакции (иначе смысла в SqlCommit нет)
= SQLSETPROP(m.ch, 'Transactions', 2)
* Со стороны VFP8 запускаем процедуру Oracle
=SQLExec(m.ch, 'Call MyProc')
* Явно завершаем транзакцию
isOk = SqlCommit(m.ch)
* Если делаем явную выборку, то получаем актуальные данные
* ID в where один и тот же послается
=SQLExec(m.ch, 'select * from MyTab where id = тут айдишник записи', 'curTest')
select curTest
IF curTest.pole1 = 'обновленное значение'
* если данные обновились то сделать транзакцию
=SQLExec(m.ch, 'insert into tabl2 (перечисление полей) select (перечисление полей) from MyTab where id = тут айдишник записи')
isOk = SqlCommit(m.ch)
* А теперь смотрим, что же оказалось записано в tab2
=SQLExec(m.ch, 'select * from tabl2 where id = тут айдишник записи', 'curTest2')
* Данные в новой таблице
select curTest2
BROWSE NOWAIT
* Сравнивая с тем, что, предположительно, вставляли
select curTest
BROWSE NOWAIT
ELSE
messagebox ('Всё плохо, ничего не обновилось, транзакцию не посылаю')
ENDIF

Кстати, а вставка записей в новую таблицу вообще была? Если триггер сам меняет id, то, может, просто вообще ничего не было вставлено в tab2 и ты тупо смотришь на старые данные. Хотя бы количество записей сравнить можно до и после вставки?

Есть еще предположение по автоконвертации типов данных, если структура полей новой и старой таблиц отличаются. Ну, например, длинная строка автоматически обрезается. Не знаю, какое правило действует в Oracle в случае, если типы данных не могут быть автоматически приведены к нужному типу. Что чисто внешне, может быть принято за запись "старых" данных. Но это на знать структуру таблиц и какие именно значения "старые" и какие "новые" и по каким правилам в Oracle выполняется приведение типов
Ratings: 0 negative/0 positive
Re: Транзакции
of63

Сообщений: 25244
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
leonid
Божья_коровка
И что значит при полном их отключении? В двух словах объясни, что ты имеешь в виду...

Надо полагать, of63 предлагает перейти с Oracle на древний MySQL.

() Предложил убрать в коде все упоминания о транзакциях, оставить только сами селекты и инсерты, Оракел сам, "автоматически", что-то там автопотранзактирует. Этим мы проверим код коровкиных собственно селектов и инсертов!



Исправлено 1 раз(а). Последнее : of63, 10.01.21 19:56
Ratings: 0 negative/0 positive
Re: Транзакции
Божья_коровка

Сообщений: 25731
Дата регистрации: 23.08.2001
Владимир Максимов
Еще один "детский" вопрос: А по каким полям ты проверяешь, что данные до/после изменения?
У тебя в псевдокоде

IF curTest.pole1 = 'обновленное значение'

А остальные поля? Т.е., может с одним единственным полем все хорошо, но остальные вообще не изменялись?

Ну я делаю через интерфейс изменение нескольких полей, загоняю данные, например 'test1', 'test2' в несколько полей, плюс проверяю айдишник изменений. Т.е. при апдейте MyTable, формируется каждый раз новый айдишник.

Владимир Максимов
Ну, и проверять все-таки надо из одного места. Если вставка через VFP, то и проверку надо делать в VFP
Да итак тоже проверяла.

Владимир Максимов
Кстати, а вставка записей в новую таблицу вообще была? Если триггер сам меняет id, то, может, просто вообще ничего не было вставлено в tab2 и ты тупо смотришь на старые данные. Хотя бы количество записей сравнить можно до и после вставки?
Запись всегда одна. Одна запись в таблице MyTable меняется и она же одна и добавляется в Table2. Триггер меняет только "айдишник изменения записи", у записи несколько айдишников.В таблицу table2 запись вставляется, но с предыдущими данными, т.е. не с 'test1', 'test2'. Т.е. система такая, изменила проца данные в записи с айди=1, значения полей, и эта же запись обновленная с айди=1 вставляется в table2. Т.е. одно изменение (один апдейт) одной записи в MyTable = одна вставка одной записи в table2.

Владимир Максимов
Есть еще предположение по автоконвертации типов данных, если структура полей новой и старой таблиц отличаются.
Они отличаются, только одним полем. В table2 есть поле, которого нет в MyTable. Но в транзакции я специально делаю перечисление полей, которые нужно вставить и типы данных и наименование перечисленных полей идентичны в обоих таблицах.


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...




Исправлено 2 раз(а). Последнее : Божья_коровка, 10.01.21 20:16
Ratings: 0 negative/0 positive
Re: Транзакции
Божья_коровка

Сообщений: 25731
Дата регистрации: 23.08.2001
Igor Korolyov
Без вот этого
Божья_коровка
MyProc
вот этого
Божья_коровка
Висит один триггер, который при апдейте записи формирует айдишник изменения.
и вот этого
Божья_коровка
where id = тут айдишник записи
А так же понимания того что такое
Божья_коровка
данные предыдущие, а не только что обновленные
Нереально что либо понять.

Ну можно лишь посоветовать сделать тест - БЕЗ всего этого, без триггера, без условия в insert ... select, без ХП - чисто какой update или insert напрямую послать - и если и тогда будут "чудеса" - ну это значит системная проблема (остаётся лишь серверную трассировку включать и смотреть что происходит). Пока же есть шанс что дело таки в коде.
Если делать без всего без этого будет чистый лист. Если не рождаться, то и не умирать, т.е. если не жить, то и проблем и странностей не будет. Если послать простой инсерт напрямую, на основе переменных, то всё прекрасно, такой странности не наблюдается. Я же писала выше, что прописала как раз такой вариант, когда тяну на клиента простым селектом эту запись из MyTable, обрабатываю типы, загоняю в переменные и делаю прямой инсерт с values(перечисление переменных) и всё отлично работает. Т.е. подобная странность происходит только с инсертом на основе селекта, а не простым инсертом.


Вот, я писала выше -

Цитата:
В итоге пришлось отказаться от транзакции -
=SQLExec(m.ch, 'insert into tabl2 (перечисление полей) select (перечисление полей) from MyTab where id = тут айдишник записи')
и делать селект
=SQLExec(m.ch, 'select (перечисление полей) from MyTab where id = тут айдишник записи', 'curTest')
обрабатывать типы данных, загонять их в переменные и делать инсерт на основе этих переменных

=SQLExec(m.ch, 'insert into tabl2 (перечисление полей) values (перечисление переменных)')


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...




Исправлено 4 раз(а). Последнее : Божья_коровка, 10.01.21 20:19
Ratings: 0 negative/0 positive
Re: Транзакции
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
Я и предлагаю сделать тест вида

update tbl1 ... / insert into tbl1 ... не суть важно, абы данные "до и после" чётко различались.

commit

insert into tbl2 ... select ... from tbl1 без дополнительных условий - ВСЕ записи перегнать.

commit

смотреть tbl2 - и из фокса и из сторонней утилиты.

если это сработает как положено - вот тогда изучать код ХП, триггера, собственно фоксовый код вокруг этого самого "id записи". Заодно строку подключения проверить - если драйвер оракловский, там целая куча самых разных параметров имеется. А если MS - то искать по форумам на предмет проблем с оным - с разными типами данных в частности (может он твой id передаваемый из фокса в условии округляет/обрезает/перекодирует - ты даже не упомянула какого типа это поле).


------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 23 kornienko_ru  (Гостей: 22)

© 2000-2024 Fox Club 
Яндекс.Метрика