powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / TRUNCATE TABLE - Error ORA-03111
20 сообщений из 20, страница 1 из 1
TRUNCATE TABLE - Error ORA-03111
    #40118631
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Подскажите, пожалуйста, почему возникает ошибка ORA-03111: Break received on communication channel для
Код: sql
1.
2.
3.
BEGIN 
execute immediate 'TRUNCATE TABLE TABLE_NAME';
END;


Использую библиотеку Oracle.ManagedDataAccess.dll ver: 4.122.1.0
...
Рейтинг: 0 / 0
TRUNCATE TABLE - Error ORA-03111
    #40118634
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что серверный процесс нештатно завершается.
Ищите в серверном логе ORA-600 или ORA-7445
...
Рейтинг: 0 / 0
TRUNCATE TABLE - Error ORA-03111
    #40118653
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,

Проблема оказалась в другом. Я неверно информировал. У меня там еще есть операторы после TRUNCATE.
Если после TRUNCATE поставить COMMIT, то ошибки нет.
Код: plsql
1.
2.
3.
4.
5.
BEGIN 
execute immediate 'TRUNCATE TABLE TABLE_NAME';
COMMIT;
...
END;
...
Рейтинг: 0 / 0
TRUNCATE TABLE - Error ORA-03111
    #40118699
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiW
andrey_anonymous,

Проблема оказалась в другом. Я неверно информировал. У меня там еще есть операторы после TRUNCATE.
Если после TRUNCATE поставить COMMIT, то ошибки нет.
Код: plsql
1.
2.
3.
4.
5.
BEGIN 
execute immediate 'TRUNCATE TABLE TABLE_NAME';
COMMIT;
...
END;


Очень странно это.
TRUNCATE предполагает автоматическое выполнение двух COMMIT'ов:
один перед выполнением TRUNCATE, а второй после выполнения TRUNCATE.
...
Рейтинг: 0 / 0
TRUNCATE TABLE - Error ORA-03111
    #40118711
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus

...
Очень странно это.
...


мож есть какие-то нюансы в связке execute immediate 'TRUNCATE и Oracle.ManagedDataAccess.dll

недавно меня удивил результат (допускаю что доку невнимательно понял)

апекс
Код: plsql
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.
declare
 v int;
 begin
  select count(*) into v from t1;
  dbms_output.put_line('before insert '||v);
--
  insert into t1 values(0,0);
  select count(*) into v from t1;
  dbms_output.put_line('after insert '||v);
--
  execute immediate 'CREATE PRIVATE TEMPORARY TABLE ORA$PTT_TEST_TBL AS SELECT  * FROM  EMP';
  execute immediate 'select count(*) from ORA$PTT_TEST_TBL' into v;
  dbms_output.put_line('PRIVATE TEMPORARY '||v);
--  execute immediate 'truncate table t2';
--
  select count(*) into v from t1;
  dbms_output.put_line('before rollback '||v);
--
  rollback;
  select count(*) into v from t1;
  dbms_output.put_line('after rollback '||v);
 end;

before insert 2
after insert 3
PRIVATE TEMPORARY 14
before rollback 3
after rollback 2

1 row(s) inserted.

0.05 seconds
...
Рейтинг: 0 / 0
TRUNCATE TABLE - Error ORA-03111
    #40118715
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
SQL*Plus

...
Очень странно это.
...


мож есть какие-то нюансы в связке execute immediate 'TRUNCATE и Oracle.ManagedDataAccess.dll

недавно меня удивил результат (допускаю что доку невнимательно понял)

апекс
Код: plsql
1.
2.
3.
1 row(s) inserted.

0.05 seconds


А это здесь откуда?

Под каким юзером создавали private temporary table?
RestrictionsYou must be a user other than SYS to create private temporary tables.
...
Рейтинг: 0 / 0
TRUNCATE TABLE - Error ORA-03111
    #40118718
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

я до высот 18й версии еще не дожил, но, заглянув сейчас в определение увидел, что поведение по умолчанию
для таких таблиц - ON COMMIT DROP DEFINITION;
Почти наверно, это однозначно означает, что для такого случая commit на create просто может и не возникать.
В нем не так уж много смысла проглядывается.
В этом предположении - показанное поведение выглядит как чистое.
Натурально, откатывается лишь одна запись, требующая логируемого отката. Остальные и так помрут.
...
Рейтинг: 0 / 0
TRUNCATE TABLE - Error ORA-03111
    #40118725
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
SQL*Plus

...
Очень странно это.
...


мож есть какие-то нюансы в связке execute immediate 'TRUNCATE и Oracle.ManagedDataAccess.dll

