Non seulement DBMS_METADATA
permet de récupérer le DDL d’un schéma mais il permet aussi de le transformer. Dans l’exemple qui suit, vous trouverez le code qui extrait le DDL des tables du schéma SCOTT, supprime la clause de stockage et transforme les noms des schémas et des tablespaces associés:
set lines 32000
set serveroutput on buffer 20000
declare
handle NUMBER;
tr_handle NUMBER;
ret CLOB;
begin
-- Open a handle for tables
handle := DBMS_METADATA.OPEN('TABLE','11.1.0.7');
-- Get the SCOTT tables
DBMS_METADATA.SET_FILTER(handle, 'SCHEMA',
'SCOTT');
-- Transform the tables to be created
-- in the DEMO schema and to be stored
-- in the DEMO tablespace
tr_handle := DBMS_METADATA.ADD_TRANSFORM(
handle, 'MODIFY');
dbms_metadata.SET_REMAP_PARAM(tr_handle,
'REMAP_SCHEMA', 'SCOTT',
'DEMO');
dbms_metadata.SET_REMAP_PARAM(tr_handle,
'REMAP_TABLESPACE', 'USERS',
'DEMO');
-- Display the command with the
-- DDL syntax
tr_handle := dbms_metadata.ADD_TRANSFORM(
handle, 'DDL');
dbms_metadata.SET_TRANSFORM_PARAM(tr_handle,
'SQLTERMINATOR', TRUE);
dbms_metadata.SET_TRANSFORM_PARAM(tr_handle,
'SEGMENT_ATTRIBUTES', TRUE);
dbms_metadata.SET_TRANSFORM_PARAM(tr_handle,
'STORAGE', FALSE);
dbms_metadata.SET_TRANSFORM_PARAM(tr_handle,
'TABLESPACE', TRUE);
dbms_output.enable;
ret:='1';
while (ret is not null) loop
-- Fetch the commands in a CLOB
ret := dbms_metadata.FETCH_CLOB(handle);
-- Print the SQL text
dbms_output.put_line(ret);
end loop;
-- Close the handle
dbms_metadata.CLOSE(handle);
end;
/
set lines 120
Le résultat ressemble à ceci:
CREATE TABLE "DEMO"."BONUS"
( "ENAME" VARCHAR2(10),
"JOB" VARCHAR2(9),
"SAL" NUMBER,
"COMM" NUMBER
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
TABLESPACE "DEMO" ;
CREATE TABLE "DEMO"."DEPT"
( "DEPTNO" NUMBER(2,0),
"DNAME" VARCHAR2(14),
"LOC" VARCHAR2(13),
CONSTRAINT "PK_DEPT" PRIMARY KEY ("DEPTNO")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
TABLESPACE "DEMO" ENABLE
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
TABLESPACE "DEMO" ;
CREATE TABLE "DEMO"."EMP"
( "EMPNO" NUMBER(4,0),
"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 "PK_EMP" PRIMARY KEY ("EMPNO")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
TABLESPACE "DEMO" ENABLE,
CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO")
REFERENCES "DEMO"."DEPT" ("DEPTNO") ENABLE
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
TABLESPACE "DEMO" ;
CREATE TABLE "DEMO"."SALGRADE"
( "GRADE" NUMBER,
"LOSAL" NUMBER,
"HISAL" NUMBER
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
TABLESPACE "DEMO" ;
Si vous êtes curieux, regardez la liste des paramètres de SET_TRANSFORM_PARAM
qui contrôlent les sections affichées dans le DDL. Les paramètres de SET_REMAP_PARAM
permettent quant à eux de renommer certaines propriétés comme le nom, le schéma ou le tablespace d’un objet.
1 réflexion sur “Transformer vos scripts DDL avec DBMS_METADATA”
Très intéressant comme package. Par contre, je sortirais dbms_output.enable de la boucle puisqu’un seul appel suffit.
Les commentaires sont fermés.