Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4 5   вперед  Ctrl      все
 ORA-01002 при попытке отката к несуществующему Savepoint  [new]
TRust
Member

Откуда: из самоизоляции
Сообщений: 286
Столкнулся с неприятной ситуацией. В результате исследований выделил TestCase (Oracle 10.2.0.2):
Declare
  Type TCur is Ref cursor;
  Cur TCur;
  N Number;
  NO_SAVEPOINT EXCEPTION;
  PRAGMA EXCEPTION_INIT (NO_SAVEPOINT, -01086);
begin
  select 1 into N from Table_A where RowNum=1 For Update nowait; -- (1)
  Savepoint AA; -- (2)
  Rollback to AA; -- (3)
  open Cur for 'Select 1 from Table_B'; -- (4)
  fetch Cur into N; -- (5)
  begin
    Rollback to AA; -- (6)
  Exception
    When NO_SAVEPOINT then Null;
  end;
  fetch Cur into N; -- (7)
  Close Cur;  
end; 

Получаем ошибку

ORA-01002: fetch out of sequence
ORA-06512: at line 18

Комментарии:
(1) Наличие данной блокировки обязательно. Без неё ошибка не возникает. Имя таблицы не имеет значения. Количество блокируемых строк тоже не важно.
(2) Далее ставится Savepoint. Его имя не имеет значения. Но без наличия этой строки ошибка не возникает.
(3) Наличие этой строки не обязательно для проявления ошибки. Просто Rollback to <имя> как правило производится в Системе. Наличие реальных DML между (2) и (3) не имеет значения для проявления ошибки.
(4) Открывается курсор. Имя таблицы не имеет значения. Таблица Table_B может быть никак не связана с таблицей Table_A.
(5) Наличие этой сроки не обязательно для проявления ошибки. Просто несколько fetch как правило производится в Системе.
(6) Попытка Rollback to <имя> обязательна для проявления ошибки. В Системе данная попытка производится из-за того, что неизвестно - была ли уже попытка Rollback на тот же Savepoint. Более того, действия между (2) и (3) как правило закомичены (в этом случае, правда, глюк не наблюдается) и перехват ошибки ORA-01086 крайне полезен.
(7) Здесь и случается ошибка.

Итак, для появления ошибки нужно редкое стечение обстоятельств:
1. Наличие строчной блокировки в какой-то таблице
2. Установка, а затем откат к Savepoint (без Commit)
3. Открытие любого курсора
4. Попытка отката к ранее установленному Savepoint (его наличие в момент отката не имеет значения)
5. Попытка продолжить fetch из курсора.

Тем не менее, такая ситуация иногда встречается и указанная ошибка очень неприятна, тем более непонятна причина её возникновения.

Техподдержка Oracle трындит, что так и должно быть. Тем не менее в версиях Oracle 10.1.0.5, 10.1.0.4, 9.2.0.8, 9.2.0.7 данный глюк отсутствует!
Что делать?
26 сен 07, 17:38    [4719805]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01002 при попытке отката к несуществующему Savepoint  [new]
Elic
Member

Откуда:
Сообщений: 29988
TRust
4. Попытка отката к ранее установленному Savepoint (его наличие в момент отката не имеет значения)
Как раз-таки имеет. Если откат успешно произойдёт, то возможность продолжения fetch-а была бы парадоксом ("видимость отменённого будущего из прошлого") и поэтому ORA-01002 весьма закономерен.
TRust
Техподдержка Oracle трындит, что так и должно быть. Тем не менее в версиях Oracle 10.1.0.5, 10.1.0.4, 9.2.0.8, 9.2.0.7 данный глюк отсутствует!
Она права. Но не договаривает. В перечисленных версиях настоящий глюк не исправлен! Тебе нужно молиться, чтобы он не проявился, там где это "работает".
create table tmp as select level as i from dual connect by level <= 3;
declare
  c sys_refcursor;
  x int;
begin
  savepoint aa;
  update tmp set i = i * 10;
  open c for select * from tmp;
  fetch c into x;
  dbms_output.put_line(x);
  rollback to aa;
  fetch c into x;
  dbms_output.put_line(x);
  close c;
end;
/
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.8.0 - Production

10
2 -- Настоящий глюк !!!

PL/SQL procedure successfully completed.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production

10
declare
*
ERROR at line 1:
ORA-01002: fetch out of sequence
26 сен 07, 21:31    [4720856]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01002 при попытке отката к несуществующему Savepoint  [new]
Elic
Member

Откуда:
Сообщений: 29988
STFF
26 сен 07, 21:50    [4720938]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01002 при попытке отката к несуществующему Savepoint  [new]
TRust
Member

Откуда: из самоизоляции
Сообщений: 286
Уважаемый "каждой бочке затычка". Если Вы не в состоянии понять суть проблемы - прошу не вмешиваться. Ваш пример - из другой жизни. (Вроде бы ВСЁ разжевал и в рот положил! - см. комментарии). Извините.

Может кто всё таки чего скажет по делу?
Повторяю: В моём случае производится попытка отката к НЕСУЩЕСТВУЮЩЕМУ Savepoint. Его уже нет! Откатили на шаге (3). Возникает Exception 01086 и соответственно никакого ROLLBACK нет и в поминет. Тем не менее курсор эта попытка портит :(
Что-то тут у оракла несрастается и он такую ситуацию принимает за ту, что приводит в примере "каждой бочке затычка"
26 сен 07, 22:25    [4721053]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01002 при попытке отката к несуществующему Savepoint  [new]
Двоюшник
Member

Откуда: Киев
Сообщений: 1135
declare
  v varchar2(1) ;
begin
  savepoint a;
  rollback to a;
  rollback to a;
  rollback to a;
  rollback to a;
  rollback to a;
  rollback to a;
  rollback to a;
  rollback to a;
end;
---
Ну ты заходи ежели чё...
26 сен 07, 22:32    [4721065]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01002 при попытке отката к несуществующему Savepoint  [new]
TRust
Member

Откуда: из самоизоляции
Сообщений: 286
Двоюшник
begin
  savepoint a;
  rollback to a;
  rollback to a;
end;


Спасибо, уже сам до этого допёр.
26 сен 07, 23:12    [4721135]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01002 при попытке отката к несуществующему Savepoint  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18363
TRust
Спасибо, уже сам до этого допёр.

Неплохо бы извиниться перед Elic...
О роли commit во всей этой истории:
Declare
  Type TCur is Ref cursor;
  Cur TCur;
  N Number;
  NO_SAVEPOINT EXCEPTION;
  PRAGMA EXCEPTION_INIT (NO_SAVEPOINT, -01086);
  OUT_OF_SEQUENCE EXCEPTION;
  PRAGMA EXCEPTION_INIT (OUT_OF_SEQUENCE, -01002);
begin
  select 1 into N from Table_A where RowNum=1 For Update nowait; -- (1)
  Savepoint AA; -- (2)
  Rollback to AA; -- (3)
  open Cur for 'Select 1 from Table_B'; -- (4)
  fetch Cur into N; -- (5)
  begin
    Rollback to AA; -- (6)
         dbms_output.put_line('Successfull Rollback to AA');
  Exception
    When NO_SAVEPOINT then Null;
         dbms_output.put_line('NO_SAVEPOINT');
  end;
  fetch Cur into N; -- (7)
  Close Cur;
  dbms_output.put_line('Fetch succeed');
exception
  when OUT_OF_SEQUENCE then
       dbms_output.put_line('OUT_OF_SEQUENCE');
end;
/

Successfull Rollback to AA
OUT_OF_SEQUENCE

PL/SQL procedure successfully completed
Declare
  Type TCur is Ref cursor;
  Cur TCur;
  N Number;
  NO_SAVEPOINT EXCEPTION;
  PRAGMA EXCEPTION_INIT (NO_SAVEPOINT, -01086);
  OUT_OF_SEQUENCE EXCEPTION;
  PRAGMA EXCEPTION_INIT (OUT_OF_SEQUENCE, -01002);
begin
  select 1 into N from Table_A where RowNum=1 For Update nowait; -- (1)
  Savepoint AA; -- (2)
  Rollback to AA; -- (3)
  open Cur for 'Select 1 from Table_B'; -- (4)
  fetch Cur into N; -- (5)
  begin
  COMMIT;
    Rollback to AA; -- (6)
         dbms_output.put_line('Successfull Rollback to AA');
  Exception
    When NO_SAVEPOINT then Null;
         dbms_output.put_line('NO_SAVEPOINT');
  end;
  fetch Cur into N; -- (7)
  Close Cur;
  dbms_output.put_line('Fetch succeed');
exception
  when OUT_OF_SEQUENCE then
       dbms_output.put_line('OUT_OF_SEQUENCE');
end;
/

NO_SAVEPOINT
Fetch succeed

PL/SQL procedure successfully completed
26 сен 07, 23:29    [4721160]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01002 при попытке отката к несуществующему Savepoint  [new]
Ааз
Member

Откуда: Москва/Протвино
Сообщений: 4274
Elic
Если откат успешно произойдёт, то возможность продолжения fetch-а была бы парадоксом ("видимость отменённого будущего из прошлого") и поэтому ORA-01002 весьма закономерен.
Мощно задвинул. Краткость, однако, сестра.

Всего
26 сен 07, 23:48    [4721189]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01002 при попытке отката к несуществующему Savepoint  [new]
Fucker
Member [заблокирован]

Откуда:
Сообщений: 1525
andrey_anonymous
TRust
Спасибо, уже сам до этого допёр.

Неплохо бы извиниться перед Elic...
Андрей, обрати внимание на фазу луны слева внизу в разделе астрономия: http://www.gismeteo.ru/towns/27612.htm

Наверно не один TRust сегодня так мучается...
27 сен 07, 00:15    [4721211]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01002 при попытке отката к несуществующему Savepoint  [new]
TRust
Member

Откуда: из самоизоляции
Сообщений: 286
andrey_anonymous
Неплохо бы извиниться перед Elic...
Извиняюсь.

andrey_anonymous
О роли commit во всей этой истории

С коммитом как раз всё нормально - он действительно удаляет savepoint.
Беда в том, что как правило между (2) и (3) есть Commit и глюк никак не проявлялся...
А на 9 и 10.1 он не проявлялся и в редких случаях, когда между (2) и (3) транзакция не завершалась.
27 сен 07, 00:17    [4721213]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01002 при попытке отката к несуществующему Savepoint  [new]
TRust
Member

Откуда: из самоизоляции
Сообщений: 286
Elic
Если откат успешно произойдёт, то возможность продолжения fetch-а была бы парадоксом ("видимость отменённого будущего из прошлого") и поэтому ORA-01002 весьма закономерен.

Стойте, стойте-ка! Всё-таки здесь что-то не так!

create table T1 (Notes Varchar2(4000));
Insert into T1 Values ('A');
Insert into T1 Values ('B');
Insert into T1 Values ('C');
Commit;

Вот две ситуации, на мой взгляд, абсолютно симметричные:
Declare
  Cursor C is Select Notes from T1;
  A Varchar2(4000);
begin
  open C;
  loop
    fetch C into A;
    Exit when C%notfound;
    DBMS_OUTPUT.put_line(A);
    Update T1 set Notes=Ascii(Notes);
  end loop;
  close C;
end;
A
B
C

Всё понятно - оракл обеспечивает целостность чтения, хотя я в процессе фетча меняю все данные.

Declare
  Cursor C is Select Notes from T1;
  A Varchar2(4000);
begin
  Update T1 set Notes=Ascii(Notes);
  open C;
  loop
    fetch C into A;
    Exit when C%notfound;
    DBMS_OUTPUT.put_line(A);
    rollback;
  end loop;
  close C;
end;
53
ORA-01002: fetch out of sequence
ORA-06512: at line 9

Ну и где хвалёная целостность чтения? Я ожидаю, как и в первом случае, что курсор вернёт состояние таблицы на момент открытия курсора! Что мешает благородным Донам обеспечить эту целостность?

Ну ладно, лезем в доку:
ORA-01002: fetch out of sequence
This error means that a fetch has been attempted from a cursor which is no longer valid.
Note that a PL/SQL cursor loop implicitly does fetches, and thus may also cause this error.
There are a number of possible causes for this error, including:
1) Fetching from a cursor after the last row has been retrieved and the ORA-1403 error returned.
2) If the cursor has been opened with the FOR UPDATE clause, fetching after a COMMIT has been issued will return the error.
3) Rebinding any placeholders in the SQL statement, then issuing a fetch before reexecuting the statement.

Где тут мой случай?

И после этого это не баг? Или это Documentation bug?
27 сен 07, 10:19    [4721961]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01002 при попытке отката к несуществующему Savepoint  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
TRust
[quot Elic]Я ожидаю, как и в первом случае, что курсор вернёт состояние таблицы на момент открытия курсора! Что мешает благородным Донам обеспечить эту целостность?
Откат тебя вернет к состоянию, когда курсор еще не открыт (перед update)
27 сен 07, 10:26    [4722028]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01002 при попытке отката к несуществующему Savepoint  [new]
Elic
Member

Откуда:
Сообщений: 29988
TRust
Ну и где хвалёная целостность чтения?
Ты много вопишь, не понимая основополагающих принципов.
Согласованное чтение обеспечивается воостановлением строки из текущего её состояния на определённый момент в прошлом путём применения undo.
После твоего отката искомый момент времени становится будущим по отношению к текущему состоянию строки. Мало того, что Oracle это просто не умеет, так это ещё и нелогично.

Ляг поспи :)
27 сен 07, 10:38    [4722145]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01002 при попытке отката к несуществующему Savepoint  [new]
TRust
Member

Откуда: из самоизоляции
Сообщений: 286
Elic
Ты много вопишь, не понимая основополагающих принципов.
Ляг поспи :)

Сейчас возьму свои извинения назад :)

Всё таки Documentation bug?
27 сен 07, 10:53    [4722291]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01002 при попытке отката к несуществующему Savepoint  [new]
Andrew Max
Member

Откуда:
Сообщений: 1045
TRust
...
Declare
  Cursor C is Select Notes from T1;
  A Varchar2(4000);
begin
  Update T1 set Notes=Ascii(Notes);
  open C;
  loop
    fetch C into A;
    Exit when C%notfound;
    DBMS_OUTPUT.put_line(A);
    rollback;
  end loop;
  close C;
end;
53
ORA-01002: fetch out of sequence
ORA-06512: at line 9

Ну и где хвалёная целостность чтения? Я ожидаю, как и в первом случае, что курсор вернёт состояние таблицы на момент открытия курсора!
...

Сорри, что встреваю, но это невозможно.

Курсор был открыт после того, как наш сеанс выполнил ряд изменений таблицы T1. Разумеется, курсор должен "видеть" эти изменения.

Затем происходит откат. Давайте представим, что к этому моменту ни один из грязных блоков таблицы T1 не был сброшен на диск. Откат вернет все грязные блоки в буферном кэше в прежнее состояние. То есть ни в памяти, ни на диске измененных данных теперь нет. И как же теперь прикажете выполнять "согласованное" чтение?
27 сен 07, 10:57    [4722326]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01002 при попытке отката к несуществующему Savepoint  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18363
TRust
Всё таки Documentation bug?

Не все случаи жизни возможно явно перечислить в документации.
Поведение вполне логично, если руководствоваться не одной-единственной цитатой, но держать в уме concepts (например, раздельчик "Data Concurrency and Consistency" очень прочищает мозг. Но и им одним тоже ограничиваться не стоит.).
27 сен 07, 11:01    [4722377]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01002 при попытке отката к несуществующему Savepoint  [new]
TRust
Member

Откуда: из самоизоляции
Сообщений: 286
Спасибо за "прочищение мозга"
27 сен 07, 11:18    [4722559]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01002 при попытке отката к несуществующему Savepoint  [new]
Stax..
Guest
andrey_anonymous
TRust
Всё таки Documentation bug?

Не все случаи жизни возможно явно перечислить в документации.
Поведение вполне логично, если руководствоваться не одной-единственной цитатой, но держать в уме concepts (например, раздельчик "Data Concurrency and Consistency" очень прочищает мозг. Но и им одним тоже ограничиваться не стоит.).

имхо, подчеркиваю, имхо

Если точки отката нет, слетать НЕ ДОЛЖНО, мы ведь ничего не откатывали

МЫ НЕ ВЕРНУЛИСЬ В ПРОШЛОЕ, ПОПЫТКА НЕУДАЧНА, ОСТАЛИСЬ В НАСТОЯЩЕМ!

имхо БАГ обработки Rollback to в случае ОШИБКИ
ведь НИ ОДИН блок не поменялся (не востановился), фетчить можно

ЗЫ
вообще считаю что в оракля ORA-01002 реализовано за сильно

слетать надо тогда когда НЕВОЗМОЖНО востановить,
по аналогии с 1555, только в случае если нарвались на невостановимый блок
таблица Б не менялась с нее мона запросто фетчить, зачем слетать

имхо это лишнее

.....
stax
27 сен 07, 16:13    [4725457]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01002 при попытке отката к несуществующему Savepoint  [new]
Ааз
Member

Откуда: Москва/Протвино
Сообщений: 4274
Stax..
МЫ НЕ ВЕРНУЛИСЬ В ПРОШЛОЕ, ПОПЫТКА НЕУДАЧНА, ОСТАЛИСЬ В НАСТОЯЩЕМ!
Неудачный откат отката... Типо. Согласен, что возможны варианты.

Однако в силу имеющихся алгоритмов (откат начался, переменные в PGA/SGA(?) переустановлены, блоки поменяны...) имеем то, что имеем. Хотя, ебстейственно, хотелось бы более формального определения подобной ситуёвины и однозначного определения последствий.

Всего
27 сен 07, 16:51    [4725861]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01002 при попытке отката к несуществующему Savepoint  [new]
TRust
Member

Откуда: из самоизоляции
Сообщений: 286
Stax..

Если точки отката нет, слетать НЕ ДОЛЖНО, мы ведь ничего не откатывали

Халявят.
Путём экспериментов выяснилось, что ошибки не возникает если сеанс не находится в состоянии открытой транзакции (1).

Но если
1. Есть транзакция
2. Открыт курсор
3. Успешно прошёл откат к точке до открытия курсора
то попытка получить очередную строку из курсора приведёт к ORA-01002, независимо от того, что откатывается и откатывается ли вообще.
27 сен 07, 16:55    [4725907]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01002 при попытке отката к несуществующему Savepoint  [new]
Stax..
Guest
Ааз
Stax..
МЫ НЕ ВЕРНУЛИСЬ В ПРОШЛОЕ, ПОПЫТКА НЕУДАЧНА, ОСТАЛИСЬ В НАСТОЯЩЕМ!
Неудачный откат отката... Типо. Согласен, что возможны варианты.

Однако в силу имеющихся алгоритмов (откат начался, переменные в PGA/SGA(?) переустановлены, блоки поменяны...) имеем то, что имеем. Хотя, ебстейственно, хотелось бы более формального определения подобной ситуёвины и однозначного определения последствий.

Всего

