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

Откуда: Moscow
Сообщений: 29
Пытаюсь извлечь метадату схемы и изменить имя владельца уже на этапе извлечения
(пример сляпан по мотивам доки Oracle® Database Utilities 10g Release 2 (10.2))

select * from v$version;

-- Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
create table my_metadata (object_type varchar2(100),object_name varchar2(100),md clob);

CREATE OR REPLACE PROCEDURE get_schema_md
AUTHID CURRENT_USER
IS
 i_from_user   VARCHAR2 (30)        := 'TEST_USER';
   -- Define local variables.
   l_h           NUMBER;                                                                   -- handle returned by 'OPEN'
   l_th          NUMBER;                                                          -- handle returned by 'ADD_TRANSFORM'
   l_doc         SYS.ku$_ddls;                                                 -- metadata is returned in sys.ku$_ddls,
   --  a nested table of sys.ku$_ddl objects
   l_ddl         CLOB;                                                                    -- creation DDL for an object
   l_pi          SYS.ku$_parsed_items;                                       -- parse items are returned in this object
   -- which is contained in sys.ku$_ddl
   l_objname     VARCHAR2 (30);                                                               -- the parsed object name
   l_objtype     VARCHAR2 (30);                                                               -- the parsed object type
BEGIN
   -- Specify the object type.
   l_h     := DBMS_METADATA.OPEN ('SCHEMA_EXPORT');
   -- Use filters to specify the schema.
   DBMS_METADATA.set_filter (l_h, 'SCHEMA', i_from_user);
   DBMS_METADATA.set_filter (l_h, 'INCLUDE_USER', TRUE);
   --''PROCACT_SCHEMA''
   DBMS_METADATA.set_filter (l_h, 'EXCLUDE_PATH_EXPR', '=''PROCACT_SCHEMA''');
-- Request that the schema name be modified.
   l_th    := DBMS_METADATA.add_transform (l_h, 'MODIFY');
   DBMS_METADATA.set_remap_param (l_th, 'REMAP_SCHEMA', i_from_user, i_to_user);
   
   -- Request that the table name be returned as a parse item.
   DBMS_METADATA.set_parse_item (l_h, 'NAME');
   DBMS_METADATA.set_parse_item (l_h, 'OBJECT_TYPE');
   -- Request that the metadata be transformed into creation DDL.
   l_th    := DBMS_METADATA.add_transform (l_h, 'DDL');
   LOOP
      l_doc    := DBMS_METADATA.fetch_ddl (l_h);
      -- When there are no more objects to be retrieved, FETCH_DDL returns NULL.
      EXIT WHEN l_doc IS NULL;

      -- Loop through the rows of the ku$_ddls nested table.
      IF l_doc.COUNT > 0
      THEN
         FOR i IN l_doc.FIRST .. l_doc.FIRST
         LOOP
            l_ddl    := l_doc (i).ddltext;
            l_pi     := l_doc (i).parseditems;

            -- Loop through the returned parse items.
            IF     l_pi IS NOT NULL
               AND l_pi.COUNT > 0
            THEN
               FOR j IN l_pi.FIRST .. l_pi.LAST
               LOOP
                  IF l_pi (j).item = 'NAME'
                  THEN
                     l_objname    := l_pi (j).VALUE;
                  END IF;

                  IF l_pi (j).item = 'OBJECT_TYPE'
                  THEN
                     l_objtype    := l_pi (j).VALUE;
                  END IF;
               END LOOP;
            END IF;

--    Insert information about this object into our table.
            INSERT INTO my_metadata
                        (object_type, object_name, md
                        )
                 VALUES (l_objtype, l_objname, l_ddl
                        );

            COMMIT;
         END LOOP;
      END IF;
   END LOOP;

   -- Release resources.
   DBMS_METADATA.CLOSE (l_h);
END;
/


Результат выполнения:

ORA-31604: invalid NAME parameter "MODIFY" for object type PROCACT_SCHEMA in function ADD_TRANSFORM
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 116
ORA-06512: at "SYS.DBMS_METADATA_INT", line 7838
ORA-06512: at "SYS.DBMS_METADATA_INT", line 8066
ORA-06512: at "SYS.DBMS_METADATA_INT", line 8844
ORA-06512: at "SYS.DBMS_METADATA_INT", line 8872
ORA-06512: at "SYS.DBMS_METADATA_INT", line 8872
ORA-06512: at "SYS.DBMS_METADATA", line 3290
ORA-06512: at "DEVDBA.GET_SCHEMA_MD", line 47
ORA-06512: at line 2

Обратите внимание, что PROCACT_SCHEMA принудительно исключен при помощи фильтра.
Пытаюсь добавить MODIFY по конкретным типам обьектов (например

l_th    := DBMS_METADATA.add_transform (l_h, 'MODIFY','TABLE');

- результат тот же
При этом сама PROCACT_SCHEMA выглядит следующим образом :
select MD from my_metadata where object_type = 'PROCACT_SCHEMA'
MD                                                                              
--------------------------------------------------------------------------------
                                                                                
BEGIN                                                                           
sys.dbms_logrep_imp.instantiate_schema(schema_name=>SYS_CONTEXT('USERENV','CURRE
NT_SCHEMA'), export_db_name=>'XXXX', inst_scn=>'7964665165594');            
COMMIT;                                                                         
END;                                                                            
                                                                                
                                                                                
                                                                                
                                                                                
BEGIN                                                                           
                                                                                
COMMIT;                                                                         
END;                                                                            
                                                                                
                                                                                
                                                                                
                                                                                
BEGIN                                                                           
sys.dbms_logrep_imp.instantiate_schema(schema_name=>SYS_CONTEXT('USERENV','CURRE
NT_SCHEMA'), export_db_name=>'XXXX', inst_scn=>'7966156512308');            

MD                                                                              
--------------------------------------------------------------------------------
COMMIT;                                                                         
END;                                                                            
                                                                                
                                                                                
                                                                                
                                                                                
BEGIN                                                                           
                                                                                
COMMIT;                                                                         
END;                                                                            
                                                                                
                                                                                
                                                                                


4 rows selected.

Зачем она вообще туда суется? и почему не фильтруется? На металинке есть по этому поводу непофиксеный баг 4998712 в котором написано

Diagnostic Notes

~~~~~~~~~~~~~~~~

I am not sure if it is valid to add a modify transform to

EXPORT_SCHEMA or not so passing over.

А как тогда правильно?

-----------------------------------------------------------
"We've heard that a million monkeys at a million keyboards could produce the complete works of Shakespeare; now, thanks to the Internet, we know that is not true."
6 фев 07, 18:50    [3746681]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_METADATA не желает подчиняться  [new]
santa clause
Member

Откуда: Moscow
Сообщений: 29
Во время копирования этого примера слега искорежил и забыл обьявление

i_to_user   VARCHAR2 (30)        := 'TEST_USER2';

-----------------------------------------------------------
"We've heard that a million monkeys at a million keyboards could produce the complete works of Shakespeare; now, thanks to the Internet, we know that is not true."
6 фев 07, 19:13    [3746777]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_METADATA не желает подчиняться  [new]
santa clause
Member

Откуда: Moscow
Сообщений: 29
Проблему номер 1 обошел, теперь напоролся на следующую:

DECLARE
l_hw NUMBER;
l_clob CLOB := empty_clob;
l_pi SYS.ku$_parsed_items;
l_vc VARCHAR2 (1000);
BEGIN
l_hw := DBMS_METADATA.OPEN ('TABLE');
DBMS_METADATA.set_filter (l_hw, 'SCHEMA',user);

LOOP
DBMS_METADATA.fetch_xml_clob (l_hw, l_clob, l_pi, l_vc);
EXIT WHEN l_clob IS NULL;
NULL;
END LOOP;
END;

ORA-22275: invalid LOB locator specified
ORA-06512: at "SYS.DBMS_METADATA", line 1546
ORA-06512: at "SYS.DBMS_METADATA", line 1583
ORA-06512: at "SYS.DBMS_METADATA", line 1891
ORA-06512: at "SYS.DBMS_METADATA", line 4224
ORA-06512: at "SYS.DBMS_METADATA", line 4251
ORA-06512: at line 11

То есть DBMS_METADATA.fetch_xml_clob вообще не желает работать ни при каком раскладе. А по некоторым причинам его очень желательно использовать...

Никто на этом форуме не пытался сделать преобразование схемы при помощи dbms_metadata и xml?


-----------------------------------------------------------
"We've heard that a million monkeys at a million keyboards could produce the complete works of Shakespeare; now, thanks to the Internet, we know that is not true."
20 фев 07, 17:47    [3812162]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_METADATA не желает подчиняться  [new]
ГостЪ
Guest
Андрей, зато fetch_xml работает:)
20 фев 07, 18:09    [3812308]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_METADATA не желает подчиняться  [new]
santa clause
Member

Откуда: Moscow
Сообщений: 29
автор
Андрей, зато fetch_xml работает:)


Я знаю но все очень сложно -)

c fetch_xml такая штука что нельзя установить при этом parsed_items, а мне нужно узнавать тип обьекта. можно конечно узнавать тип из самого xml, но он будет не такой (например role_grant там называется ROGRANT_T). Делал так - открывал два handle, одно xml другое ddl. в том которое ddl парсил тип обьекта. Но есть такая засада, что

дока
If FETCH_XML_CLOB is called, an object type name from Table 57-11 is returned.
If FETCH_DDL is called and the ddlText is a SQL DDL statement whose verb is CREATE or ALTER, the object type as used in the DDL statement is returned (for example, TABLE, PACKAGE_BODY, and so on). Otherwise, an object type name from Table 57-11 is returned.


То есть для alter table add constraint при fetch ddl эта собака парсит тип table, и при обратном преобразовании из xml в ddl получается чушь. Думал может FETCH_XML_CLOB спасет отца русской демократии ...

Вообще в этом пакете есть огромное количество неочевидных вещей и невнятных ошибок, например:

dbms_metadata.OPENW('SCHEMA_EXTRACT') приводит к абсолютно невнятной ошибке. Нигде в доке не заметил что так делать нельзя.

-----------------------------------------------------------
"We've heard that a million monkeys at a million keyboards could produce the complete works of Shakespeare; now, thanks to the Internet, we know that is not true."
20 фев 07, 18:30    [3812445]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_METADATA не желает подчиняться  [new]
ГостЪ
Guest
Дейстительно всё очень сложно:)

С такими пакетами, которые мало кому нужно вечно такая история: на свет он появляется ацкой глюкавостью и тихо сводит с ума тех кому с ним приходится работать:)

P.S. с dbms_metadata я к счастью не работал:)
20 фев 07, 18:56    [3812579]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить