ORA-32462: невозможно использовать объект, измененный в текущей транзакции - PullRequest
1 голос
/ 30 марта 2020

Примечание: это в Oracle 18 c

В таблице temp1 происходит одна вставка, затем я вызываю одну из дочерних хранимых процедур сразу после этой инструкции вставки. В этой хранимой процедуре я создал PTT (PRIVATE TEMPORARY TABLE), в котором используется таблица «temp1», как показано ниже:

Insert into temp1(name, dept, date) values ('A','HR',sysdate);

CREATE PRIVATE TEMPORARY TABLE ora$pgtt
 as
 select dept from temp1 where dept ='HR' and name ='A';

Но я получаю сообщение об ошибке:

ORA -32462: нельзя использовать объект, измененный в текущей транзакции

Ответы [ 2 ]

3 голосов
/ 02 апреля 2020

Нельзя использовать таблицу внутри оператора CTAS, если эта таблица была изменена в текущей транзакции.

Вы можете следовать предложению, приведенному в описании ошибки:

32462, 0000, "невозможно использовать объект, измененный в текущей транзакции"
// * Причина: объект изменение в текущей транзакции было обнаружено при создании
// закрытой временной таблицы в памяти с использованием CREATE TABLE AS SELECT (CTAS).
// * Действие: После разделения оператора CTAS на CREATE TABLE INSERT SELECT .

create table temp1 (name varchar2 (32), dept varchar2 (4), hired date);
insert into temp1 values ('A', 'HR', sysdate);

create private temporary table ora$ptt_1 as
    select * from temp1 where dept ='HR' and name ='A';

Error report -
ORA-32462: cannot use an object modified in current transaction

На этом этапе обратите внимание, что в этом особом случае оператор CREATE PRIVATE TEMPORARY ... не выдает неявный COMMIT, как обычно делают все другие операторы DDL. Попробуйте в другом сеансе:

select * from temp1;

no rows selected

Вернуться к первому сеансу:

create private temporary table ora$ptt_1 (name varchar2 (32), dept varchar2 (4), hired date);

Private TEMPORARY created.

insert into ora$ptt_1 
    select * from temp1 where dept ='HR' and name ='A';

1 row inserted.
1 голос
/ 01 апреля 2020

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

SQL> create table temp1 ( name varchar2(10), dept varchar2(10), d date );

Table created.

SQL> Insert into temp1(name, dept, d) values ('A','HR',sysdate);

1 row created.

SQL>
SQL> CREATE PRIVATE TEMPORARY TABLE ORA$PTT_tab
  2   as
  3   select dept from temp1 where dept ='HR' and name ='A';
 select dept from temp1 where dept ='HR' and name ='A'
                  *
ERROR at line 3:
ORA-32462: cannot use an object modified in current transaction



SQL> Insert into temp1(name, dept, d) values ('A','HR',sysdate);

1 row created.

SQL> commit;

Commit complete.

SQL>
SQL> CREATE PRIVATE TEMPORARY TABLE ORA$PTT_tab as
  2  select dept from temp1 where dept ='HR' and name ='A';

Table created.
...