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

Откуда:
Сообщений: 276
Добрый день!

Есть сервер Oracle 8.1.7, в нем настроен HS на сервер Sybase (версию не знаю, на нем стоит DiaSoft 5NT). Требуется через этот HS получать данные с Sybase и сохранять их в таблицах. ДиаСофт устроен так, что некоторые данные, например остатки по счетам, можно получить из временных таюблиц, предварительно запустив нужную процедуру. Ну а раз процедуры, то используем пакет DBMS_HS_PASSTHROUGH. Есть простая процедура на Oracle, которая по дате и списку ID счетов должна выдавать нужные команды Sybase'у и потом забирать полученный результат, вставляя строки в таблицу Oracle. Так вот она кое-как, но работает, иногда правильно, и опытным путем было обнаружено, при каких именно условиях:

1) Таблицу, куда вставляются остатки, необходимо почему-то очищать ДО того, как открывается курсор DBMS_HS_PASSTHROUGH, причем, если ранее уже был использован курсор и закрыт - то только после commit. Иначе будет ORA-02047 cannot join the distributed transaction in progress. Описание ошибки какое-то мутное, при чем тут Оракл 6 и 7?
ORA-02047 cannot join the distributed transaction in progress

Cause: This can happen only when attempting to update an Oracle Version 6 and an Oracle7 database in the same transaction, because either

A transaction is in progress against a remote database that does not support two-phase commit.

Updates are pending and an attempt was made to update a different database that does not support two-phase commit.

Action: Complete the current transaction before attempting the action that caused the error.


Конечно так тоже можно было бы, но! из-за этого я не могу удалять записи из таблицы Oracle когда иду по циклу с функцией FETCH_ROW, потому что commit убивает курсор DBMS_HS_PASSTHROUGH.

2) Самое главное!!! - всё это работает только при пошаговой трассировке в PL\SQL Developer'е. Если просто запустить процедуру, то после вызова процедуры Sybase (которая считает остатки) в нужной мне его временной таблице ноль "моих" записей, соответственно результат - 0 строк.

В общем так никуда не годится, я наверное не правильно понимаю как должен работать DBMS_HS_PASSTHROUGH. Надеюсь что понятно изложил.

PS Документацию DBMS_HS_PASSTHROUGH читал (вдоль и поперек), там только "как должно работать", ни одной конкретной реализации..
2 май 06, 12:38    [2620472]     Ответить | Цитировать Сообщить модератору
 Re: Объясните пожалуйста по DBMS_HS_PASSTHROUGH  [new]
raw
Member

Откуда:
Сообщений: 133
Покажите файл параметров связи с Sybase *.ora.
2 май 06, 16:57    [2621937]     Ответить | Цитировать Сообщить модератору
 Re: Объясните пожалуйста по DBMS_HS_PASSTHROUGH  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9219
Could be Bug 1847587

SY.
2 май 06, 17:21    [2622060]     Ответить | Цитировать Сообщить модератору
 Re: Объясните пожалуйста по DBMS_HS_PASSTHROUGH  [new]
JKL
Member

Откуда:
Сообщений: 276
initDIADBC.ora:

# This is a sample agent init file that contains the HS parameters that are
# needed for an ODBC Agent. 

#
# HS init parameters
#
HS_FDS_CONNECT_INFO = "DIADBC"
HS_FDS_TRACE_LEVEL = ON
HS_LANGUAGE = RUSSIAN_CIS.CL8MSWIN1251

SET HS_NLS_TERRITORY = CIS
SET HS_NLS_CURRENCY = "р."
SET HS_NLS_NUMERIC_CHARACTERS=".,"

#
# Environment variables required for the non-Oracle system
#
#set <envvar>=<value>



металинк требует "support identifier", а у меня его нет


есть еще подозрение, что для каждого вызова OPEN_CURSOR в Sybase'е создается новый SPID, со всеми вытекающими последствиями... сейчас буду проверять
3 май 06, 09:57    [2623614]     Ответить | Цитировать Сообщить модератору
 Re: Объясните пожалуйста по DBMS_HS_PASSTHROUGH  [new]
raw
Member

Откуда:
Сообщений: 133
Для возможности участия Sybase в распределенных транзакциях надо сделать в базе Sybase схему RECOVER и в этой схеме таблицу HS_TRANSACTION_LOG, скрипт находится там же, где initDIADBC.ora. Вы работаете, как я понимаю, в транзакционной модели COMMIT_CONFIRM, которая устанавливается по умолчанию и рекомендуется Oracle, можно еще попробовать TWO_PHASE_COMMIT (нам понадобилось для одной задачи). Трэйс более подробный в режиме HS_FDS_TRACE_LEVEL=DEBUG
HS_FDS_DEFAULT_OWNER=YZ
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER
HS_FDS_PROC_IS_FUNC=TRUE
HS_FDS_TRANSACTION_MODEL=COMMIT_CONFIRM
HS_COMMIT_POINT_STRENGTH=0
# HS_FDS_TRANSACTION_MODEL=TWO_PHASE_COMMIT
3 май 06, 12:51    [2624457]     Ответить | Цитировать Сообщить модератору
 Re: Объясните пожалуйста по DBMS_HS_PASSTHROUGH  [new]
JKL
Member

Откуда:
Сообщений: 276
Решил обойтись без распределенных транзакций, все ж проще чем просить IT-отдел что-то там в базе ДиаСофта создавать.

С пошаговой трассировкой не понял, нашел в одном месте незакрытый курсор - все стало ок.

Кстати вот еще вопрос, реально ли через DBMS_HS_PASSTHROUGH выполнить такое:

declare @Course float 

exec CourseGet @Course out, 2, 1, '20000209', 10095007234 

select @Course as 'Курс USD/RUR в СЭЛТ (утр.)'

по идее нет? а вдруг?
4 май 06, 15:08    [2630073]     Ответить | Цитировать Сообщить модератору
 Re: Объясните пожалуйста по DBMS_HS_PASSTHROUGH  [new]
JKL
Member

Откуда:
Сообщений: 276
наверное это должно выглядеть так:
c := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@GBN;
    DBMS_HS_PASSTHROUGH.PARSE@GBN(c, 'exec CourseGet ?, 2, 1, ?, 10095007234 ');
  
    DBMS_HS_PASSTHROUGH.BIND_OUT_VARIABLE@GBN(c, 1, course, '@Course');
    DBMS_HS_PASSTHROUGH.BIND_VARIABLE@GBN(c, 2, p_rate_date, '@Date');
    dummy := DBMS_HS_PASSTHROUGH.EXECUTE_NON_QUERY@GBN(c);
    DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@GBN(c);

?

однако не работает, говорит Value has not been specified for parameter 2, и вот как такое исправлять, разве вот это не есть "Value has been specified"??? - DBMS_HS_PASSTHROUGH.BIND_VARIABLE@GBN(c, 2, p_rate_date, '@Date') ???


ищу в интернете про этот DBMS_HS_PASSTHROUGH информацию, такое чувство что его разработали, написали документацию и с тех пор никто не разу не пользовался.
4 май 06, 16:00    [2630429]     Ответить | Цитировать Сообщить модератору
 Re: Объясните пожалуйста по DBMS_HS_PASSTHROUGH  [new]
raw
Member

Откуда:
Сообщений: 133
Могу только про MSSQL сказать, через DBMS_HS_PASSTHROUGH можно вызвать процедуру с input параметрами:
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.6.0 - Production

SQL> DECLARE
  2  l_ret integer;
  3  c integer;
  4  BEGIN
  5     c := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@sklad;
  6     DBMS_HS_PASSTHROUGH.PARSE@sklad(c, 'execute test_proc ?, ? ');
  7     DBMS_HS_PASSTHROUGH.Bind_Variable@sklad(c,1,'Значение1');
  8     DBMS_HS_PASSTHROUGH.Bind_Variable@sklad(c,2,'Значение2');
  9     l_ret := DBMS_HS_PASSTHROUGH.EXECUTE_NON_QUERY@sklad(c);
 10     DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@sklad(c);
 11  END;
 12  /

PL/SQL procedure successfully completed.
Если есть output параметры, то без DBMS_HS_PASSTHROUGH: test_proc1@sklad(par1, par2).
5 май 06, 15:43    [2635680]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Объясните пожалуйста по DBMS_HS_PASSTHROUGH  [new]
gamerww
Member

Откуда:
Сообщений: 1
Не поделитесь, как решили проблему с чтением out параметра у процедуры?

Мне надо вызвать удаленную процедуру из SQL, если обернуть вызов PROC@MSSQL(p1,p2) в функцию p1 - in параметр, p2 - out параметр, а потом вызвать функцию из SQL, то вызов падает ругаясь на сторонни эффекты в удаленной процедуре PROC@MSSQL.
Если PROC@MSSQL вызывать с помощью пакета dbms_hs_passthrough, то падает, когда читаю out параметр у процедуры. Даже блок обработки исключений не ловит ошибку, отваливается соединения.
30 ноя 18, 06:53    [21749320]     Ответить | Цитировать Сообщить модератору
 Re: Объясните пожалуйста по DBMS_HS_PASSTHROUGH  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 5907
gamerww,

Сделай пример и покажи на нём возникающие ошибки в sqlplus.
30 ноя 18, 09:41    [21749428]     Ответить | Цитировать Сообщить модератору
 Re: Объясните пожалуйста по DBMS_HS_PASSTHROUGH  [new]
BTM
Member

Откуда:
Сообщений: 117
gamerww,

Поскольку вы не поделились, на чем вы поднимаете gateway, то предположим, вы используете dg4odbc, который, согласно документации, не поддерживает вызов хранимых процедур из MSSQL. Попробуйте использовать dg4msql, который специально создан для этого...
3 дек 18, 11:52    [21751871]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить