Transformer vos scripts DDL avec DBMS_METADATA

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”

Les commentaires sont fermés.