SQL> select * from v$version; BANNER ------------------------------------------------------------------------------ Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production PL/SQL Release 11.1.0.6.0 - Production CORE 11.1.0.6.0 Production TNS for 32-bit Windows: Version 11.1.0.6.0 - Production NLSRTL Version 11.1.0.6.0 - Production SQL> set long 10000000 SQL> set pages 5000 SQL> set lines 200 SQL> create table A 2 (id number(10)); Table created. SQL> create table B 2 (id number(15)); Table created. SQL> create table C 2 (id number(10), 3 extra varchar2(50)); Table created. SQL> select dbms_metadata.get_ddl('TABLE','A') from dual; DBMS_METADATA.GET_DDL('TABLE','A') ------------------------------------------------------------------------- CREATE TABLE "SYSTEM"."A" ( "ID" NUMBER(10,0) ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "SYSTEM" SQL> select dbms_metadata.get_ddl('TABLE','B') from dual; DBMS_METADATA.GET_DDL('TABLE','B') --------------------------------------------------------------------------- CREATE TABLE "SYSTEM"."B" ( "ID" NUMBER(15,0) ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "SYSTEM" SQL> select dbms_metadata.get_ddl('TABLE','C') from dual; DBMS_METADATA.GET_DDL('TABLE','C') ------------------------------------------------------------------------- CREATE TABLE "SYSTEM"."C" ( "ID" NUMBER(10,0), "EXTRA" VARCHAR2(50) ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "SYSTEM" TABLESPACE "SYSTEM" SQL> SELECT dbms_metadata.compare_alter('TABLE','A','B',USER,USER) from dual; DBMS_METADATA.COMPARE_ALTER('TABLE','A','B',USER,USER) ------------------------------------------------------------------------------ ALTER TABLE "SYSTEM"."A" MODIFY ("ID" NUMBER(15,0)) ALTER TABLE "SYSTEM"."A" RENAME TO "B" SQL> SELECT dbms_metadata.compare_alter('TABLE','A','C',USER,USER) from dual; DBMS_METADATA.COMPARE_ALTER('TABLE','A','C',USER,USER) ------------------------------------------------------------------------------- ALTER TABLE "SYSTEM"."A" ADD ("EXTRA" VARCHAR2(50)) ALTER TABLE "SYSTEM"."A" RENAME TO "C" SQL> SELECT dbms_metadata.compare_alter('TABLE','B','C',USER,USER) from dual; DBMS_METADATA.COMPARE_ALTER('TABLE','B','C',USER,USER) -------------------------------------------------------------------------------- ALTER TABLE "SYSTEM"."B" ADD ("EXTRA" VARCHAR2(50)) ALTER TABLE "SYSTEM"."B" MODIFY ("ID" NUMBER(10,0)) ALTER TABLE "SYSTEM"."B" RENAME TO "C" SQL> SELECT dbms_metadata.compare_alter_xml('TABLE','A','B',USER,USER) from dual; DBMS_METADATA.COMPARE_ALTER_XML('TABLE','A','B',USER,USER) --------------------------------------------------------------------------------------------- TABLE SYSTEM A SYSTEM B ALTER TABLE "SYSTEM"."A" MODIFY ("ID" NUMBER(15,0)) ALTER TABLE "SYSTEM"."A" RENAME TO "B" SQL> SELECT dbms_metadata.compare_sxml('TABLE','A','B',USER,USER) from dual; DBMS_METADATA.COMPARE_SXML('TABLE','A','B',USER,USER) -------------------------------------------------------------------------------- SYSTEMB ID NUMBER 15 0 10 40 1 65536 1048576 1 2147483645 0 1 1 DEFAULT SYSTEM Y N
SQL> SELECT dbms_metadata.get_sxml('TABLE', 'A', USER) from dual; DBMS_METADATA.GET_SXML('TABLE','A',USER) -------------------------------------------------------------------------------- SYSTEMA ID NUMBER 10 0 10 40 1 65536 1048576 1 2147483645 0 1 1 DEFAULT SYSTEM Y N
-- -- dbms_metadata.set_transform_param -- -- http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28419/d_metada.htm#i1000135 SQL> exec dbms_metadata.set_transform_param( dbms_metadata.session_transform, 'STORAGE', FALSE); PL/SQL procedure successfully completed. SQL> select dbms_metadata.get_ddl('TABLE','A') from dual; DBMS_METADATA.GET_DDL('TABLE','A') -------------------------------------------------------------------------------- CREATE TABLE "SYSTEM"."A" ( "ID" NUMBER(10,0) ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING TABLESPACE "SYSTEM" SQL> exec dbms_metadata.set_transform_param( dbms_metadata.session_transform, 'DEFAULT'); PL/SQL procedure successfully completed. SQL> select dbms_metadata.get_ddl('TABLE','A') from dual; DBMS_METADATA.GET_DDL('TABLE','A') -------------------------------------------------------------------------------- CREATE TABLE "SYSTEM"."A" ( "ID" NUMBER(10,0) ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "SYSTEM" SQL> exec dbms_metadata.set_transform_param( dbms_metadata.session_transform, 'SEGMENT_ATTRIBUTES', FALSE); PL/SQL procedure successfully completed. SQL> select dbms_metadata.get_ddl('TABLE','A') from dual; DBMS_METADATA.GET_DDL('TABLE','A') -------------------------------------------------------------------------------- CREATE TABLE "SYSTEM"."A" ( "ID" NUMBER(10,0) ) -- -- dbms_metadata.set_transform_param ONLY for DDL statements... -- -- http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28419/d_metada.htm#i1019414 -- SQL> select dbms_metadata.get_xml('TABLE','A') from dual; DBMS_METADATA.GET_XML('TABLE','A') -------------------------------------------------------------------------------- 1 2 58932 58932 58932 5 SYSTEM A 1 2 TABLE 2008-03-19 11:16:45 2008-03-19 11:16:45 2008-03-19 11:16:45 1 0 6 1 5 1 65369 5 0 8 1 8 1 2147483645 128 0 5 1 1 2147483645 0 0 58932 4325377 SYSTEM 8192 58932 1 10 40 1 255 1 -------------------------------------- 1 1 536870912 0 N 0 736 19-MAR-08 58932 1 1 1 0 ID 2 22 10 0 0 0 0 1 0 0 0 0 0 SQL> select dbms_metadata.get_xml('TABLE','B') from dual; DBMS_METADATA.GET_XML('TABLE','B') -------------------------------------------------------------------------------- 1 2 58933 58933 58933 5 SYSTEM B 1 2 TABLE 2008-03-19 11:17:05 2008-03-19 11:17:05 2008-03-19 11:17:05 1 0 6 1 5 1 65377 5 0 8 1 8 1 2147483645 128 0 5 1 1 2147483645 0 0 58933 4325377 SYSTEM 8192 58933 1 10 40 1 255 1 -------------------------------------- 1 1 536870912 0 N 0 736 19-MAR-08 58933 1 1 1 0 ID 2 22 15 0 0 0 0 1 0 0 0 0 0 SQL> desc a Name Null? Type ----------------------------------------- -------- ---------------------------- ID NUMBER(10) SQL> desc b Name Null? Type ----------------------------------------- -------- ---------------------------- ID NUMBER(15) SQL> exec dbms_metadata.set_transform_param( dbms_metadata.session_transform, 'DEFAULT'); PL/SQL procedure successfully completed. SQL> select XMLDIFF( 2 xmltype(dbms_metadata.get_xml('TABLE','A')), 3 xmltype(dbms_metadata.get_xml('TABLE','B')) 4 ) as "DIFFERENCES" 5 from dual; DIFFERENCES -------------------------------------------------------------------------------- 58933 58933 58933 B 2008-03-19 11:17:05 2008-03-19 11:17:05 2008-03-19 11:17:05 65377 58933 58933 58933 15 SQL> select XMLDIFF( 2 xmltype(dbms_metadata.get_xml('TABLE','B')), 3 xmltype(dbms_metadata.get_xml('TABLE','A')) 4 ) as "DIFFERENCES" 5 from dual; DIFFERENCES -------------------------------------------------------------------------------- 58932 58932 58932 A 2008-03-19 11:16:45 2008-03-19 11:16:45 2008-03-19 11:16:45 65369 58932 58932 58932 10 SQL> WITH tabxml AS 2 (SELECT XMLDIFF( 3 xmltype(dbms_metadata.get_xml('TABLE','A')), 4 xmltype(dbms_metadata.get_xml('TABLE','B')) 5 ) xmlset 6 FROM dual) 7 SELECT u.element_name 8 , u.element_value 9 FROM tabxml 10 , XMLTABLE 11 (XMLNAMESPACES ('http://xmlns.oracle.com/xdb/xdiff.xsd' AS "xd") 12 ,'//xd:update-node' 13 PASSING xmlset 14 COLUMNS element_name xmltype PATH '//xd:update-node/@xd:xpath' 15 , element_value xmltype PATH '//xd:content/text()' 16 ) u 17 ; ELEMENT_NAME -------------------------------------------------------------------------------- ELEMENT_VALUE -------------------------------------------------------------------------------- /ROWSET[1]/ROW[1]/TABLE_T[1]/OBJ_NUM[1]/text()[1] 58933 /ROWSET[1]/ROW[1]/TABLE_T[1]/SCHEMA_OBJ[1]/OBJ_NUM[1]/text()[1] 58933 /ROWSET[1]/ROW[1]/TABLE_T[1]/SCHEMA_OBJ[1]/DATAOBJ_NUM[1]/text()[1] 58933 /ROWSET[1]/ROW[1]/TABLE_T[1]/SCHEMA_OBJ[1]/NAME[1]/text()[1] B /ROWSET[1]/ROW[1]/TABLE_T[1]/SCHEMA_OBJ[1]/CTIME[1]/text()[1] 2008-03-19 11:17:05 /ROWSET[1]/ROW[1]/TABLE_T[1]/SCHEMA_OBJ[1]/MTIME[1]/text()[1] 2008-03-19 11:17:05 /ROWSET[1]/ROW[1]/TABLE_T[1]/SCHEMA_OBJ[1]/STIME[1]/text()[1] 2008-03-19 11:17:05 /ROWSET[1]/ROW[1]/TABLE_T[1]/STORAGE[1]/BLOCK_NUM[1]/text()[1] 65377 /ROWSET[1]/ROW[1]/TABLE_T[1]/STORAGE[1]/HWMINCR[1]/text()[1] 58933 /ROWSET[1]/ROW[1]/TABLE_T[1]/DATAOBJ_NUM[1]/text()[1] 58933 /ROWSET[1]/ROW[1]/TABLE_T[1]/COL_LIST[1]/COL_LIST_ITEM[1]/OBJ_NUM[1]/text()[1] 58933 /ROWSET[1]/ROW[1]/TABLE_T[1]/COL_LIST[1]/COL_LIST_ITEM[1]/PRECISION_NUM[1]/text( )[1] 15 12 rows selected. SQL> WITH tabxml AS 2 (SELECT XMLDIFF( 3 xmltype(dbms_metadata.get_xml('TABLE','A')), 4 xmltype(dbms_metadata.get_xml('TABLE','B')) 5 ) xmlset 6 FROM dual) 7 SELECT u.element_name 8 , u.element_value 9 FROM tabxml 10 , XMLTABLE 11 (XMLNAMESPACES ('http://xmlns.oracle.com/xdb/xdiff.xsd' AS "xd") 12 ,'//xd:update-node' 13 PASSING xmlset 14 COLUMNS element_name xmltype PATH '//xd:update-node[@xd:xpath="/ROWSET[1]/ROW[1]/TABLE_T[1]/SCHEMA_OBJ[1]/NAME[1]/text()[1]"]' 15 , element_value xmltype PATH '//xd:content/text()' 16 ) u 17 WHERE u.element_name is not null 18 ; ELEMENT_NAME -------------------------------------------------------------------------------- ELEMENT_VALUE -------------------------------------------------------------------------------- B B SQL> col NAME for a60 SQL> col VALUE for a20 SQL> WITH tabxml AS 2 (SELECT XMLDIFF( 3 xmltype(dbms_metadata.get_xml('TABLE','A')), 4 xmltype(dbms_metadata.get_xml('TABLE','B')) 5 ) xmlset 6 FROM dual) 7 SELECT extract(u.element_name,'//@xd:xpath','xmlns:xd="http://xmlns.oracle.com/xdb/xdiff.xsd"') as "NAME" 8 , u.element_value as "VALUE" 9 FROM tabxml 10 , XMLTABLE 11 (XMLNAMESPACES ('http://xmlns.oracle.com/xdb/xdiff.xsd' AS "xd") 12 ,'//xd:update-node' 13 PASSING xmlset 14 COLUMNS element_name xmltype PATH '//xd:update-node[@xd:xpath="/ROWSET[1]/ROW[1]/TABLE_T[1]/SCHEMA_OBJ[1]/NAME[1]/text()[1]"]' 15 , element_value xmltype PATH '//xd:content/text()' 16 ) u 17 WHERE u.element_name is not null 18 ; NAME VALUE ------------------------------------------------------------ -------------------- /ROWSET[1]/ROW[1]/TABLE_T[1]/SCHEMA_OBJ[1]/NAME[1]/text()[1] B SQL> select XMLCONCAT(XMLDIFF( 2 xmltype(dbms_metadata.get_xml('TABLE','A')), 3 xmltype(dbms_metadata.get_xml('TABLE','B')) 4 ), 5 XMLDIFF( 6 xmltype(dbms_metadata.get_xml('TABLE','B')), 7 xmltype(dbms_metadata.get_xml('TABLE','A')) 8 ) ) 9 from dual; XMLCONCAT(XMLDIFF(XMLTYPE(DBMS_METADATA.GET_XML('TABLE','A')),XMLTYPE(DBMS_METAD -------------------------------------------------------------------------------- 58933 58933 58933 B 2008-03-19 11:17:05 2008-03-19 11:17:05 2008-03-19 11:17:05 65377 58933 58933 58933 15 58932 58932 58932 A 2008-03-19 11:16:45 2008-03-19 11:16:45 2008-03-19 11:16:45 65369 58932 58932 58932 10 SQL> WITH tabxml AS 2 ( select XMLCONCAT(XMLDIFF( 3 xmltype(dbms_metadata.get_xml('TABLE','A')), 4 xmltype(dbms_metadata.get_xml('TABLE','B')) 5 ), 6 XMLDIFF( 7 xmltype(dbms_metadata.get_xml('TABLE','B')), 8 xmltype(dbms_metadata.get_xml('TABLE','A')) 9 ) ) xmlset 10 from DUAL) 11 SELECT extract(u.element_name,'//@xd:xpath','xmlns:xd="http://xmlns.oracle.com/xdb/xdiff.xsd"') as "NAME" 12 , u.element_value as "VALUE" 13 FROM tabxml 14 , XMLTABLE 15 (XMLNAMESPACES ('http://xmlns.oracle.com/xdb/xdiff.xsd' AS "xd") 16 ,'//xd:update-node' 17 PASSING xmlset 18 COLUMNS element_name xmltype PATH '//xd:update-node[@xd:xpath="/ROWSET[1]/ROW[1]/TABLE_T[1]/SCHEMA_OBJ[1]/NAME[1]/text()[1]"]' 19 , element_value xmltype PATH '//xd:content/text()' 20 ) u 21 WHERE u.element_name is not null 22 ; NAME VALUE ------------------------------------------------------------ -------------------- /ROWSET[1]/ROW[1]/TABLE_T[1]/SCHEMA_OBJ[1]/NAME[1]/text()[1] B /ROWSET[1]/ROW[1]/TABLE_T[1]/SCHEMA_OBJ[1]/NAME[1]/text()[1] A SQL> WITH tabxml AS 2 ( select XMLCONCAT(XMLDIFF( 3 xmltype(dbms_metadata.get_xml('TABLE','A')), 4 xmltype(dbms_metadata.get_xml('TABLE','B')) 5 ), 6 XMLDIFF( 7 xmltype(dbms_metadata.get_xml('TABLE','B')), 8 xmltype(dbms_metadata.get_xml('TABLE','A')) 9 ) ) xmlset 10 from DUAL) 11 SELECT extract(u.element_name,'//@xd:xpath','xmlns:xd="http://xmlns.oracle.com/xdb/xdiff.xsd"') as "NAME" 12 , u.element_value as "VALUE" 13 FROM tabxml 14 , XMLTABLE 15 (XMLNAMESPACES ('http://xmlns.oracle.com/xdb/xdiff.xsd' AS "xd") 16 ,'/xd:xdiff/xd:update-node' 17 PASSING xmlset 18 COLUMNS element_name xmltype PATH '/xd:update-node[@xd:xpath="/ROWSET[1]/ROW[1]/TABLE_T[1]/SCHEMA_OBJ[1]/NAME[1]/text()[1]"]' 19 , element_value xmltype PATH '/xd:update-node/xd:content/text()' 20 ) u 21 WHERE u.element_name is not null 22 ; NAME VALUE ------------------------------------------------------------ -------------------- /ROWSET[1]/ROW[1]/TABLE_T[1]/SCHEMA_OBJ[1]/NAME[1]/text()[1] B /ROWSET[1]/ROW[1]/TABLE_T[1]/SCHEMA_OBJ[1]/NAME[1]/text()[1] A SQL> select XMLCONCAT(XMLDIFF( 2 xmltype(dbms_metadata.get_xml('TABLE','A')), 3 xmltype(dbms_metadata.get_xml('TABLE','C')) 4 ), 5 XMLDIFF( 6 xmltype(dbms_metadata.get_xml('TABLE','C')), 7 xmltype(dbms_metadata.get_xml('TABLE','A')) 8 ) ) 9 from DUAL 10 ; XMLCONCAT(XMLDIFF(XMLTYPE(DBMS_METADATA.GET_XML('TABLE','A')),XMLTYPE(DBMS_METADATA.GET_XML('TABLE', ---------------------------------------------------------------------------------------------------- 58935 58935 58935 C 2008-03-19 15:08:47 2008-03-19 15:08:47 2008-03-19 15:08:47 65385 58935 58935 2 2 2 58935 58935 2 2 2 0 EXTRA 1 50 0 873 1 2 0 0 0 50 58932 58932 58932 A 2008-03-19 11:16:45 2008-03-19 11:16:45 2008-03-19 11:16:45 65369 58932 58932 1 1 1 58932 SQL> col LENGTH for a10 SQL> WITH tabxml AS 2 ( select XMLCONCAT(XMLDIFF( 3 xmltype(dbms_metadata.get_xml('TABLE','A')), 4 xmltype(dbms_metadata.get_xml('TABLE','C')) 5 ), 6 XMLDIFF( 7 xmltype(dbms_metadata.get_xml('TABLE','C')), 8 xmltype(dbms_metadata.get_xml('TABLE','A')) 9 ) ) xmlset 10 from DUAL) 11 SELECT extract(v.append_name,'//@xd:parent-xpath','xmlns:xd="http://xmlns.oracle.com/xdb/xdiff.xsd"') as "NAME" 12 , extract(v.append_value,'//COL_LIST_ITEM/NAME/text()','xmlns:xd="http://xmlns.oracle.com/xdb/xdiff.xsd"') as "VALUE" 13 , extract(v.append_value,'//COL_LIST_ITEM/LENGTH/text()','xmlns:xd="http://xmlns.oracle.com/xdb/xdiff.xsd"') as "LENGTH" 14 FROM tabxml 15 , XMLTABLE 16 (XMLNAMESPACES ('http://xmlns.oracle.com/xdb/xdiff.xsd' AS "xd") 17 ,'/xd:xdiff/xd:append-node' 18 PASSING xmlset 19 COLUMNS append_name xmltype PATH '/xd:append-node[@xd:parent-xpath="/ROWSET[1]/ROW[1]/TABLE_T[1]/COL_LIST[1]"]' 20 , append_value xmltype PATH '/xd:append-node/xd:content' 21 ) v 22 WHERE v.append_name is not null 23 ; NAME VALUE LENGTH ------------------------------------------------------------ -------------------- ---------- /ROWSET[1]/ROW[1]/TABLE_T[1]/COL_LIST[1] EXTRA 50 SQL> drop procedure proc_01; Procedure dropped. SQL> SQL> create or replace procedure proc_01 2 as 3 begin 4 null; 5 end; 6 / Procedure created. SQL> SQL> drop procedure proc_02; Procedure dropped. SQL> SQL> create or replace procedure proc_02 2 as 3 begin 4 NULL; 5 -- this is extra 6 end; 7 / Procedure created. SQL> select dbms_metadata.get_ddl('PROCEDURE','PROC_01') from dual; DBMS_METADATA.GET_DDL('PROCEDURE','PROC_01') ---------------------------------------------------------------------------- CREATE OR REPLACE PROCEDURE "SYSTEM"."PROC_01" as begin null; end; SQL> select dbms_metadata.get_ddl('PROCEDURE','PROC_02') from dual; DBMS_METADATA.GET_DDL('PROCEDURE','PROC_02') ------------------------------------------------------------------------ CREATE OR REPLACE PROCEDURE "SYSTEM"."PROC_02" as begin NULL; -- this is extra end; SQL> select dbms_metadata.get_xml('PROCEDURE','PROC_01') from dual; DBMS_METADATA.GET_XML('PROCEDURE','PROC_01') -------------------------------------------------------------------------------- 1 1 58937 7 58937 5 SYSTEM PROC_01 1 7 PROCEDURE 2008-03-19 16:39:34 2008-03-19 16:39:34 2008-03-19 16:39:34 1 0 6 65535 5 58937 1 0 18 11 0 procedure proc_01 58937 2 0 0 0 0 as 58937 3 0 0 0 0 begin 58937 4 0 0 0 0 null; 58937 5 0 0 0 0 end; SQL> select dbms_metadata.get_xml('PROCEDURE','PROC_02') from dual; DBMS_METADATA.GET_XML('PROCEDURE','PROC_02') -------------------------------------------------------------------------------- 1 1 58938 7 58938 5 SYSTEM PROC_02 1 7 PROCEDURE 2008-03-19 16:39:34 2008-03-19 16:39:34 2008-03-19 16:39:34 1 0 6 65535 5 58938 1 0 18 11 0 procedure proc_02 58938 2 0 0 0 0 as 58938 3 0 0 0 0 begin 58938 4 0 0 0 0 NULL; 58938 5 0 0 0 0 -- this is extra 58938 6 0 0 0 0 end; SQL> select XMLDIFF( 2 xmltype(dbms_metadata.get_xml('PROCEDURE','PROC_01')), 3 xmltype(dbms_metadata.get_xml('PROCEDURE','PROC_02')) 4 ) as "DIFFERENCES" 5 from dual; DIFFERENCES ---------------------------------------------------------------------------------------------------- 58938 58938 PROC_02 58938 procedure proc_02 58938 58938 58938 NULL; 58938 -- this is extra 58938 6 0 0 0 0 end; SQL> set lines 200 SQL> col name for a100 SQL> col value for a50 SQL> SQL> WITH tabxml AS 2 ( select XMLDIFF( 3 xmltype(dbms_metadata.get_xml('PROCEDURE','PROC_01')), 4 xmltype(dbms_metadata.get_xml('PROCEDURE','PROC_02')) 5 ) xmlset 6 from dual) 7 SELECT extract(u.element_name,'//@xd:xpath','xmlns:xd="http://xmlns.oracle.com/xdb/xdiff.xsd"') as "NAME" 8 , u.element_value as "VALUE" 9 FROM tabxml 10 , XMLTABLE 11 (XMLNAMESPACES ('http://xmlns.oracle.com/xdb/xdiff.xsd' AS "xd") 12 ,'//xd:update-node' 13 PASSING xmlset 14 COLUMNS element_name xmltype PATH '//xd:update-node[@xd:xpath="/ROWSET[1]/ROW[1]/PROCEDURE_T[1]/SOURCE_LINES[1]/SOURCE_LINES_ITEM[5]/SOURCE[1]/text()[1]"]' 15 , element_value xmltype PATH '//xd:content/text()' 16 ) u 17 WHERE u.element_name is not null 18 ; NAME VALUE ---------------------------------------------------------------------------------------------------- -------------------------------------------------- /ROWSET[1]/ROW[1]/PROCEDURE_T[1]/SOURCE_LINES[1]/SOURCE_LINES_ITEM[5]/SOURCE[1]/text()[1] -- this is extra SQL> drop procedure proc_03; Procedure dropped. SQL> create or replace procedure proc_03 2 as 3 begin 4 5 NULL; 6 7 dbms_output.put_line('Hello World'); 8 9 end; 10 / Procedure created. SQL> select XMLDIFF( 2 xmltype(dbms_metadata.get_xml('PROCEDURE','PROC_01')), 3 xmltype(dbms_metadata.get_xml('PROCEDURE','PROC_03')) 4 ) as "DIFFERENCES" 5 from dual; DIFFERENCES -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 58939 58939 PROC_03 2008-03-19 17:08:26 2008-03-19 17:08:26 2008-03-19 17:08:26 58939 procedure proc_03 58939 58939 58939 4 0 0 0 0 58939 5 NULL; 58939 6 0 0 0 0 58939 7 0 0 0 0 dbms_output.put_line('Hello World'); 58939 8 0 0 0 0 58939 9 SQL> col text for a50 SQL> col line for 999 SQL> select line, text 2 from user_source 3 where name='PROC_03'; LINE TEXT ---- -------------------------------------------------- 1 procedure proc_03 2 as 3 begin 4 5 NULL; 6 7 dbms_output.put_line('Hello World'); 8 9 end; 9 rows selected. SQL> col LINE for a4 SQL> col source for a50 SQL> WITH tabxml AS 2 ( select XMLDIFF( 3 xmltype(dbms_metadata.get_xml('PROCEDURE','PROC_01')), 4 xmltype(dbms_metadata.get_xml('PROCEDURE','PROC_03')) 5 ) xmlset 6 from dual) 7 SELECT u.element_line as "LINE" 8 , u.element_value as "SOURCE" 9 FROM tabxml 10 , XMLTABLE 11 (XMLNAMESPACES ('http://xmlns.oracle.com/xdb/xdiff.xsd' AS "xd") 12 ,'//xd:xdiff' 13 PASSING xmlset 14 COLUMNS element_name xmltype PATH '//xd:insert-node-before[@xd:xpath="/ROWSET[1]/ROW[1]/PROCEDURE_T[1]/SOURCE_LINES[1]/SOURCE_LINES_ITEM[5]"]' 15 , element_line xmltype PATH '//xd:insert-node-before/xd:content/SOURCE_LINES_ITEM/LINE/text()' 16 , element_value xmltype PATH '//xd:insert-node-before/xd:content/SOURCE_LINES_ITEM/SOURCE/text()' 17 ) u 18 WHERE u.element_name is not null 19 -- ORDER BY u.element_line 20 ; LINE SOURCE ---- -------------------------------------------------- 4678 dbms_output.put_line('Hello World'); SQL> WITH tabxml AS 2 ( select XMLDIFF( 3 xmltype(dbms_metadata.get_xml('PROCEDURE','PROC_01')), 4 xmltype(dbms_metadata.get_xml('PROCEDURE','PROC_03')) 5 ) xmlset 6 from dual) 7 SELECT u.element_line as "LINE" 8 , u.element_value as "SOURCE" 9 FROM tabxml 10 , XMLTABLE 11 (XMLNAMESPACES ('http://xmlns.oracle.com/xdb/xdiff.xsd' AS "xd") 12 ,'//xd:xdiff' 13 PASSING xmlset 14 COLUMNS element_name xmltype PATH '//xd:insert-node-before[@xd:xpath="/ROWSET[1]/ROW[1]/PROCEDURE_T[1]/SOURCE_LINES[1]/SOURCE_LINES_ITEM[5]"]' 15 , element_line xmltype PATH '//xd:insert-node-before/xd:content/SOURCE_LINES_ITEM/LINE/text()' 16 , element_value xmltype PATH '//xd:insert-node-before/xd:content/SOURCE_LINES_ITEM/SOURCE/text()' 17 ) u 18 WHERE u.element_name is not null 19 ORDER BY 1 20 ; SELECT u.element_line as "LINE" * ERROR at line 7: ORA-22950: cannot ORDER objects without MAP or ORDER method SQL> WITH tabxml AS 2 ( select XMLDIFF( 3 xmltype(dbms_metadata.get_xml('PROCEDURE','PROC_01')), 4 xmltype(dbms_metadata.get_xml('PROCEDURE','PROC_03')) 5 ) xmlset 6 from dual) 7 SELECT POSITION 8 , u.element_line as "LINE" 9 , u.element_value as "SOURCE" 10 FROM tabxml 11 , XMLTABLE 12 (XMLNAMESPACES ('http://xmlns.oracle.com/xdb/xdiff.xsd' AS "xd") 13 ,'//xd:xdiff' 14 PASSING xmlset 15 COLUMNS POSITION FOR ORDINALITY 16 , element_name xmltype PATH '//xd:insert-node-before[@xd:xpath="/ROWSET[1]/ROW[1]/PROCEDURE_T[1]/SOURCE_LINES[1]/SOURCE_LINES_ITEM[5]"]' 17 , element_line xmltype PATH '//xd:insert-node-before/xd:content/SOURCE_LINES_ITEM/LINE/text()' 18 , element_value xmltype PATH '//xd:insert-node-before/xd:content/SOURCE_LINES_ITEM/SOURCE/text()' 19 ) u 20 WHERE u.element_name is not null 21 ORDER BY 1 22 ; POSITION LINE SOURCE ---------- ---- -------------------------------------------------- 1 4678 dbms_output.put_line('Hello World'); SQL> WITH tabxml AS 2 ( select XMLDIFF( 3 xmltype(dbms_metadata.get_xml('PROCEDURE','PROC_01')), 4 xmltype(dbms_metadata.get_xml('PROCEDURE','PROC_03')) 5 ) xmlset 6 from dual) 7 SELECT POSITION 8 , u.element_line as "LINE" 9 , u.element_value as "SOURCE" 10 FROM tabxml 11 , XMLTABLE 12 (XMLNAMESPACES ('http://xmlns.oracle.com/xdb/xdiff.xsd' AS "xd") 13 ,'//xd:xdiff' 14 PASSING xmlset 15 COLUMNS POSITION FOR ORDINALITY 16 , element_line xmltype PATH '//xd:insert-node-before/xd:content/SOURCE_LINES_ITEM/LINE/text()' 17 , element_value xmltype PATH '//xd:insert-node-before/xd:content/SOURCE_LINES_ITEM/SOURCE/text()' 18 ) u 19 ORDER BY 1 20 ; POSITION LINE SOURCE ---------- ---- -------------------------------------------------- 1 4678 dbms_output.put_line('Hello World'); SQL> WITH tabxml AS 2 ( select XMLDIFF( 3 xmltype(dbms_metadata.get_xml('PROCEDURE','PROC_01')), 4 xmltype(dbms_metadata.get_xml('PROCEDURE','PROC_03')) 5 ) xmlset 6 from dual) 7 SELECT POSITION 8 , u.element_line as "LINE" 9 , u.element_value as "SOURCE" 10 FROM tabxml 11 , XMLTABLE 12 (XMLNAMESPACES ('http://xmlns.oracle.com/xdb/xdiff.xsd' AS "xd") 13 ,'//xd:xdiff' 14 PASSING xmlset 15 COLUMNS POSITION FOR ORDINALITY 16 , element_line xmltype PATH '//xd:insert-node-before/xd:content/SOURCE_LINES_ITEM/LINE/text()' 17 , element_value xmltype PATH '//xd:insert-node-before/xd:content/SOURCE_LINES_ITEM/SOURCE/text()' 18 ) u 19 WHERE existsnode(tabxml.xmlset,'//xd:insert-node-before/xd:content/SOURCE_LINES_ITEM/SOURCE' 20 ,'xmlns:xd="http://xmlns.oracle.com/xdb/xdiff.xsd"' 21 ) = 1 22 ORDER BY 1 23 ; POSITION LINE SOURCE ---------- ---- -------------------------------------------------- 1 4678 dbms_output.put_line('Hello World');