Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Ошибка DBMS_METADATA.PUT при создании AQ_QUEUE_TABLE  [new]
Михаил Конопко
Member

Откуда: Москва
Сообщений: 9
Добрый всем день!

dbms_metadata.put формирует анонимный блок, который затем запускает для формирования (например) AQ объектов. При этом, функция dbms_metadata.put забывает добавить знак ;. В результате выполнение анонимного блока падает. Например:

declare
p_clob clob;
h2 NUMBER;
th1 NUMBER;
result BOOLEAN;
errs sys.ku$_SubmitResults := sys.ku$_SubmitResults();
err sys.ku$_SubmitResult;
i integer;
begin
---- create AQ table -----------------
dbms_aqadm.create_queue_table( queue_table => 'AQ_ABC_TABLE', queue_payload_type => 'RAW', multiple_consumers => TRUE );
---- get ddl for creating AQ table ------
p_clob := dbms_metadata.get_xml( object_type => 'AQ_QUEUE_TABLE', name => 'AQ_ABC_TABLE');
---- drop AQ table ------
dbms_aqadm.drop_queue_table( 'AQ_ABC_TABLE' );


---- try re-create table from ddl -----------------
h2 := DBMS_METADATA.OPENW('AQ_QUEUE_TABLE');
th1 := DBMS_METADATA.ADD_TRANSFORM(h2,'DDL');
DBMS_METADATA.SET_TRANSFORM_PARAM( th1,'SQLTERMINATOR',TRUE, 'AQ_QUEUE_TABLE');

-- Call PUT to re-create the object.
result := DBMS_METADATA.PUT(h2,p_clob,0,errs); --- FAIL!!! because DBMS_METADATA.PUT dont add ;
DBMS_METADATA.CLOSE(h2);
IF NOT result THEN
-- Process the error information.
FOR i IN errs.FIRST..errs.LAST LOOP
err := errs(i);
dbms_output.put_line( 'FAIL!!! because DBMS_METADATA.PUT does not add ;' );
dbms_output.put_line( ' --------------------------------- ;' );
dbms_output.put_line( err.ddl.ddltext );
dbms_output.put_line( ' --------------------------------- ;' );
if err is not null and err.errorLines is not null then
FOR j IN err.errorLines.FIRST..err.errorLines.LAST LOOP
dbms_output.put_line( err.errorLines(j).errorText);
END LOOP;
end if;
END LOOP;
END IF;
end;


Результат примерно такой...

FAIL!!! because DBMS_METADATA.PUT does not add ;
--------------------------------- ;
BEGIN DBMS_AQADM.CREATE_QUEUE_TABLE(
Queue_table => 'user.AQ_ABC_TABLE',
Queue_payload_type => 'RAW',
storage_clause => 'PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 TABLESPACE FRS',
Sort_list => 'ENQ_TIME',
Multiple_consumers => TRUE,
Compatible => '8.1.3')
END


--------------------------------- ;
ORA-06550: Строка 8, столбец 3:
PLS-00103: Встретился символ "END" в то время как ожидалось одно из следующих:

:= . ( % ;



Для запуска надо дать права
grant aq_administrator_role to user;
grant execute on SYS.dbms_metadata to user;
Версия ORACLE 10.2.0.3.

Может ли кто-нибудь подсказать - как заставить dbms_metadata.put добавить знак ; ?
19 май 10, 18:28    [8802619]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка DBMS_METADATA.PUT при создании AQ_QUEUE_TABLE  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
Михаил Конопко
Добрый всем день!

dbms_metadata.put формирует анонимный блок, который затем запускает для формирования (например) AQ объектов. При этом, функция dbms_metadata.put забывает добавить знак ;. В результате выполнение анонимного блока падает. Например:
declare
  p_clob clob;
  h2 NUMBER; 
  th1 NUMBER; 
  result BOOLEAN;
  errs sys.ku$_SubmitResults := sys.ku$_SubmitResults();
  err sys.ku$_SubmitResult;
  i integer;
begin
    ---- create AQ table -----------------
    dbms_aqadm.create_queue_table( queue_table => 'AQ_ABC_TABLE', queue_payload_type => 'RAW',     multiple_consumers => TRUE ); 
    ---- get ddl for creating AQ table ------
    p_clob := dbms_metadata.get_xml( object_type => 'AQ_QUEUE_TABLE', name => 'AQ_ABC_TABLE');
    ---- drop AQ table ------
    dbms_aqadm.drop_queue_table( 'AQ_ABC_TABLE' );


    ---- try re-create table from ddl -----------------
        h2 := DBMS_METADATA.OPENW('AQ_QUEUE_TABLE');
        th1 := DBMS_METADATA.ADD_TRANSFORM(h2,'DDL');
        DBMS_METADATA.SET_TRANSFORM_PARAM( th1,'SQLTERMINATOR',TRUE, 'AQ_QUEUE_TABLE');

        -- Call PUT to re-create the object.
        result := DBMS_METADATA.PUT(h2,p_clob,0,errs);   --- FAIL!!! because DBMS_METADATA.PUT dont add ; 
        DBMS_METADATA.CLOSE(h2);
        IF NOT result THEN
          -- Process the error information.
          FOR i IN errs.FIRST..errs.LAST LOOP
            err := errs(i);
            dbms_output.put_line( 'FAIL!!! because DBMS_METADATA.PUT does not add ;' );            
            dbms_output.put_line( ' --------------------------------- ;' );                                    
            dbms_output.put_line( err.ddl.ddltext );
            dbms_output.put_line( ' --------------------------------- ;' );                        
            if err is not null and err.errorLines is not null then
              FOR j IN err.errorLines.FIRST..err.errorLines.LAST LOOP
                dbms_output.put_line( err.errorLines(j).errorText);
              END LOOP;
            end if;
          END LOOP;
        END IF;
end;    

Результат примерно такой...
FAIL!!! because DBMS_METADATA.PUT does not add ;
 --------------------------------- ;
 BEGIN DBMS_AQADM.CREATE_QUEUE_TABLE(
     Queue_table        => 'user.AQ_ABC_TABLE',
     Queue_payload_type => 'RAW',
     storage_clause     => 'PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 TABLESPACE FRS',
     Sort_list          => 'ENQ_TIME',
     Multiple_consumers =>  TRUE,
     Compatible         => '8.1.3')
  END

 
 --------------------------------- ;
ORA-06550: Строка 8, столбец 3:
PLS-00103: Встретился символ "END" в то время как ожидалось одно из следующих:

   := . ( % ;

Для запуска надо дать права
grant aq_administrator_role to user;
grant execute on SYS.dbms_metadata to user; 
Версия ORACLE 10.2.0.3.

Может ли кто-нибудь подсказать - как заставить dbms_metadata.put добавить знак ; ?

При оформлении кода используйте, пожалуйста, тег SRC данного форума.
Этим вы повысите свои шансы на получение ответа.
19 май 10, 18:50    [8802693]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить