Betreff Autor Art der Info Quelle

METADATA API Kamel Bouzenad (kamel.bouzenad@trivadis.com) Infos für Entwickler und DBAs (April 2002) Oracle-Dokumentation sowie beratende Aktivitäten

Überblick
In manchen Fällen ist es erforderlich, die Datenbankdefinition für ein Migrationsprojekt oder für das Bearbeiten eines Arbeitsskripts zu extrahieren. Vor dem Erscheinen von Oracle 9i wurde das Reverse Engineering mittels Skripts, PL/SQL-Prozeduren oder mit Hilfe von Tools wie dem Designer ausgeführt, um die Extraktion der Metadaten zu ermöglichen. Die Anpassungen, die man beim Extrahieren der Ausgangsdaten vornehmen musste, um sie mit der Zielanwendung kompatibel zu machen, waren ein weiteres Problem im Zusammenhang mit hybriden Systemen. Um die Kompatibilitätsprobleme zu überwinden, wurde jetzt eine API in Oracle 9i integriert, welche die Extraktion von Metadaten in XML und in ORACLE DDL ermöglicht.

Extraktionsbeispiel einer SQL DDL mit Oracle9i
select dbms_metadata.get_ddl('TABLE','EMP') from dual;
CREATE TABLE "SCOTT"."EMP" ( "EMPNO" NUMBER(4,0) NOT NULL ENABLE, "ENAME" VARCHAR2(10), "JOB" VARCHAR2(9), "MGR" NUMBER(4,0), "HIREDATE" DATE, "SAL" NUMBER(7,2), "COMM" NUMBER(7,2), "DEPTNO" NUMBER(2,0), CONSTRAINT "EMP_VALID_JOB" CHECK (job in ('CLERK','SALESMAN','MANAGER','ANALYST','PRESIDENT')) ENABLE NOVALIDATE, PRIMARY KEY ("EMPNO") USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 12288 NEXT 12288 MINEXTENTS 1 MAXEXTENTS 249 PCTINCREASE 50 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "SYSTEM" ENABLE ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 LOGGING STORAGE(INITIAL 12288 NEXT 12288 MINEXTENTS 1 MAXEXTENTS 249 PCTINCREASE 50 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "SYSTEM"

Die Metadata-API
Die Metadata-API liefert eine zentrale, vollständige und leistungsfähige Schnittstelle für das Ausführen der folgenden Aufgaben: • Vollständige Extraktion der Objektdefinitionen der Datenbank im XML- oder DDLFormat für die Objekterstellung. • Umwandlung der Metadaten unter Verwendung von XSL-T (XML Stylesheet Transformation Language).

o Die DDL kann je nach dem Objekttyp mit spezifischen Transformationsparametern konfiguriert werden. Die Ergebnisse der Abfragen werden mit Hilfe von XML/SQL (einer neuen Oracle9iFunktion) in das XML-Format konvertiert. Indizes. . die bei der Extraktion der Datenbankobjekt-Metadaten durchzuführen ist. zu optimieren. Objekte. Funktionen und Packages o Operatoren o Indextypen o Relationale Views und Objekte. Die Metadata-API kann zusammen mit Version 8i installiert werden. o Unterstützt verkettete Transformationen (das Ergebnis der ersten wird zur Eingangsgröße für die zweite und so weiter). Um gegebenenfalls eine DDL zu erstellen. dazu sollte entsprechend den Anweisungen in der Oracle-Dokumentation vorgegangen werden.• Generieren der SQL DDL zur Neuerstellung der Datenbankobjekte. verwendet die Metadata-API den Oracle XML-Parser und den XSL-Prozessor. Index-Organized Tables. um die Programmierung. Die Metadata-API steht in Oracle9i zur Verfügung. temporäre sowie partitionierte Tabellen) o Indizes o Benutzerdefinierte Typen o Prozeduren. sie ist jedoch nicht in Oracle Lite enthalten. welches mittels XSL-T einfach transformierbar sind. o Liefert für alle unterstützten Objekte eine vollständige Oracle SQL DDL. o Bietet Flexibilität bei der Wahl der Objekte. o Unterstützt die Extraktion der vollständigen und akkreditierten DatenbankobjektDefinitionen für die folgenden Objektklassen: o Alle Tabellentypen (darunter auch relationale Tabellen. o Trigger o Synonyme o Zuordnungen (Zuordnungen von Objekten und Systemprivilegien) o Outlines o Sie liefert die Metadaten der Objekte im XML-Format. Kann in einer einzigen Abfrage Metadaten für mehrere Objekte zurückgeben. Funktionen Die Metadata-API bietet folgende Funktionen: o eine äußerst leistungsfähige PL/SQL-Schnittstelle (DBMS_METADATA). verschachtelte. um die XML-Dokumente in SQL DDL zu konvertieren.

Indexes . TRUE).here another filter type that use the second procedure.set_transform_param(tableTransHandle. 6 tableName VARCHAR2(30). 5 schemaName VARCHAR2(30). 23 24 25 -. we have only one DDL per table. -.open('TABLE'). IN. 'DDL'). This gives the flexibility to use LIKE.must include the SQL operator. SQL> set serverout on size 100000 SQL> r 1 declare 2 tableOpenHandle NUMBER.Open a handle for tables in the current schema.add_transform(tableOpenHandle. 8 tableDDL sys.KU$_DDL -.This interface returns a SYS. 15 -. -. 22 dbms_metadata. 7 tableDDLs sys.set_filter(tableOpenHandle. NOT IN.Beispiel einer Verwendung von DBMS_METADATA Im Folgenden ist lediglich die Ausführung des PL/SQL-Blocks aufgeführt.quitter la boucle quand il n'ya plus de tables -. dbms_metadata. 18 dbms_metadata.in the DDL. 4 indexTransHandle NUMBER.Ready to start fetching tables.Retrieve DDLs for all tables in the schema.KU$_DDLS. 'SQLTERMINATOR'. 'IOT'. and we don’t need the Index Organized table 21 -.set_transform_param(tableTransHandle.This is a table because some object types return multiple DDL statements (like types / pkgs LOOP tableDDLs := dbms_metadata.We know here. 10 11 BEGIN 12 13 -. but if we want to separate constraints in another . 14 tableOpenHandle := dbms_metadata. 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 -.Add the DDL transform so we get SQL creation DDL 26 tableTransHandle := dbms_metadata. 17 -. Grants are not requested. 'LIKE ''%''').fetch_ddl(tableOpenHandle). 19 20 -.dépebdants objects such Triggers. 3 tableTransHandle NUMBER. We use the FETCH_DDL interface -. a table of SYS. that we want a SQL terminator on each DDL. der die Definition der Tabellen des bekannten SCOTT-Schemas anzeigt. subqueries.Tell the XSL stylesheet we don't want physical storage information dbms_metadata. EXIT WHEN tableDDLs IS NULL. 'SEGMENT_ATTRIBUTES'. FALSE). 'NAME_EXPR'.ku$_ddl.ku$_parsed_items. 9 parsedItems sys. When the filter is 'NAME_EXPR'. the filter value string 16 -.set_filter(tableOpenHandle.ku$_ddls. FALSE).

0). "DMLTYPE$$" VARCHAR2(1).ddltext.ddltext. "JOB" VARCHAR2(9).0). 54 While length(TableDDL. . "SAL" NUMBER(7. 66 67* END.46 -. so we have to use a loop on TableDDls 47 -48 -49 -50 51 -.end of fetching 63 64 -. CREATE GLOBAL TEMPORARY TABLE "SCOTT".256)."DDL_TABLE" ( "DDL" CLOB.0).2). "HIREDATE" DATE."EMP_SNAPSHOT" ( "EMPNO" NUMBER(4.1.because we can’t display more than 255 caracters in one DBMS_OUTPUT 53 tableDDL := tableDDLs(1). "MGR" NUMBER(4. "CHANGE_VECTOR$$" RAW(255) ) ON COMMIT PRESERVE ROWS .DDLText)>255 55 loop 56 DBMS_OUTPUT.2)."AA" ( "A" NUMBER ).We use a loop to display the DDL of the table contained in TableDDLs 52 -. "SEQNO" NUMBER ).1.255)). -. 60 61 62 END LOOP.close(tableOpenHandle). 65 dbms_metadata. -.PUT_LINE(substr(TableDDL.DDL. "SNAPID" NUMBER(*.Free resources allocated for table stream. 58 end loop. "DEPTNO" NUMBER(2.ddltext. CREATE TABLE "SCOTT"."RUPD$_EMP" ( "EMPNO" NUMBER(4. 59 DBMS_OUTPUT.ddltext:=substr(TableDDL.0). "COMM" NUMBER(7.255)).PUT_LINE(substr(TableDDL.here we can see the DDLs for all tables of the schema(execution result) CREATE TABLE "SCOTT".0) NOT NULL ENABLE. PRIMARY KEY ("EMPNO") ENABLE ). CREATE TABLE "SCOTT". "ENAME" VARCHAR2(10). such ALTER TABLE . 57 TableDDL.

"SAL" NUMBER(7. CREATE TABLE "SCOTT"."AAA" ( "A" NUMBER ).CREATE TABLE "SCOTT".'PRESIDENT')) ENABLE NOVALIDATE. PL/SQL procedure successfully completed.'MANAGER'. "COMM" NUMBER(7. "HISAL" NUMBER ).'SALESMAN'.0). CREATE TABLE "SCOTT". "HIREDATE" DATE."SALGRADE" ( "GRADE" NUMBER. "LOSAL" NUMBER.'ANALYST'. CONSTRAINT "EMP_VALID_JOB" CHE CK (job in ('CLERK'.2).2).0). . "JOB" VARCHAR2(9). CREATE TABLE "SCOTT". PRIMARY KEY ("DEPTNO") ENABLE ). PRIMARY KEY ("EMPNO") ENABLE )."EMP" ( "EMPNO" NUMBER(4. "DMLTYPE$$" VARCHAR2(1).0) NOT NULL ENABLE. "CHANGE_VECTOR$$" RAW(255) ) . "LOC" VARCHAR2(13).. "ENAME" VARCHAR2(10). CREATE TABLE "SCOTT". "COMM" NUMBER )."MLOG$_EMP" ( "EMPNO" NUMBER(4."DEPT" ( "DEPTNO" NUMBER(2."BONUS" ( "ENAME" VARCHAR2(10). "MGR" NUMBER(4. "DNAME" VARCHAR2(14). "SNAPTIME$$" DATE. "DEPTNO" NUMBER(2. CREATE TABLE "SCOTT". "OLD_NEW$$" VARCHAR2(1). "SAL" NUMBER.0).0). "JOB" VARCHAR2(9).

Fazit Die Metadata-API erlaubt die Extraktion der Metadaten der Objekte einer OracleDatenbank im XML-Format und in Oracle DDL.: Fax: Internet: kamel.trivadis. der die Metadaten aller geänderten Objekte in eine Versionstabelle einfügt.bouzenad@trivadis. man kann einen Trigger schreiben. Kamel Bouzenad Trivadis SA Rue Marterey 5 CH-1005 Lausanne E-Mail : Tel.com +41-21-321 47 00 +41-21-321 47 01 http://www. Dieser Themenbereich könnte Gegenstand eines weiteren Artikels werden. Ein großes Anliegen ist mir dabei die Versionsverwaltung.com . wesentlich vereinfacht. etc. was die Handhabung der Probleme insbesondere hinsichtlich der Migration in andere Systeme (hybride Systeme inklusive XML) sowie der Erstellung von Skripts.

Sign up to vote on this title
UsefulNot useful