powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как переписать это с Оракла на Постгрес?
20 сообщений из 20, страница 1 из 1
Как переписать это с Оракла на Постгрес?
    #34336756
alosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
create or replace function()
....
....
exception
when others then rollback;
end;
...
Рейтинг: 0 / 0
Как переписать это с Оракла на Постгрес?
    #34336772
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aloshacreate or replace function()
....
....
exception
when others then rollback;
end;
ЙО! Может таки доку почитать?
Там все прикольно описано. В том числе и как с Оракла мигрировать.
...
Рейтинг: 0 / 0
Как переписать это с Оракла на Постгрес?
    #34339832
alosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andrey Daeron aloshacreate or replace function()
....
....
exception
when others then rollback;
end;
ЙО! Может таки доку почитать?
Там все прикольно описано. В том числе и как с Оракла мигрировать.

не могу найти такого, может кто знает, как это переделать?
...
Рейтинг: 0 / 0
Как переписать это с Оракла на Постгрес?
    #34340724
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alosha Andrey Daeron aloshacreate or replace function()
....
....
exception
when others then rollback;
end;
ЙО! Может таки доку почитать?
Там все прикольно описано. В том числе и как с Оракла мигрировать.

не могу найти такого, может кто знает, как это переделать?
Тогда вопрос - а чего собсно хочется, или что не устравивает в доке? Чего непонятного-то?
До раздела 37.11.2.1. Implicit Rollback after Exceptions дочитали?
...
Рейтинг: 0 / 0
Как переписать это с Оракла на Постгрес?
    #34341250
alosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andrey Daeron alosha Andrey Daeron aloshacreate or replace function()
....
....
exception
when others then rollback;
end;
ЙО! Может таки доку почитать?
Там все прикольно описано. В том числе и как с Оракла мигрировать.

не могу найти такого, может кто знает, как это переделать?
Тогда вопрос - а чего собсно хочется, или что не устравивает в доке? Чего непонятного-то?
До раздела 37.11.2.1. Implicit Rollback after Exceptions дочитали?

Вот функция:
create or replace function clearDistributedQueries(
pCREATION_DATE_TO numeric(19)
) returns void as $BODY$
begin
delete
from QUERY_RESULT
where DISTRIBUTED_QUERY_ID in (select ID
from DISTRIBUTED_QUERY
where CREATION_DATE <= pCREATION_DATE_TO);
delete
from DISTRIBUTED_QUERY
where CREATION_DATE <= pCREATION_DATE_TO;
--exception
--when others then rollback;
end;$BODY$
LANGUAGE 'plpgsql';

Надо по-другому переписать exception-блок, потому что так пишется в Оракле и я не знаю, как это правильно написать в Постгресе. Напишите правильно, пожалуйста.
...
Рейтинг: 0 / 0
Как переписать это с Оракла на Постгрес?
    #34341368
СергейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alosha
Вот функция:
create or replace function clearDistributedQueries(
pCREATION_DATE_TO numeric(19)
) returns void as $BODY$
begin
delete
from QUERY_RESULT
where DISTRIBUTED_QUERY_ID in (select ID
from DISTRIBUTED_QUERY
where CREATION_DATE <= pCREATION_DATE_TO);
delete
from DISTRIBUTED_QUERY
where CREATION_DATE <= pCREATION_DATE_TO;
--exception
--when others then rollback;
end;$BODY$
LANGUAGE 'plpgsql';

Надо по-другому переписать exception-блок, потому что так пишется в Оракле и я не знаю, как это правильно написать в Постгресе. Напишите правильно, пожалуйста.

Naskolko ia ponial konstruktsiu 'exception when others' Oracla, v dannom konkretnom sluchae v Postgrese ee mojete prosto vykinut', tak kak PG i tak bez etoi konstruktsii otkatit tranzactsiu pri vozniknovenii oshibki.
...
Рейтинг: 0 / 0
Как переписать это с Оракла на Постгрес?
    #34341538
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2alosha
как я понимаю, вы программировали под оракл? прочитайте внимательно 37.11.2.1. Implicit Rollback after Exceptions как советовал Andrey Daeron

в кратце, в вашем случае "some actual thought will be required"
...
Рейтинг: 0 / 0
Как переписать это с Оракла на Постгрес?
    #34341804
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alosha
Вот функция:
create or replace function clearDistributedQueries(
pCREATION_DATE_TO numeric(19)
) returns void as $BODY$
begin
delete
from QUERY_RESULT
where DISTRIBUTED_QUERY_ID in (select ID
from DISTRIBUTED_QUERY
where CREATION_DATE <= pCREATION_DATE_TO);
delete
from DISTRIBUTED_QUERY
where CREATION_DATE <= pCREATION_DATE_TO;
--exception
--when others then rollback;
end;$BODY$
LANGUAGE 'plpgsql';

Надо по-другому переписать exception-блок, потому что так пишется в Оракле и я не знаю, как это правильно написать в Постгресе. Напишите правильно, пожалуйста.
Ну дык. Если верить доке - то все УЖЕ написано правильно. Ибо по любому other произойдет роллбек.
...
Рейтинг: 0 / 0
Как переписать это с Оракла на Постгрес?
    #34341874
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey Daeronрить доке - то все УЖЕ написано правильно. Ибо по любому other произойдет роллбек.
не все, откатиться только изменения с момента начала функции, сама транзакция останется висеть. Т.е. надо чтото придумать, что б по ошибке в функции, откатить всю транзакцию.
...
Рейтинг: 0 / 0
Как переписать это с Оракла на Постгрес?
    #34342012
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st_serg Andrey Daeronрить доке - то все УЖЕ написано правильно. Ибо по любому other произойдет роллбек.
не все, откатиться только изменения с момента начала функции, сама транзакция останется висеть. Т.е. надо чтото придумать, что б по ошибке в функции, откатить всю транзакцию.
Если я правильно курю эту доку, то вот это
Код: plaintext
1.
2.
3.
 [b]37 . 7 . 5 . Trapping Errors[/b]
By default, any error occurring in a PL/pgSQL function aborts execution of the function, 
and indeed of the surrounding transaction as well
обозначает, что произойдет abort surround transaction as well, т.е. она откатится до праотцофф.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
bus_station=# begin;
BEGIN
bus_station=# CREATE TABLE fff();
CREATE TABLE
bus_station=# select tpmb.ftest();
ERROR:  relation "bus_types" does not exist
CONTEXT:  SQL statement "delete from bus_types"
PL/pgSQL function "ftest" line  2  at SQL statement
bus_station=# SELECT  1 ;
ERROR:  current transaction is aborted, commands ignored until end of transactio
n block
bus_station=#
и я даже более того скажу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
bus_station=# begin;
BEGIN
bus_station=# CREATE TABLE fff();
CREATE TABLE
bus_station=# select tpmb.ftest();
ERROR:  relation "bus_types" does not exist
CONTEXT:  SQL statement "delete from bus_types"
PL/pgSQL function "ftest" line  2  at SQL statement
bus_station=# COMMIT;
ROLLBACK
и еще более
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
bus_station=# begin;
BEGIN
bus_station=# CREATE TABLE fff();
CREATE TABLE
bus_station=# SAVEPOINT aa;
SAVEPOINT
bus_station=# select tpmb.ftest();
ERROR:  relation "bus_types" does not exist
CONTEXT:  SQL statement "delete from bus_types"
PL/pgSQL function "ftest" line  2  at SQL statement
bus_station=# SELECT * FROM fff;
ERROR:  current transaction is aborted, commands ignored until end of transactio
n block
bus_station=#
...
Рейтинг: 0 / 0
Как переписать это с Оракла на Постгрес?
    #34342054
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как вы сами видите, что б транзакция откатилась необходимо исключение, при этом "current transaction is aborted, commands ignored until end of transaction block "
если мы в функции пишем when other then null; то у нас происходит "In PL/pgSQL, when an exception is caught by an EXCEPTION clause, all database changes since the block's BEGIN are automatically rolled back"

в приведенном автором куске кода, функция в случае непредвиденной ошибки, просто откатывает всю транзакцию назад, не матюкаясь. последующие команды будут восприниматься вполне нормально (неявно начнеться новая транзакция).
В пг придется явно завершить сломанную транзакцию, а затем начать новую.
...
Рейтинг: 0 / 0
Как переписать это с Оракла на Постгрес?
    #34342082
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
create or replace function f3() returns void
as $$
declare
   n numeric;
begin
   insert into t1 values( 1 );
   n :=  10  /  0 ;
   insert into t1 values( 2 );
exception
   when others then
      raise notice 'exception catched';
      insert into t1 values( 3 );
end;
$$ language plpgsql

postgres=# select * from t1;
 f
---
( 0  rows)

postgres=# begin;
BEGIN
postgres=# insert into t1 values( 0 );
INSERT  0   1 
postgres=# select f3();
NOTICE:  exception catched
 f3
----

( 1  запись)

postgres=# select * from t1;
 f
---
  0 
  3 
( 2  rows)

postgres=# rollback;
ROLLBACK
postgres=# select * from t1;
 f
---
( 0  rows)
...
Рейтинг: 0 / 0
Как переписать это с Оракла на Постгрес?
    #34342102
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alosha Надо по-другому переписать exception-блок, потому что так пишется в Оракле и я не знаю, как это правильно написать в Постгресе. Напишите правильно, пожалуйста.
автор36.7.5. Trapping Errors
By default, any error occurring in a PL/pgSQL function aborts execution of the function, and indeed of the surrounding transaction as well. You can trap errors and recover from them by using a BEGIN block with an EXCEPTION clause. The syntax is an extension of the normal syntax for a BEGIN block:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
[ <<label>> ]
[ DECLARE
    declarations ]
BEGIN
    statements
EXCEPTION
    WHEN condition [ OR condition ... ] THEN
        handler_statements
    [ WHEN condition [ OR condition ... ] THEN
          handler_statements
      ... ]
END;
 


If no error occurs, this form of block simply executes all the statements, and then control passes to the next statement after END. But if an error occurs within the statements, further processing of the statements is abandoned, and control passes to the EXCEPTION list. The list is searched for the first condition matching the error that occurred. If a match is found, the corresponding handler_statements are executed, and then control passes to the next statement after END. If no match is found, the error propagates out as though the EXCEPTION clause were not there at all: the error can be caught by an enclosing block with EXCEPTION, or if there is none it aborts processing of the function.

The condition names can be any of those shown in Appendix A, PostgreSQL Error Codes. A category name matches any error within its category. The special condition name OTHERS matches every error type except QUERY_CANCELED. (It is possible, but often unwise, to trap QUERY_CANCELED by name.) Condition names are not case-sensitive.блин, ну надо ж быть таким ленивым...
...
Рейтинг: 0 / 0
Как переписать это с Оракла на Постгрес?
    #34342113
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не поможет это ему... pl/pgSQL не умеет управлять ходом транзакции, pl/sql умеет
...
Рейтинг: 0 / 0
Как переписать это с Оракла на Постгрес?
    #34342144
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
where CREATION_DATE <= pCREATION_DATE_TO;
--exception
--when others then rollback;


st_sergкак вы сами видите, что б транзакция откатилась необходимо исключение, при этом "current transaction is aborted, commands ignored until end of transaction block "
если мы в функции пишем when other then null; то у нас происходит "In PL/pgSQL, when an exception is caught by an EXCEPTION clause, all database changes since the block's BEGIN are automatically rolled back"

в приведенном автором куске кода, функция в случае непредвиденной ошибки, просто откатывает всю транзакцию назад, не матюкаясь. последующие команды будут восприниматься вполне нормально (неявно начнеться новая транзакция).
В пг придется явно завершить сломанную транзакцию, а затем начать новую.
Неа, не начнется - будут порождаться ерроры, которые, по крайней мере в теории, и обвалят транзакцию уже в клиенте (т.е. клиент "догадается" что произошла какая-то нездоровая весчщь).
У него-ж перехват exception закоментен, в отличии от Вашего когда
...
Рейтинг: 0 / 0
Как переписать это с Оракла на Постгрес?
    #34342173
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
create or replace procedure f3ora
is
   n number;
begin
   insert into t1 values( 1 );
   n :=  10  /  0 ;
   insert into t1 values( 2 );
exception
   when others then
      dbms_output.put_line('exception catched');
      insert into t1 values( 3 );
end;
/
$ set serveroutput on
$ select * from t1;

строки не выбраны

$ insert into t1 values ( 0 );

 1  строка создана.

$ execute f3ora;
exception catched

Процедура PL/SQL успешно завершена.

$ insert into t1 values( 4 );

 1  строка создана.

$ select * from t1;

         F
----------
          0 
          1 
          3 
          4 

$ rollback;

Откат завершен.

$ select * from t1;