имхо откат тоже должен быть "транзакционный"
начало "минитранзакции"
откат начался
переменные в PGA/SGA
еще чтото
успех - миникомміт
не успех - откат кухни ролбека
.....
stax
27 сен 07, 17:11    [4726088]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01002 при попытке отката к несуществующему Savepoint  [new]
stax..
Guest
TRust
Stax..

Если точки отката нет, слетать НЕ ДОЛЖНО, мы ведь ничего не откатывали

Халявят.
Путём экспериментов выяснилось, что ошибки не возникает если сеанс не находится в состоянии открытой транзакции (1).

Но если
1. Есть транзакция
2. Открыт курсор
3. Успешно прошёл откат к точке до открытия курсора
то попытка получить очередную строку из курсора приведёт к ORA-01002, независимо от того, что откатывается и откатывается ли вообще.

был тут как-то разговор когда ж "открытая" транзакция есть

даже если есть открытая транзакция,
то не будет слетать если ролбек ничего "не востанавливал"
оракля как-то понимает что ничего не откатывалось (типа холостой ход)

Declare
  Type TCur is Ref cursor;
  Cur TCur;
  N Number;
  NO_SAVEPOINT EXCEPTION;
  PRAGMA EXCEPTION_INIT (NO_SAVEPOINT, -01086);
begin
  select 1 into N from Table_A where RowNum=1 For Update nowait; -- (1)
  Savepoint AA; -- (2)
  select 1 into N from Table_A where RowNum=1 For Update nowait; -- (1)
  open Cur for 'Select 1 from Table_B'; -- (4)
  Savepoint BB; -- (2a)
  select 1 into N from Table_A where RowNum=1; -- (1)
  fetch Cur into N; -- (5)
  begin
    Rollback to BB; -- (6)
  null;
  Exception
    When NO_SAVEPOINT then Null;
  end;
  fetch Cur into N; -- (7)
  dbms_output.put_line(n);
  Close Cur;
end;
SQL> /
1

PL/SQL procedure successfully completed.



и поетому я считаю что в случае несуществующей точки отката фетч не должен слетать

зы
видно оряклю тяжело (или ленятся) отслежить Rollback to
он даже блокировку не снимает (не отпускает ждущую сессию),
а ето для меня более существенно

мож в оракла Rollback to неважный оператор
(подразумывается что скоро будет коміт/роллбек)
вот и не заморачіиваются в реализации
...
stax
27 сен 07, 17:34    [4726304]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01002 при попытке отката к несуществующему Savepoint  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18363
stax..
он даже блокировку не снимает (не отпускает ждущую сессию),
а ето для меня более существенно

Блокировку снимает. Уже ждущая сессия, правда, этого не видит, зато если после rollback to savepoint запустить конкурента, то он со спокойной совестью блокировку захватит.
27 сен 07, 17:41    [4726375]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01002 при попытке отката к несуществующему Savepoint  [new]
stax..
Guest
andrey_anonymous
stax..
он даже блокировку не снимает (не отпускает ждущую сессию),
а ето для меня более существенно

Блокировку снимает. Уже ждущая сессия, правда, этого не видит, зато если после rollback to savepoint запустить конкурента, то он со спокойной совестью блокировку захватит.

неправильно выразился,
именно
"Уже ждущая сессия, правда, этого не видит"

блокировка "снята"!, но сессия ждет
.....
stax
27 сен 07, 17:58    [4726513]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01002 при попытке отката к несуществующему Savepoint  [new]
Дубовая голова
Member [заблокирован]

Откуда: с цепи сорвался
Сообщений: 1821
stax..

блокировка "снята"!, но сессия ждет
.....
stax


А почему "снята" в кавычках ? Она реально снята, т.е. соответствующий флаг блокировки
не указывает на запись в ITL. Что и позволяет следующей сессии блокировать ресурс.
27 сен 07, 18:40    [4726727]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4 5   вперед  Ctrl      все
Все форумы / Oracle Ответить