powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Commit при вызове процедуры через oracle dblink
5 сообщений из 5, страница 1 из 1
Commit при вызове процедуры через oracle dblink
    #39552702
Hamstervill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, подскажите, пожалуйста. Не фиксируются данные при вызове процедуры postgresql через oracle dblink
1) Создал простейшую процедуру в БД postgresql
CREATE OR REPLACE FUNCTION public.test_insert(i_id integer)
RETURNS integer
LANGUAGE plpgsql
AS $function$
DECLARE
begin

insert into tts.test_ora_db(id) values(i_id);

return i_id;

EXCEPTION
WHEN others THEN
RAISE WARNING 'err.create_user_account.Others State: % Errm: %', sqlstate, sqlerrm;
return sqlerrm;
END;
$function$

2) В БД Oracle создал процедуру для возможности вызова через DBlink процедур postgresql с входными параметрами
CREATE OR REPLACE FUNCTION Call_Postgre_n(v_Func VARCHAR2) RETURN NUMBER IS
v_Cursor BINARY_INTEGER;
v_Nr BINARY_INTEGER;
v_Ret NUMBER;
BEGIN
v_Cursor := Dbms_Hs_Passthrough.Open_Cursor@Pgsql;

Dbms_Hs_Passthrough.Parse@Pgsql(v_Cursor,
'select ' || v_Func);
v_Nr := Dbms_Hs_Passthrough.Fetch_Row@Pgsql(v_Cursor);
Dbms_Hs_Passthrough.Get_Value@Pgsql(v_Cursor,
1,
v_Ret);
Dbms_Hs_Passthrough.Close_Cursor@Pgsql(v_Cursor);
RETURN v_Ret;
END;

3) Совершаю вызов
select Call_Postgre_n('public.test_insert(10)') as rez from dual
Вернуло 10

4) Снова в postgresql
select * from tts.test_ora_db;
Пусто!!!
Как же так? Прочитал кучу топиков, где пишут, что явно commit писать не требуется, до и не позволяется это в процедуре postgresql.
...
Рейтинг: 0 / 0
Commit при вызове процедуры через oracle dblink
    #39552713
ыудусе
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hamstervill,
а если после select * from tts.test_ora_db; сделать commit ?
...
Рейтинг: 0 / 0
Commit при вызове процедуры через oracle dblink
    #39552720
Hamstervill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ыудусе, попробовал, не помогает
...
Рейтинг: 0 / 0
Commit при вызове процедуры через oracle dblink
    #39552857
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чуток отформатировал, бо невозможно читать
HamstervillКоллеги, подскажите, пожалуйста. Не фиксируются данные при вызове процедуры postgresql через oracle dblink
1) Создал простейшую процедуру в БД postgresql
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE OR REPLACE FUNCTION public.test_insert(i_id integer)
 RETURNS integer
 LANGUAGE plpgsql
AS $function$
DECLARE
begin
	
  insert into tts.test_ora_db(id) values(i_id); 	
  
  return i_id; 
  
EXCEPTION
  WHEN others THEN
    RAISE WARNING 'err.create_user_account.Others State: %  Errm: %', sqlstate, sqlerrm;
    return sqlerrm;
END;
$function$



2) В БД Oracle создал процедуру для возможности вызова через DBlink процедур postgresql с входными параметрами
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE OR REPLACE FUNCTION Call_Postgre_n(v_Func VARCHAR2) RETURN NUMBER IS
  v_Cursor BINARY_INTEGER;
  v_Nr     BINARY_INTEGER;
  v_Ret    NUMBER;
BEGIN
  v_Cursor := Dbms_Hs_Passthrough.Open_Cursor@Pgsql;

  Dbms_Hs_Passthrough.Parse@Pgsql(v_Cursor,
                                  'select ' || v_Func);
  v_Nr := Dbms_Hs_Passthrough.Fetch_Row@Pgsql(v_Cursor);
  Dbms_Hs_Passthrough.Get_Value@Pgsql(v_Cursor,
                                      1,
                                      v_Ret);
  Dbms_Hs_Passthrough.Close_Cursor@Pgsql(v_Cursor);
  RETURN v_Ret;
END;



3) Совершаю вызов
Код: sql
1.
select Call_Postgre_n('public.test_insert(10)') as rez from dual


Вернуло 10

4) Снова в postgresql
Код: sql
1.
   select * from tts.test_ora_db;


Пусто!!!
Как же так? Прочитал кучу топиков, где пишут, что явно commit писать не требуется, до и не позволяется это в процедуре postgresql.


Тестирую без oracle процедуры
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
postgres=# select test_insert(10);
 test_insert
-------------
          10
(1 row)

postgres=# select * from dropme;
 x
----
 10
(1 row)

-- на oracle
SQL> select dbms_hs_passthrough.execute_immediate@vvpsql('select test_insert(10)') from dual;

DBMS_HS_PASSTHROUGH.EXECUTE_IMMEDIATE@VVPSQL('SELECTTEST_INSERT(10)')
---------------------------------------------------------------------
                                                                    1

SQL> select * from "dropme"@VVPSQL;

         x
----------
        10
        10

SQL>  select dbms_hs_passthrough.execute_immediate@vvpsql('select test_insert(10)') from dual;

DBMS_HS_PASSTHROUGH.EXECUTE_IMMEDIATE@VVPSQL('SELECTTEST_INSERT(10)')
---------------------------------------------------------------------
                                                                    1

SQL> select * from "dropme"@VVPSQL;

         x
----------
        10
        10
        10
-- на postgres
postgres=# select * from dropme;
 x
----
 10

-- на oracle
SQL> commit;

Commit complete.

SQL> select * from "dropme"@VVPSQL;

         x
----------
        10
        10
        10

-- на postgres
postgres=# select * from dropme;
 x
----
 10
 10
 10
(3 rows)



Попробуй убрать exception может по русски выругается?
...
Рейтинг: 0 / 0
Commit при вызове процедуры через oracle dblink
    #39552959
Hamstervill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vadim Lejnin, спасибо за проведенный анализ. Разобрался в чем дело, оказывается oracle неявно дописывает BEGIN в начало вызова, таким образом, на вход в postgresql поступает команда: BEGIN;select public.test_insert(10)
Нужно вызвать вот так:
select Call_Postgre_n('public.test_insert(10); commit;') as rez from dual

И все работает!
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Commit при вызове процедуры через oracle dblink
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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