строки не выбраны
о каких еррорах речь?
кстати, в оракле изменения в функции не откатываются до начала функции, как это происходит в пг
...
Рейтинг: 0 / 0
Как переписать это с Оракла на Постгрес?
    #34342176
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
насчет закоменченного куска, автор пишет
"Надо по-другому переписать exception-блок, потому что так пишется в Оракле и я не знаю, как это правильно написать в Постгресе. Напишите правильно, пожалуйста."
...
Рейтинг: 0 / 0
Как переписать это с Оракла на Постгрес?
    #34342228
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще один маленький test-case
pg
Код: plaintext
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.
postgres=# create or replace function f3() returns void
postgres-# as $$
postgres$# declare
postgres$#    n numeric;
postgres$# begin
postgres$#    insert into t1 values( 1 );
postgres$#    n :=  10  /  0 ;
postgres$#    insert into t1 values( 2 );
postgres$# end;
postgres$# $$ language plpgsql
postgres-# ;
CREATE FUNCTION
postgres=# select * from t1;
 f
---
( 0  rows)

postgres=# begin;
BEGIN
postgres=# insert into t1 values( 0 );
INSERT  0   1 
postgres=# select f3();
ERROR:  division by zero
КОНТЕКСТ:  PL/pgSQL function "f3" line  5  at assignment
postgres=# insert into t1 values( 3 );
ERROR:  current transaction is aborted, commands ignored until end of transaction block
postgres=# select * from t1;
ERROR:  current transaction is aborted, commands ignored until end of transaction block
postgres=# rollback;
ROLLBACK
postgres=# select * from t1;
 f
---
( 0  rows)

postgres=#

oracle
Код: plaintext
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.
$ create or replace procedure f3
   2   is
   3      n number;
   4   begin
   5      insert into t1 values( 1 );
   6      n :=  10  /  0 ;
   7      insert into t1 values( 2 );
   8   end;
   9   /

Процедура создана.

$ select * from t1;

строки не выбраны

$ insert into t1 values( 0 );

 1  строка создана.

$ execute f3;
BEGIN f3; END;

*
ошибка в строке  1 :
ORA- 01476 : divisor is equal to zero
ORA- 06512 : at "F3", line  6 
ORA- 06512 : at line  1 


$ insert into t1 values( 3 );

 1  строка создана.

$ select * from t1;

         F
----------
          0 
          3 

$ rollback;

Откат завершен.

$ select * from t1;

строки не выбраны
...
Рейтинг: 0 / 0
Как переписать это с Оракла на Постгрес?
    #34342290
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я лишь хочу сказать, что exception в оракле отваливает либо весь программный блок, либо отдельный оператор, не трогая транзакцию в целом
в пг, в случае exception отваливается вся транзакция, причем, чтобы продолжить работу, ее надо явно завершить.

Для автора сабжа это означает
37.11.2.1. Implicit Rollback after Exceptions
...
If you have a procedure that uses SAVEPOINT and ROLLBACK TO in a different way then some actual thought will be required.

имхо, нужно выносить все управление транзакциями на клиента.

Кусок оракловского кода
Код: plaintext
1.
2.
3.
4.
5.
6.
create or replace function()
....
....
exception
when others then rollback;
end;
на пг так просто не портируется.
...
Рейтинг: 0 / 0
Как переписать это с Оракла на Постгрес?
    #34342367
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гм, извиняюсь, по поводу "вся транзакция" я погорячился, если использовать savepoint'ы то
Код: plaintext
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.
postgres=# begin;
BEGIN
postgres=# savepoint p1;
SAVEPOINT
postgres=# insert into t3 values( 1 );
INSERT  0   1 
postgres=# savepoint p1;
SAVEPOINT
postgres=# insert into t3 values( 2 );
INSERT  0   1 
postgres=# savepoint p1;
SAVEPOINT
postgres=# insert into t3 values( 2 );
ERROR:  duplicate key violates unique constraint "t3_pkey"
postgres=# savepoint p1;
ERROR:  current transaction is aborted, commands ignored until end of transaction block
postgres=# rollback to savepoint p1;
ROLLBACK
postgres=# select * from t3;
 f
---
  1 
  2 
( 2  rows)

postgres=# rollback;
ROLLBACK
postgres=# select * from t3;
 f
---
( 0  rows)
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как переписать это с Оракла на Постгрес?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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