powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Объясните пожалуйста по DBMS_HS_PASSTHROUGH
11 сообщений из 11, страница 1 из 1
Объясните пожалуйста по DBMS_HS_PASSTHROUGH
    #33701418
JKL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Есть сервер 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 читал (вдоль и поперек), там только "как должно работать", ни одной конкретной реализации..
...
Рейтинг: 0 / 0
Объясните пожалуйста по DBMS_HS_PASSTHROUGH
    #33702287
raw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
raw
Гость
Покажите файл параметров связи с Sybase *.ora.
...
Рейтинг: 0 / 0
Объясните пожалуйста по DBMS_HS_PASSTHROUGH
    #33702347
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Could be Bug 1847587

SY.
...
Рейтинг: 0 / 0
Объясните пожалуйста по DBMS_HS_PASSTHROUGH
    #33703240
JKL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
initDIADBC.ora:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
# 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, со всеми вытекающими последствиями... сейчас буду проверять
...
Рейтинг: 0 / 0
Объясните пожалуйста по DBMS_HS_PASSTHROUGH
    #33703760
raw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
raw
Гость
Для возможности участия Sybase в распределенных транзакциях надо сделать в базе Sybase схему RECOVER и в этой схеме таблицу HS_TRANSACTION_LOG, скрипт находится там же, где initDIADBC.ora. Вы работаете, как я понимаю, в транзакционной модели COMMIT_CONFIRM, которая устанавливается по умолчанию и рекомендуется Oracle, можно еще попробовать TWO_PHASE_COMMIT (нам понадобилось для одной задачи). Трэйс более подробный в режиме HS_FDS_TRACE_LEVEL=DEBUG
Код: plaintext
1.
2.
3.
4.
5.
6.
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
...
Рейтинг: 0 / 0
Объясните пожалуйста по DBMS_HS_PASSTHROUGH
    #33707245
JKL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решил обойтись без распределенных транзакций, все ж проще чем просить IT-отдел что-то там в базе ДиаСофта создавать.

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

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

Код: plaintext
1.
2.
3.
4.
declare @Course float 

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

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

по идее нет? а вдруг?
...
Рейтинг: 0 / 0
Объясните пожалуйста по DBMS_HS_PASSTHROUGH
    #33707485
JKL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наверное это должно выглядеть так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
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 информацию, такое чувство что его разработали, написали документацию и с тех пор никто не разу не пользовался.
...
Рейтинг: 0 / 0
Объясните пожалуйста по DBMS_HS_PASSTHROUGH
    #33710728
raw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
raw
Гость
Могу только про MSSQL сказать, через DBMS_HS_PASSTHROUGH можно вызвать процедуру с input параметрами:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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).
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Объясните пожалуйста по DBMS_HS_PASSTHROUGH
    #39740641
gamerww
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не поделитесь, как решили проблему с чтением out параметра у процедуры?

Мне надо вызвать удаленную процедуру из SQL, если обернуть вызов PROC@MSSQL(p1,p2) в функцию p1 - in параметр, p2 - out параметр, а потом вызвать функцию из SQL, то вызов падает ругаясь на сторонни эффекты в удаленной процедуре PROC@MSSQL.
Если PROC@MSSQL вызывать с помощью пакета dbms_hs_passthrough, то падает, когда читаю out параметр у процедуры. Даже блок обработки исключений не ловит ошибку, отваливается соединения.
...
Рейтинг: 0 / 0
Объясните пожалуйста по DBMS_HS_PASSTHROUGH
    #39740680
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gamerww,

Сделай пример и покажи на нём возникающие ошибки в sqlplus.
...
Рейтинг: 0 / 0
Объясните пожалуйста по DBMS_HS_PASSTHROUGH
    #39741887
BTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BTM
Гость
gamerww,

Поскольку вы не поделились, на чем вы поднимаете gateway, то предположим, вы используете dg4odbc, который, согласно документации, не поддерживает вызов хранимых процедур из MSSQL. Попробуйте использовать dg4msql, который специально создан для этого...
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Объясните пожалуйста по DBMS_HS_PASSTHROUGH
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]