недавно меня удивил результат (допускаю что доку невнимательно понял)

апекс
Код: plsql
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.
declare
 v int;
 begin
  select count(*) into v from t1;
  dbms_output.put_line('before insert '||v);
--
  insert into t1 values(0,0);
  select count(*) into v from t1;
  dbms_output.put_line('after insert '||v);
--
  execute immediate 'CREATE PRIVATE TEMPORARY TABLE ORA$PTT_TEST_TBL AS SELECT  * FROM  EMP';
  execute immediate 'select count(*) from ORA$PTT_TEST_TBL' into v;
  dbms_output.put_line('PRIVATE TEMPORARY '||v);
--  execute immediate 'truncate table t2';
--
  select count(*) into v from t1;
  dbms_output.put_line('before rollback '||v);
--
  rollback;
  select count(*) into v from t1;
  dbms_output.put_line('after rollback '||v);
 end;

before insert 2
after insert 3
PRIVATE TEMPORARY 14
before rollback 3
after rollback 2

1 row(s) inserted.

0.05 seconds



Предполагаю, что что объяснение здесь:
PRIVATE TEMPORARYA private temporary table differs from a temporary table in that its definition and data
are visible only within the session that created it. Use the ON COMMIT clause to define
the scope of a private temporary table: either transaction or session. The ON COMMIT
clause used with the keywords DROP DEFINITION creates a transaction-specific table
whose data and definition are dropped when the transaction commits. This is the
default behavior. The ON COMMIT clause used with keywords PRESERVE DEFINITION
creates a session-specific table whose definition is preserved when the transaction
commits.
...
Рейтинг: 0 / 0
TRUNCATE TABLE - Error ORA-03111
    #40118726
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
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.
SQL> declare
  2   v int;
  3   begin
  4    select count(*) into v from t1;
  5    dbms_output.put_line('before insert '||v);
  6  --
  7    insert into t1 values(0,0);
  8    select count(*) into v from t1;
  9    dbms_output.put_line('after insert '||v);
 10  --
 11    execute immediate 
 12       'CREATE PRIVATE TEMPORARY TABLE ORA$PTT_TEST_TBL '
 13    || 'ON COMMIT DROP DEFINITION '
 14    || 'AS SELECT * FROM DUAL CONNECT BY LEVEL <= 21';
 15    execute immediate 'select count(*) from ORA$PTT_TEST_TBL' into v;
 16    dbms_output.put_line('PRIVATE TEMPORARY '||v);
 17  --  execute immediate 'truncate table t2';
 18  --
 19    select count(*) into v from t1;
 20    dbms_output.put_line('before rollback '||v);
 21  --
 22    rollback;
 23    select count(*) into v from t1;
 24    dbms_output.put_line('after rollback '||v);
 25   end;
 26  /
before insert 0
after insert 1
PRIVATE TEMPORARY 21
before rollback 1
after rollback 0

PL/SQL procedure successfully completed.

SQL> select count(*) from ORA$PTT_TEST_TBL;

Error starting at line : 36 in command -
select count(*) from ORA$PTT_TEST_TBL
Error at Command Line : 36 Column : 22
Error report -
 SQL Error: ORA-00942: таблица или представление пользователя не существует
00942. 00000 -  "table or view does not exist"

То есть определение таблицы было на уровне транзакции.
Транзакция завершилась командой ROLLBACK и PRIVATE TEMPORARY TABLE пропала.

Если использовать
Код: plaintext
ON COMMIT PRESERVE DEFINITION 
таблица определена для всей сессии и хранит данные в неё записанные.
Причем, не обращая внимания ни на какие ROLLBACK'и (!!!???) :
Код: plsql
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.
. . .
 10  --
 11    execute immediate 
 12       'CREATE PRIVATE TEMPORARY TABLE ORA$PTT_TEST_TBL '
 13    || 'ON COMMIT PRESERVE DEFINITION '
 14    || 'AS SELECT * FROM DUAL CONNECT BY LEVEL <= 21';
 15    execute immediate 'select count(*) from ORA$PTT_TEST_TBL' into v;
 16    dbms_output.put_line('PRIVATE TEMPORARY '||v);
 17  --  execute immediate 'truncate table t2';
 18  --
 19    select count(*) into v from t1;
 20    dbms_output.put_line('before rollback '||v);
 21  --
 22    rollback;
 23    select count(*) into v from t1;
 24    dbms_output.put_line('after rollback '||v);
 25   end;
 26  /
before insert 0
after insert 1
PRIVATE TEMPORARY 21
before rollback 1
after rollback 0

PL/SQL procedure successfully completed.

SQL> select count(*) from ORA$PTT_TEST_TBL;

  COUNT(*)
----------
        21
...
Рейтинг: 0 / 0
TRUNCATE TABLE - Error ORA-03111
    #40118847
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax
мож есть какие-то нюансы в связке execute immediate 'TRUNCATE и Oracle.ManagedDataAccess.dll
Думаю, Вы правы.
Если запускать в интерфейсе без COMMIT - ошибки нет.
...
Рейтинг: 0 / 0
TRUNCATE TABLE - Error ORA-03111
    #40118922
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiW,

а есть гарантия, что это именно в этом месте ошиька валится?
...
Рейтинг: 0 / 0
TRUNCATE TABLE - Error ORA-03111
    #40118937
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus

Причем, не обращая внимания ни на какие ROLLBACK'и (!!!???) :

И не должна, раз уж эта механика заранее задумывалась, как внетранзакционная.
Практический интерес может представлять выявление ответа на вопрос - а на нее реагирует dbms_transaction или нет.
Пустой или нет будет получен ответ от LOCAL_TRANSACTION_ID на создание такой таблицы.
Это может оказаться интересным для какого-то кода, касающегося работы в автономной транзакции.
Было бы совсем чисто, хотя и непривычно, если бы transaction_id такой штукой не формировался.

PS
Вариант полезного использования такой конструкции мне примерно понятен.
Что называется "нам бы ее лет 10 назад"...
:))
...
Рейтинг: 0 / 0
TRUNCATE TABLE - Error ORA-03111
    #40119059
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
SQL*Plus

Причем, не обращая внимания ни на какие ROLLBACK'и (!!!???) :

И не должна, раз уж эта механика заранее задумывалась, как внетранзакционная.
Практический интерес может представлять выявление ответа на вопрос - а на нее реагирует dbms_transaction или нет.
Пустой или нет будет получен ответ от LOCAL_TRANSACTION_ID на создание такой таблицы.
:))

А вы проведите эксперимент и расскажите, что получится.
...
Рейтинг: 0 / 0
TRUNCATE TABLE - Error ORA-03111
    #40119088
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx
а есть гарантия, что это именно в этом месте ошибка валится?
Теперь я ничего уже не понимаю :(
Вчера я не мог от этой ошибки избавиться, сегодня я не могу ее воспроизвести.
Все тоже самое делаю - работает.
...
Рейтинг: 0 / 0
TRUNCATE TABLE - Error ORA-03111
    #40119116
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
SQL*Plus

Причем, не обращая внимания ни на какие ROLLBACK'и (!!!???) :

И не должна, раз уж эта механика заранее задумывалась, как внетранзакционная.
Практический интерес может представлять выявление ответа на вопрос - а на нее реагирует dbms_transaction или нет.
Пустой или нет будет получен ответ от LOCAL_TRANSACTION_ID на создание такой таблицы.
Это может оказаться интересным для какого-то кода, касающегося работы в автономной транзакции.
Было бы совсем чисто, хотя и непривычно, если бы transaction_id такой штукой не формировался.

PS
Вариант полезного использования такой конструкции мне примерно понятен.
Что называется "нам бы ее лет 10 назад"...
:))

Братья, в смысле сестры! (С)
Опомнитесь :)

Rollback он везде Rollback и применительно к PRIVATE TEMPORARY TABLE ON COMMIT PRESERVE DEFINITION он работает так как и должен - откатывает транзакцию.
А у вас в примере откатывать нечего, там только CTAS, добавьте вставку в PRIVATE TEMPORARY TABLE и все у вас получится.
...
Рейтинг: 0 / 0
TRUNCATE TABLE - Error ORA-03111
    #40119139
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexFF__|

...Опомнитесь :)

Rollback он везде Rollback...


Интересно, какая "срочная потребность" вообще родила этот баян.
Кому-то надо помочь срочно перевести "большую систему" с MySql на Oracle Database?
Без пояснения смысла выглядит как чепуха, с неизвестно зачем приляпанным undo.

Быть похожим на "других" - не всегда предмет гордости, и особенно, когда перед использованием в лоб такой похожести,
ещё надо почесать затылок.

В общем, мутная история.
...
Рейтинг: 0 / 0
TRUNCATE TABLE - Error ORA-03111
    #40119343
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
AlexFF__|

...Опомнитесь :)

Rollback он везде Rollback...


Интересно, какая "срочная потребность" вообще родила этот баян.
Кому-то надо помочь срочно перевести "большую систему" с MySql на Oracle Database?
Без пояснения смысла выглядит как чепуха, с неизвестно зачем приляпанным undo.

Быть похожим на "других" - не всегда предмет гордости, и особенно, когда перед использованием в лоб такой похожести,
ещё надо почесать затылок.

В общем, мутная история.

Да, история мутная.

Создалась временная таблица, живущая только на время сессии.
Причем создалась как-то так, что вставленные в неё данные "заккомитились",
но на остальные транзакции этот COMMIT не повлиял.

Как будто команда CREATE PRIVATE TEMPORARY TABLE была выполнена в автономной транзакции.

Может быть её хранение в памяти такой отпечаток на её поведение накладывает?
Private temporary tablesPrivate temporary tables are temporary database objects that are automatically
dropped at the end of a transaction or a session. A private temporary table is
stored in memory
and is visible only to the session that created it.
...
Рейтинг: 0 / 0
TRUNCATE TABLE - Error ORA-03111
    #40119362
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus,

нет.
Это именно больше всего похоже на желание сделать временные таблицы, похожие на то, что существует в "других системах".
В этих "других системах" у таких временных таблиц может быть время жизни в пределах вызова хранимой процедуры,
или до конца сеанса, что указывается в их объявлении.
Обычно они внетранзакционны .
В целом, это всегда логический аналог массива, с которым работать предлагается исключительно методом применения команд sql.

Ясно, что там где совсем никаких транзакционных следов не предполагается, можно рассчитывать и верить в максимально
эффективную реализацию, по сравнению с историей, в которой такие массивы умеют откликаться на rollback.

С этим тоже можно жить, но, при таких обстоятельствах, я уже скорее предпочту явную, и более традиционную для Oracle
императивную манипуляцию с массивом, чем вот эту привносимую от "других систем" sql-декларативную.
Хотя точно знаю, где мог бы извлечь из этого пользу, хоть и ограничиваемую применением только динамического sql.
...
Рейтинг: 0 / 0
TRUNCATE TABLE - Error ORA-03111
    #40119374
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
SQL*Plus,

нет.
Это именно больше всего похоже на желание сделать временные таблицы, похожие на то, что существует в "других системах".
В этих "других системах" у таких временных таблиц может быть время жизни в пределах вызова хранимой процедуры,
или до конца сеанса, что указывается в их объявлении.
Обычно они внетранзакционны .

Не будем гадать, кто и чего хотел сделать на что-то похожим.
Это совершенно неинтересно.

Лучше проведем простой эксперимент.

Код: plsql
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.
SQL> CREATE PRIVATE TEMPORARY TABLE ora$ptt_test_tbl(
  2     n NUMBER
  3   , dt DATE)
  4  ON COMMIT PRESERVE DEFINITION
  5  ;
Private TEMPORARY created.

SQL> INSERT INTO ora$ptt_test_tbl(n, dt)
  2  SELECT LEVEL, SYSDATE FROM DUAL CONNECT BY LEVEL <= 2;
2 rows inserted.

SQL> COMMIT;
Commit complete.

SQL> SELECT * FROM ora$ptt_test_tbl;

         N DT                 
---------- -------------------
         1 12.12.2021 00:37:00
         2 12.12.2021 00:37:00

SQL> -- Временная задержка
SQL> WITH t AS (SELECT level AS n FROM dual CONNECT BY LEVEL <= 10000) SELECT COUNT(*) FROM t A, t B;

  COUNT(*)
----------
 100000000

SQL> INSERT INTO ora$ptt_test_tbl(n, dt)
  2  SELECT LEVEL+10, SYSDATE FROM DUAL CONNECT BY LEVEL <= 1;
1 row inserted.

SQL> SELECT * FROM ora$ptt_test_tbl;

         N DT                 
---------- -------------------
         1 12.12.2021 00:37:00
         2 12.12.2021 00:37:00
        11 12.12.2021 00:37:05

SQL> ROLLBACK;
Rollback complete.

SQL> SELECT * FROM ora$ptt_test_tbl;

         N DT                 
---------- -------------------
         1 12.12.2021 00:37:00
         2 12.12.2021 00:37:00


Откат был выполнен, третьей строки в таблице не стало.

То есть, не считая приведенного выше CREATE PRIVATE TEMPORARY TABLE ... AS SELECT ...,
видим, что поведение нормальное, транзакционное.
...
Рейтинг: 0 / 0
TRUNCATE TABLE - Error ORA-03111
    #40121759
jitik92263
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL*Plus,

интересно, спасибо всем
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / TRUNCATE TABLE - Error ORA-03111
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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