Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 ошибка ORA-30512  [new]
GrandMaster
Member

Откуда:
Сообщений: 147
При выполнении в тригере PL SQL кода
  execute immediate 'drop table t';  
  execute immediate 'create global temporary table t preserve rows as select * from main where 0=1';     

выдает ошибку ORA-30512, как обойти?
27 май 06, 20:53    [2713534]     Ответить | Цитировать Сообщить модератору
 Re: ошибка ORA-30512  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18363
GrandMaster
При выполнении в тригере PL SQL кода
  execute immediate 'drop table t';  
  execute immediate 'create global temporary table t preserve rows as select * from main where 0=1';     
выдает ошибку ORA-30512, как обойти?

Ознакомиться с FAQ и убрать этот код вообще.
27 май 06, 21:11    [2713570]     Ответить | Цитировать Сообщить модератору
 Re: ошибка ORA-30512  [new]
GrandMaster
Member

Откуда:
Сообщений: 147
Там совсем другой случай рассмотрен.
Сами по себе обе команды в SQL у меня выполняеться
drop table;  
execute immediate 'create global temporary table t preserve rows as select * from main where 0=1;

в PL SQL уже нет.
27 май 06, 21:35    [2713601]     Ответить | Цитировать Сообщить модератору
 Re: ошибка ORA-30512  [new]
GrandMaster
Member

Откуда:
Сообщений: 147
Там совсем другой случай рассмотрен.
Сами по себе обе команды в SQL у меня выполняеться
drop table;  
create global temporary table t preserve rows as select * from main where 0=1;

в PL SQL уже нет.
27 май 06, 21:36    [2713604]     Ответить | Цитировать Сообщить модератору
 Re: ошибка ORA-30512  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18363
GrandMaster
Там совсем другой случай рассмотрен.

Никакой не "другой". Ваш собственный.
Пересоздавать временную таблицу из пакета - неправильно.
Ошибку побороть можно, но проблема не в ней.
27 май 06, 21:41    [2713606]     Ответить | Цитировать Сообщить модератору
 Re: ошибка ORA-30512  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116217
Этот сабж - это вообще какое то сборище нелепостей.
Во первых, всецело поддерживаю andrey_anonymous. Это совершенно недопустимый дизайн в Oracle. Все таблицы необходимо создавать на стадии проектирования, а не в runtime. Это не MS SQL.
Но это так сказать вещи идеологические.

GrandMaster

Сами по себе обе команды в SQL у меня выполняеться
drop table t ; 
execute immediate 'create global temporary table t preserve rows as select * from main where 0=1;


Позвольте не поверить . В create table синтаксическая ошибка.
Ознакомьтесь внимательно с синтаксической диаграммой

CREATE TEMPORARY TABLE

А если исправите эту ошибку, то в триггере немедленно возникнет новая ошибка

ORA-04092: cannot COMMIT in a trigger

Откуда берется ORA-30512 я не понимаю.
Вы что , Queue Table используете ?

В общем положите временную таблицу заранее, исправив ошибки , уберите триггер и забудьте об этом , как о страшном сне :)
28 май 06, 00:02    [2713762]     Ответить | Цитировать Сообщить модератору
 Re: ошибка ORA-30512  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18363
dmidek
А если исправите эту ошибку, то в триггере немедленно возникнет новая ошибка
ORA-04092: cannot COMMIT in a trigger
Откуда берется ORA-30512 я не понимаю.

Oracle9i Database Error Messages
ORA-30512 cannot modify string.string more than once in a transaction
This error is usually caused by a DDL statement that fires a system trigger that tries to modify the same object
Action: Do not create system triggers that might modify an already modified object...
28 май 06, 00:34    [2713777]     Ответить | Цитировать Сообщить модератору
 Re: ошибка ORA-30512  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116217
andrey_anonymous
dmidek
А если исправите эту ошибку, то в триггере немедленно возникнет новая ошибка
ORA-04092: cannot COMMIT in a trigger
Откуда берется ORA-30512 я не понимаю.

Oracle9i Database Error Messages
ORA-30512 cannot modify string.string more than once in a transaction
This error is usually caused by a DDL statement that fires a system trigger that tries to modify the same object
Action: Do not create system triggers that might modify an already modified object...


Я тоже прочел сообщение об ошибке.
И где это все у автора ?
28 май 06, 00:42    [2713779]     Ответить | Цитировать Сообщить модератору
 Re: ошибка ORA-30512  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18363
автор
Я тоже прочел сообщение об ошибке.
И где это все у автора ?

Читаем:
GrandMaster
При выполнении в тригере

В триггере...
GrandMaster
execute immediate 'drop table t';

DDL...
GrandMaster
выдает ошибку ORA-30512

... а не ORA-04092

Следовательно - Queue tables ни при чем, речь о системном триггере.
28 май 06, 00:49    [2713781]     Ответить | Цитировать Сообщить модератору
 Re: ошибка ORA-30512  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18363
2GrangMaser: Вы задачу опишите.
Одну я с грехом пополам придумал (обеспечить идентичность структур t и main в случае изменения последней), но ИМХО средство выбрано не самое удачное.
28 май 06, 00:55    [2713785]     Ответить | Цитировать Сообщить модератору
 Re: ошибка ORA-30512  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18363
Вот:
Connected to Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 
Connected as andrey

Procedure created
No errors for PROCEDURE ANDREY.REMOVE_GTT

Procedure created
No errors for PROCEDURE ANDREY.BUILD_GTT

Trigger created
No errors for TRIGGER ANDREY.ON_DDL

SQL> create table test_table(a number);

Table created

SQL> select * from test_table_gtt;

 A
--

SQL> alter table test_table add (b varchar2(100));

Table altered

SQL> select * from test_table_gtt;

 A B
-- --------------------------------------------------------------------------------

SQL> drop table test_table purge;

Table dropped

SQL> select * from test_table_gtt;

select * from test_table_gtt

ORA-00942: table or view does not exist

SQL> 
Вроде бы все пучком, НО:

-- session1
SQL> create table test_table(a number);

Table created

-- session2:
SQL> insert into test_table_gtt values(1);

1 row inserted

SQL> rollback;

Rollback complete

SQL> -- Мы ЗАВЕРШИЛИ все транзакции, завязанные на GTT
-- session1
SQL> alter table test_table add (b varchar2(100));

alter table test_table add (b varchar2(100))

ORA-00604: error occurred at recursive SQL level 1
ORA-14452: attempt to create, alter or drop an index on temporary table already in use
ORA-06512: at "ANDREY.REMOVE_GTT", line 6
ORA-06512: at "ANDREY.BUILD_GTT", line 4
ORA-06512: at line 10

SQL> 

Если это Вас не пугает (а зря), то вот вам тексты:
create or replace procedure remove_gtt(obj_name varchar2) is
  pragma autonomous_transaction;
  does_not_exists exception;
  pragma exception_init(does_not_exists,-942);
begin
  execute immediate 'drop table '||obj_name||'_GTT purge';
  commit; -- иначе получим ORA-06519
exception 
  when does_not_exists then null;
end;
/
sho err
create or replace procedure build_gtt(obj_name varchar2) is
  pragma autonomous_transaction;
begin
  remove_gtt(obj_name);
  execute immediate 'create global temporary table '||obj_name||'_GTT on commit preserve rows as select * from '||obj_name||' where 1=0';
  commit;-- иначе получим ORA-06519
end;
/
sho err
create trigger on_ddl
AFTER DDL ON SCHEMA
declare
  l_event varchar2(1000);
  l_objname varchar2(1000);
begin
  SELECT ora_sysevent, ora_dict_obj_name
  into l_event, l_objname
  from dual;
  if l_objname='TEST_TABLE' then
    if l_event in ('CREATE','ALTER') then
      build_gtt(l_objname);
    elsif l_event in ('DROP') then
      remove_gtt(l_objname);
    end if;
  end if;
end;
/
sho err
28 май 06, 01:32    [2713806]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить