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

Откуда:
Сообщений: 60
Здраствуйте!

столкнулся с такой задачей, в первой базе дених Оракл есть пакет в нем переменная

CREATE OR REPLACE PACKAGE "PPACK1" IS
	 
	 MyVar number:=17;
         
         function MyFunc(parm number) 
		 return number;
...............................................
END;
/

в другой базе Оракл есть dblink. Функции и процедуры пакета нормально вызываються

begin
 dbms_output.put_line(ppack1.MyFunc@dblink(1));
end;

Какой синтаксис чтоб получить переменную?
16 июн 08, 20:56    [5806486]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью dblink получить значение переменной пакета?  [new]
ORA_Worker
Member

Откуда: Москва
Сообщений: 263
Andrephilos
Здраствуйте!

столкнулся с такой задачей, в первой базе дених Оракл есть пакет в нем переменная

CREATE OR REPLACE PACKAGE "PPACK1" IS
	 
	 MyVar number:=17;
         
         function MyFunc(parm number) 
		 return number;
...............................................
END;
/

в другой базе Оракл есть dblink. Функции и процедуры пакета нормально вызываються

begin
 dbms_output.put_line(ppack1.MyFunc@dblink(1));
end;

Какой синтаксис чтоб получить переменную?


Значение переменной? Так просто вызовете функцию и все?
16 июн 08, 21:06    [5806505]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью dblink получить значение переменной пакета?  [new]
Andrephilos
Member

Откуда:
Сообщений: 60
переменная MyVar равно в примере 17 (но по сути не важно)

Дело вто что в реальном коде много таких переменных. И писать для каждой функции не хочеться. Наверно ж можно получить просто значение. Ведь из базы где хранится пакет значение переменной получается просто:

begin
 dbms_output.put_line(ppack1.MyVar);
end;
16 июн 08, 21:23    [5806532]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью dblink получить значение переменной пакета?  [new]
Sergey M
Member

Откуда: г. Барнаул
Сообщений: 5462
Без функции через dblink получите только PLS-00222
17 июн 08, 05:40    [5807021]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью dblink получить значение переменной пакета?  [new]
Elic
Member

Откуда:
Сообщений: 29991
Andrephilos
Какой синтаксис чтоб получить переменную?
Синтаксиса не существует. Но есть способ:
...
dbms_sql.parse@somedblink(c, 'begin :x := SomePack.SomeVar; end;', dbms_sql.native);
...
17 июн 08, 08:41    [5807111]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью dblink получить значение переменной пакета?  [new]
мытарь
Guest
Мне кажется, что получать состояние переменных пакета через dblink не очень хорошая затея. К моменту получения значения переменной пакета сессия в удаленной БД, занимающаяся обслуживанием входящего запроса, может быть открыта повторно. Ясно, что в этом случае значения переменных пакета могут оказаться не теми, какие Вы ожидаете увидеть. Я наступал на эти грабли несколько лет назад. Правда речь тогда шла об Oracle 7. Может что и изменилось с тех пор.
17 июн 08, 09:12    [5807159]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью dblink получить значение переменной пакета?  [new]
Andrephilos
Member

Откуда:
Сообщений: 60
Спасибо

Elic
Синтаксиса не существует. Но есть способ:
...
dbms_sql.parse@somedblink(c, 'begin :x := SomePack.SomeVar; end;', dbms_sql.native);
...


Раз не существует другой возможности, нужно значит использовать этот метод.
Где можно более подробно почитать о DBMS_SQL и dbms_sql.parse (первый раз с этим сталкиваюсь. не понимаю куда должен результат записываться )
17 июн 08, 14:10    [5809061]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью dblink получить значение переменной пакета?  [new]
Elic
Member

Откуда:
Сообщений: 29991
Andrephilos
Раз не существует другой возможности, нужно значит использовать этот метод.
Не исключено, что нужно пересмотреть подход :)
Andrephilos
Где можно более подробно почитать о DBMS_SQL
RTFM DBMS_SQL (FAQ)
declare
  c int;
  x int;
begin
  c := dbms_sql.open_cursor@somedblink;
  dbms_sql.parse@somedblink(c, 'begin :x := SomePack.SomeVar; end;', dbms_sql.native);
  dbms_sql.bind_variable@somedblink(c, ':x', x);
  x := dbms_sql.execute@somedblink(c);
  dbms_sql.variable_value@somedblink(c, ':x', x);
  dbms_sql.close_cursor@somedblink(c);
  dbms_output.put_line(x);
end;
/
17 июн 08, 14:38    [5809308]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью dblink получить значение переменной пакета?  [new]
Andrephilos
Member

Откуда:
Сообщений: 60
Еще раз Спасибо.

Elic
Не исключено, что нужно пересмотреть подход :)

Возможно, я подумаю. Но я получил очень полезную информацию для себя.
17 июн 08, 14:49    [5809419]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить