ACE Director Alum Daniel Morgan, founder of Morgan's Library, is scheduling
complimentary technical Workshops on Database Security for the first 30
Oracle Database customers located anywhere in North America, EMEA, LATAM, or
APAC that send an email to
asra_us@oracle.com. Request a Workshop for
your organization today.
Purpose
This package provides an API for fetching metadata from the database dictionary as XML or creation DDL and facilitates submitting the XML to recreate the objects.
AUTHID
CURRENT_USER
Constants
Name
Data Type
Value
Session
SESSION_TRANSFORM
BINARY_INTEGER
-1
SESSION_HANDLE
BINARY_INTEGER
-1
PUBLIC
MAX_PROCOBJ_RETLEN
BINARY_INTEGER
32767
New Block
NEWBLOCK_CONTINUE
NUMBER
0
NEWBLOCK_BEGIN
NUMBER
1
NEWBLOCK_APPEND
NUMBER
-2
Marker
MARKER_PRE_SYSTEM
NUMBER
1
MARKER_PRE_SCHEMA
NUMBER
2
MARKER_PRE_INSTANCE
NUMBER
3
MARKER_POST_SYSTEM
NUMBER
4
MARKER_POST_SCHEMA
NUMBER
5
MARKER_EARLY_POST_INSTANCE
NUMBER
6
MARKER_POST_INSTANCE
NUMBER
7
MARKER_FINAL_POST_INSTANCE
NUMBER
7
MARKER_NORMAL_POST_INSTANCE
NUMBER
8
MARKER_STATISTICS
NUMBER
10
Use for special processing by the worker for those PL/SQL object types whose source moves in a table rather than XML
MARKER_PACKAGE_SPEC
NUMBER
11
MARKER_PACKAGE_BODY
NUMBER
12
MARKER_FUNCTION
NUMBER
13
Constant for use with the OBJECT_SEQNUM filter
ROOT_OBJECT
NUMBER
0
Flags definition for 'put'
PUT_RAISE_EXCEPTION
NUMBER
1
Flags definnitions for SET_TRANSFORM_PARAM - now for DataPump only
TRANSFORM_REPLACE
NUMBER
1
Data Types
TYPE offset IS RECORD (
pos PLS_INTEGER,
len PLS_INTEGER,
grantor VARCHAR2(30),
bind_pattern VARCHAR2(30),
alt_connect_type VARCHAR2(4),
has_tstz_cols VARCHAR2(30),
has_virtual_columns VARCHAR2(30));
TYPE objddl IS TABLE OF offset INDEX BY BINARY_INTEGER;
TYPE multiobjects IS TABLE OF objddl INDEX BY BINARY_INTEGER;
TYPE t_var_coll IS TABLE OF VARCHAR2(60) INDEX BY BINARY_INTEGER;
Dependencies
SELECT name FROM dba_dependencies WHERE referenced_name = 'DBMS_METADATA'
UNION
SELECT referenced_name FROM dba_dependencies WHERE name = 'DBMS_METADATA';
invalid_operation: The function was called after the first call to FETCH_xxx
31602
inconsistent_args: The parameter value is inconsistent with another value specified
31603
object_not_found: The specified object was not found in the database
31604
invalid_object_param: Specified parameter value is not valid for this object type
31607
inconsistent_operation: Either FETCH_XML was called when the DDL transform was specified, or FETCH_DDL was called when the DDL transform was omitted
31608
object_not_found2: The specified object was not found in the database
31609
stylesheet_load_error: Installation script initmeta.sql failed to load the named file from the file system directory into the database
31642
sql_error: Untrapped internal DBMS_METADATA error
39128
dbmsjava_error: Unexpected DBMS_JAVA error
First Available
9.0
Object Type Strings
AQ_QUEUE
RLS_GROUP
AQ_QUEUE_TABLE
RLS_POLICY
AQ_TRANSFORM
RMGR_CONSUMER_GROUP
ASSOCIATION
RMGR_INTITIAL_CONSUMER_GROUP
AUDIT
RMGR_PLAN
AUDIT_OBJ
RMGR_PLAN_DIRECTIVE
CLUSTER
ROLE
COMMENT
ROLE_GRANT
CONSTRAINT (P & U only)
ROLLBACK_SEGMENT
CONTEXT
SCHEMA_EXPORT
DATABASE_EXPORT
SEQUENCE
DB_LINK
SYNONYM
DEFAULT_ROLE
SYSTEM_GRANT
DIMENSION
TABLE
DIRECTORY
TABLESPACE
FGA_POLICY
TABLESPACE_QUOTA
FUNCTION
TABLE_DATA
INDEX_STATISTICS
TABLE_EXPORT
INDEX
TABLE_STATISTICS
INDEXTYPE
TRANSPORTABLE_EXPORT
JAVA_SOURCE
TRIGGER
JOB
TRUSTED_DB_LINK
LIBRARY
TYPE
MATERIALIZED_VIEW
TYPE_BODY
MATERIALIZED_VIEW_LOG
TYPE_SPEC
OBJECT_GRANT
USER
OPERATOR
VIEW
PACKAGE
XMLSCHEMA
PACKAGE_BODY
XS_ACL (Real Application Security: RAS)
PACKAGE_SPEC
XS_ACL_PARAM (RAS)
PROCEDURE
XS_DATA_SECURITY (RAS)
PROFILE
XS_NAMESPACE (RAS)
PROXY
XS_ROLE (RAS)
REFRESH_GROUP
XS_ROLESET (RAS)
REF_CONSTRAINT
XS_ROLE_GRANT (RAS)
RESOURCE_COST
XS_SECURITY_CLASS
RLS_CONTEXT
XS_USER (RAS)
Object Types For OPEN (partial listing)
Type Name
Meaning
CONSTRAINT
constraints
DATABASE_EXPORT
all metadata objects in a database
DB_LINK
database links
FGA_POLICY
fine-grained audit policies
INDEX_STATISTICS
precomputed statistics on indexes
REF_CONSTRAINT
referential constraint
RLS_CONTEXT
driving contexts for enforcement of fine-grained access-control policies
RMGR_PLAN
resource plans
SCHEMA_EXPORT
all metadata objects in a schema
TABLE_DATA
metadata describing row data for a table, nested table, or partition
TRANSPORTABLE_EXPORT
metadata for objects in a transportable tablespace set
TYPE
user-defined types
Security Model
Owned by SYS with EXECUTE granted to PUBLIC and the GSMUSER_ROLE role.
To reverse engineer objects not owned by the connected user's schema you must be what Oracle calls a "privileged user." Privileged user means that the user is either SYS or has been granted the SELECT_CATALOG_ROLE role.
When used to retrieve objects, it specifies a transform that FETCH_xxx applies to the XML representation of the retrieved objects.
When used to submit objects, specifies a transform that CONVERT or PUT applies to the XML representation of the submitted objects.
dbms_metadata.add_transform(
handle IN NUMBER,
name IN VARCHAR2,
encoding IN VARCHAR2 DEFAULT NULL,
object_type IN VARCHAR2 DEFAULT NULL)
RETURN NUMBER;
Returns 1 if the identified check constraint exists: Otherwise NULL
At least that's the theory. Here's what Oracle's file comments state:
"-- CHECK_CONSTRAINT - Check whether constraint exists or not
--
-- PARAMETER :
-- obj_num - obj# of index
--
-- Returns 1 if constraint exists"
The above statement is nonsensical ... because an index is not a constraint and a constraint doesn't have an object number as demonstrated, at right. What it appears it is looking for is constraints enforced by unique indexes.
dbms_metadata.check_constraint(obj_num IN NUMBER)
RETURN NUMBER;
SELECT table_name, constraint_name
FROM dba_constraints
WHERE owner = 'SYS'
AND table_name LIKE '%$'
AND constraint_type = 'P'
AND rownum < 11
ORDER BY 1;
Transforms an input XML document into creation DDL
Overload 1
dbms_metadata.convert(
handle IN NUMBER,
document IN sys.XMLType)
RETURN sys.ku$_multi_ddls;
TBD
Overload 2
dbms_metadata.convert(
handle IN NUMBER,
document IN CLOB)
RETURN
sys.ku$_multi_ddls;
TBD
This is an alternate higher-performing but less flexible form of CONVERT that returns only a single (but multi-object) CLOB with a collection providing offsets into this CLOB to locate each individual DDL.
Parse items per DDL are NOT returned with this version.
Overload 3
dbms_METADATA.CONVERT (
handle IN NUMBER,
document IN CLOB,
offsets OUT NOCOPY dbms_metadata.multiobjects)
RETURN CLOB;
TBD
Transforms an input XML document into creation DDL
Overload 4
dbms_METADATA.CONVERT (
handle IN NUMBER,
document IN sys.XMLType,
result IN OUT NOCOPY CLOB);
TBD
Overload 5
dbms_METADATA.CONVERT (
handle IN NUMBER,
document IN CLOB,
result IN OUT NOCOPY CLOB);
DECLARE
h NUMBER;
x sys.ku$_ObjNumSet;
BEGIN
h := dbms_metadata.open('TABLE');
SELECT dbms_metadata.fetch_vat_objnums
INTO x
FROM dual;
dbms_metadata.close(h);
END;
/
Returns the XML metadata for the objects as a CLOB in an IN OUT NOCOPY parameter
Overload 1
dbms_metadata.fetch_xml_clob(
handle IN NUMBER,
doc IN OUT NOCOPY CLOB,
parsed_items OUT NOCOPY sys.ku$_parsed_items,
object_type_path OUT VARCHAR2);
DECLARE
h NUMBER;
c CLOB;
x sys.ku$_parsed_items;
y VARCHAR2(100);
BEGIN
h := dbms_metadata.open('TABLE')
dbms_metadata.fetch_xml_clob(h, c, x, y);
dbms_output.put_line(c);
dbms_metadata.close(h);
END;
/
Returns the XML metadata for the objects as a CLOB in an IN OUT NOCOPY parameter
Overload 2
dbms_metadata.fetch_xml_clob(
handle IN NUMBER,
doc IN OUT NOCOPY CLOB,
parsed_items IN OUT NOCOPY sys.ku$_parsed_items,
object_type_path OUT VARCHAR2,
seqno OUT NUMBER,
procobj_errors OUT sys.ku$_vcnt);
Get the export string from call instance_info_exp and instance_extended_info_exp function of package in exppkgact$
dbms_metadata.get_action_instance(
package IN VARCHAR2,
pkg_schema IN VARCHAR2,
function IN VARCHAR2,
name IN VARCHAR2,
schema IN VARCHAR2,
namespace IN NUMBER,
objtype IN NUMBER,
prepost IN NUMBER,
isdba IN NUMBER)
RETURN sys.ku$_procobj_lines;
Get the export string from call schema_info_exp function of package in exppkgact$
dbms_metadata.get_action_schema(
tag IN VARCHAR2,
package IN VARCHAR2,
pkg_schema IN VARCHAR2,
function IN VARCHAR2,
schema IN VARCHAR2,
prepost IN NUMBER,
isdba IN NUMBER)
RETURN sys.ku$_procobj_lines;
dbms_metadata.get_action_sys(
tag IN VARCHAR2,
package IN VARCHAR2,
pkg_schema IN VARCHAR2,
function IN VARCHAR2,
prepost IN NUMBER)
RETURN sys.ku$_procobj_lines;
dbms_metadata.get_check_constraint_name(
curruid IN NUMBER,
object_type IN VARCHAR2,
schema IN VARCHAR2,
name IN VARCHAR2,
condition IN CLOB,
parsed_condition IN BOOLEAN DEFAULT FALSE)
RETURN VARCHAR2;
CREATE TABLE t (
testcol NUMBER(3));
ALTER TABLE t
ADD CONSTRAINT cc_t_testcol_gt
CHECK (testcol > 0);
ALTER TABLE t
ADD CONSTRAINT cc_t_testcol_bt
CHECK (testcol BETWEEN 1 AND 10);
SELECT constraint_name, search_condition
FROM user_constraints
WHERE table_name = 'T';
CONSTRAINT_NAME SEARCH_CONDITION
---------------- -------------------------
CC_T_TESTCOL_GT testcol > 0
CC_T_TESTCOL_BT testcol BETWEEN 1 AND 10
set serveroutput on
DECLARE
uid NUMBER := sys_context('USERENV', 'CURRENT_USERID');
otype VARCHAR2(30) := 'TABLE';
pc CLOB := 'testcol > 0';
retval VARCHAR2(100);
BEGIN
retval := dbms_metadata.get_check_constraint_name(uid, otype, USER, 'T', pc);
dbms_output.put_line(retval);
END;
/
dbms_metadata.get_ddl(
object_type IN VARCHAR2,
name IN VARCHAR2,
schema IN VARCHAR2 DEFAULT NULL,
version IN VARCHAR2 DEFAULT 'COMPATIBLE',
model IN VARCHAR2 DEFAULT 'ORACLE',
transform IN VARCHAR2 DEFAULT 'DDL')
RETURN CLOB;
-- Table
CREATE TABLE test
PCTFREE 0
TABLESPACE uwdata AS
SELECT table_name, tablespace_name
FROM user_all_tables;
SET LONG 100000
SELECT dbms_metadata.get_ddl('TABLE', 'TEST')
FROM dual;
-- View
CREATE OR REPLACE VIEW my_tables AS
SELECT table_name, tablespace_name
FROM user_all_tables;
SELECT dbms_metadata.get_ddl('VIEW', 'MY_TABLES')
FROM dual;
DBMS_METADATA.GET_DDL('VIEW','MY_TABLES')
--------------------------------------------------------------------------------
CREATE OR REPLACE FORCE NONEDITIONABLE VIEW "SYS"."MY_TABLES" ("TABLE_NAME",
"
TABLESPACE_NAME") AS
SELECT table_name, tablespace_name
FROM user_all_tables
-- Function
CREATE OR REPLACE FUNCTION whoami RETURN VARCHAR2 AUTHID DEFINER IS
BEGIN
RETURN user;
END whoami;
/
SELECT dbms_metadata.get_ddl('FUNCTION', 'WHOAMI')
FROM dual;
DBMS_METADATA.GET_DDL('FUNCTION','WHOAMI')
--------------------------------------------------------------------------------
CREATE OR REPLACE NONEDITIONABLE FUNCTION "SYS"."WHOAMI" RETURN VARCHAR2
AUTHI
D DEFINER IS
BEGIN
RETURN user;
END whoami;
-- Tablespace
SELECT dbms_metadata.get_ddl('TABLESPACE', 'UWDATA')
FROM dual;
DBMS_METADATA.GET_DDL('TABLESPACE','UWDATA')
--------------------------------------------------------------------------------
CREATE TABLESPACE "UWDATA" DATAFILE
'C:\U01\ORABASE19\ORADATA\ORABASEXIX\UWDATA01.DBF' SIZE 262144000
LOGGING FORCE LOGGING ONLINE PERMANENT BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 262144 DEFAULT
NOCOMPRESS SEGMENT SPACE MANAGEMENT AUTO
-- User
SELECT dbms_metadata.get_ddl('USER', 'C##SAFEDBA')
FROM dual;
DBMS_METADATA.GET_DDL('USER','C##SAFEDBA')
--------------------------------------------------------------------------------
CREATE USER "C##SAFEDBA" IDENTIFIED BY VALUES
'S:030FF96D028BEA888A06A87D5539
B9690773D9216210CF99C1CDE6B1145E;T:1931A4EC7166CFECE7ED5C66A364DD404A65EE4593F22
706583DEEC0136C12682CF2A4C07BBDE11E795AA7A6CC4A68DB248F54539D3BA3B8E7E0E98A2478C
688070BC95311C167012EC24A402095996F'
DEFAULT TABLESPACE "USERS"
TEMPORARY TABLESPACE "TEMP"
PROFILE "C##NOT#DEFAULT"
ACCOUNT LOCK
ALTER USER "C##SAFEDBA" LOCAL TEMPORARY TABLESPACE "CDBROOT_TEMP"
Fetch DDL for dependent objects (audits, object grants)
dbms_metadata.get_dependent_ddl(
object_type IN VARCHAR2,
base_object_name IN VARCHAR2,
base_object_schema IN VARCHAR2 DEFAULT NULL,
version IN VARCHAR2 DEFAULT 'COMPATIBLE',
model IN VARCHAR2 DEFAULT 'ORACLE',
transform IN VARCHAR2 DEFAULT 'DDL',
object_count IN NUMBER DEFAULT 10000)
RETURN CLOB;
GRANT select ON servers TO hr;
GRANT select ON servers TO scott;
set long 100000
SELECT dbms_metadata.get_dependent_ddl('OBJECT_GRANT','SERVERS')
FROM dual;
Return the metadata for objects dependent on a base object as XML
dbms_metadata.get_dependent_sxml(
object_type IN VARCHAR2,
base_object_name IN VARCHAR2,
base_object_schema IN VARCHAR2 DEFAULT NULL,
version IN VARCHAR2 DEFAULT 'COMPATIBLE',
model IN VARCHAR2 DEFAULT 'ORACLE',
transform IN VARCHAR2 DEFAULT 'SXML',
object_count IN NUMBER DEFAULT 10000)
RETURN CLOB;
Fetch XML for dependent objects (audits, object grants)
dbms_metadata.get_dependent_xml(
object_type IN VARCHAR2,
base_object_name IN VARCHAR2,
base_object_schema IN VARCHAR2 DEFAULT NULL,
version IN VARCHAR2 DEFAULT 'COMPATIBLE',
model IN VARCHAR2 DEFAULT 'ORACLE',
transform IN VARCHAR2 DEFAULT NULL,
object_count IN NUMBER DEFAULT 10000)
RETURN CLOB;
GRANT all ON servers TO system;
set long 1000000
SELECT dbms_metadata.get_dependent_xml('TABLE', 'UWCLASS.SERVERS')
FROM dual;
Get PLSQL code from the ODCIIndexGetMetadata
method of a domain index's implementation type
dbms_metadata.get_domidx_metadata(
index_name IN VARCHAR2,
index_schema IN VARCHAR2,
type_name IN VARCHAR2,
type_schema IN VARCHAR2,
flags IN NUMBER)
RETURN sys.ku$_procobj_lines;
Get stream metadata for table (for use by DataPump data layer only this is an internal API)
dbms_metadata.get_dpstrm_md (
schema IN VARCHAR2,
name IN VARCHAR2,
mdversion IN VARCHAR2 DEFAULT 'COMPATIBLE',
dpapiversion IN NUMBER DEFAULT 3,
doc IN OUT NOCOPY CLOB,
network_link IN VARCHAR2 DEFAULT NULL,
force_lob_be IN BOOLEAN DEFAULT FALSE,
force_no_encrypt IN BOOLEAN DEFAULT FALSE);
Fetch granted objects (system grants, role grants) DDL
dbms_metadata.get_granted_ddl(
object_type IN VARCHAR2,
grantee IN VARCHAR2 DEFAULT NULL,
version IN VARCHAR2 DEFAULT 'COMPATIBLE',
model IN VARCHAR2 DEFAULT 'ORACLE',
transform IN VARCHAR2 DEFAULT 'DDL',
object_count IN NUMBER DEFAULT 10000)
RETURN CLOB;
SELECT dbms_metadata.get_granted_ddl('SYSTEM_GRANT', 'UWCLASS')
FROM dual;
Fetch granted objects (system grants, role grants) in XML format
dbms_metadata.get_granted_xml(
object_type IN VARCHAR2,
grantee IN VARCHAR2 DEFAULT NULL,
version IN VARCHAR2 DEFAULT 'COMPATIBLE',
model IN VARCHAR2 DEFAULT 'ORACLE',
transform IN VARCHAR2 DEFAULT NULL,
object_count IN NUMBER DEFAULT 10000)
RETURN CLOB;
set long 1000000
SELECT dbms_metadata.get_granted_xml('SYSTEM_GRANT', 'UWCLASS')
FROM dual;
dbms_metadata.get_hashcode(
schema IN VARCHAR2,
typename IN VARCHAR2)
RETURN RAW;
SELECT dbms_metadata.get_ddl('VIEW', 'KU$_TYPE_VIEW')
FROM dual;
DBMS_METADATA.GET_DDL('VIEW','KU$_TYPE_VIEW')
--------------------------------------------------------------------------------
CREATE OR REPLACE FORCE VIEW " SYS"." KU$_TYPE_VIEW" OF "SYS"."KU$_TYPE_T"
WITH OBJECT IDENTIFIER (obj_num) AS
SELECT '1','2', oo.obj#, value(o), oo.oid$, t.typeid, t.version#,
sys.dbms_metadata.get_hashcode(o.owner_name,o.name), t.typecode, t.properties,
t.attributes, t.methods, t.hiddenMethods, t.externtype, t.externname,
sys.dbms_metadata_util.get_source_lines(oo.name,oo.obj#,oo.type#),
(select value(c) from ku$_switch_compiler_view c where c.obj_num =oo.obj#),
(select value(stso) from ku$_schemaobj_view stso where stso.oid = t.supertoid),
(select value(c) from ku$_collection_view c where oo.oid$ = c.toid),
cast(multiset(select value(a) from sys.ku$_type_attr_view a where a.toid = oo.oid$)
as ku$_type_attr_list_t), cast(multiset(select value(m)
from sys.ku$_method_view m
where m.toid = oo.oid$
and m.xflags=0
and m.obj_num=oo.o bj#)
as ku$_method_list_t)
FROM sys.obj$ oo, sys.ku$_edition_schemaobj_view o, type$ t
WHERE oo.type# = 13
AND oo.obj# = o.obj_num
AND oo.subname is null /* latest type version */
AND oo.oid$ = t.toid
/* type$ properties bits:
262144=0 - latest type version
other bits=0 - not system-generated type
*/
and bitand(t.properties,262144+2048+64+16)=0
AND (SYS_CONTEXT('USERENV','CURRENT_USERID') IN (o.owner_num, 0) OR
EXISTS ( SELECT * FROM session_roles
WHERE role='SELECT_CATALOG_ROLE' ));
Get the export string from create_exp or audit_exp function of package in exppkobj$
dbms_metadata.get_procobj(
tag IN VARCHAR2,
package IN VARCHAR2,
pkg_schema IN VARCHAR2,
function IN VARCHAR2,
objid IN NUMBER,
isdba IN PLS_INTEGER)
RETURN sys.ku$_procobj_lines;
Get the export string from call grant_exp function of package in exppkobj$
dbms_metadata.get_procobj_grant(
tag IN VARCHAR2,
package IN VARCHAR2,
pkg_schema IN VARCHAR2,
function IN VARCHAR2,
objid IN NUMBER,
isdba IN PLS_INTEGER)
RETURN sys.ku$_procobj_lines;
Returns the text of the queries that are used by FETCH_xxx. This function assists in debugging
dbms_metadata.get_query(handle IN NUMBER)
RETURN VARCHAR2;
set long 1000000
set serveroutput on
set pagesize 0
set linesize 1000
set trim on
set trimspool on
spool c:\temp\demo.txt
DECLARE
n NUMBER;
s VARCHAR2(32767);
BEGIN
SELECT dbms_metadata.open('TABLE')
INTO n
FROM dual;
SELECT dbms_metadata.get_query(n)
INTO s
FROM dual;
dbms_output.put_line(s);
dbms_metadata.close(n);
END;
/
spool off
-- replace :SCHEMA1 with 'UWCLASS'
SELECT /*+rule*/ SYS_XMLGEN(VALUE(KU$), XMLFORMAT.createFormat2('TABLE_T', '7')), 0
FROM SYS.KU$_IOTABLE_VIEW KU$
WHERE NOT (BITAND (KU$.PROPERTY,8192)=8192)
AND NOT BITAND(KU$.SCHEMA_OBJ.FLAGS,128)!=0
AND KU$.SCHEMA_OBJ.OWNER_NAME='UWCLASS';
SELECT /*+rule*/ SYS_XMLGEN(VALUE(KU$), XMLFORMAT.createFormat2('TABLE_T', '7')), 0
FROM SYS.KU$_PFHTABLE_VIEW KU$
WHERE NOT (BITAND (KU$.PROPERTY,8192)=8192)
AND NOT BITAND(KU$.SCHEMA_OBJ.FLAGS,128)!=0
AND KU$.SCHEMA_OBJ.OWNER_NAME='UWCLASS';
SELECT /*+rule*/ SYS_XMLGEN(VALUE(KU$), XMLFORMAT.createFormat2('TABLE_T', '7')), 0
FROM SYS.KU$_PHTABLE_VIEW KU$
WHERE NOT (BITAND (KU$.PROPERTY,8192)=8192)
AND NOT BITAND(KU$.SCHEMA_OBJ.FLAGS,128)!=0
AND KU$.SCHEMA_OBJ.OWNER_NAME='UWCLASS';
SELECT /*+rule*/ SYS_XMLGEN(VALUE(KU$), XMLFORMAT.createFormat2('TABLE_T', '7')), 0
FROM SYS.KU$_FHTABLE_VIEW KU$
WHERE NOT (BITAND (KU$.PROPERTY,8192)=8192)
AND NOT BITAND(KU$.SCHEMA_OBJ.FLAGS,128)!=0
AND KU$.SCHEMA_OBJ.OWNER_NAME='UWCLASS';
SELECT /*+rule*/
SYS_XMLGEN(VALUE(KU$), XMLFORMAT.createFormat2('TABLE_T', '7')), 0
FROM SYS.KU$_HTABLE_VIEW KU$
WHERE NOT (BITAND (KU$.PROPERTY,8192)=8192)
AND NOT BITAND(KU$.SCHEMA_OBJ.FLAGS,128)!=0
AND KU$.SCHEMA_OBJ.OWNER_NAME='UWCLASS';
dbms_metadata.get_index_intcol(
owner_name IN VARCHAR2,
table_name IN VARCHAR2,
default_val IN LONG, -- value or null from col$.default$
attr_colname IN VARCHAR2, -- value or null from attrcol$.name
nested_table IN NUMBER) -- 1 if nested table, 0 otherwise
RETURN VARCHAR2;
Returns an index_owner and index name for restoring statistics
dbms_metadata.get_index_intcol(
table_owner IN VARCHAR2,
table_name IN VARCHAR2,
col_names IN dbms_metadata.t_var_coll -- varray of columns that index is on
col_count IN NUMBER, -- number of columns that index is on
ind_owner OUT VARCHAR2, -- index owner
ind_name OUT VARCHAR2); -- index name
Returns the metadata for a single object as SXML. This interface is meant for casual browsing (e.g., from SQLPlus) vs. the programmatic OPEN / FETCH / CLOSE interfaces
dbms_metadata.get_sxml(
object_type IN VARCHAR2,
name IN VARCHAR2,
schema IN VARCHAR2 DEFAULT NULL,
version IN VARCHAR2 DEFAULT 'COMPATIBLE',
model IN VARCHAR2 DEFAULT 'ORACLE',
transform IN VARCHAR2 DEFAULT 'SXML')
RETURN CLOB;
conn sys@pdbdev as sysdba
set serveroutput on
DECLARE
c CLOB;
BEGIN
SELECT dbms_metadata.get_sxml('TABLE', 'SERVERS', 'UWCLASS')
INTO c
FROM dual;
Simple 1-step method for retrieving a single DB object, converting to SXML, then to DDL
dbms_metadata.get_sxml_ddl(
object_type IN VARCHAR2,
name IN VARCHAR2,
schema IN VARCHAR2 DEFAULT NULL,
version IN VARCHAR2 DEFAULT 'COMPATIBLE',
model IN VARCHAR2 DEFAULT 'ORACLE',
transform IN VARCHAR2 DEFAULT 'SXMLDDL')
RETURN CLOB;
dbms_metadata.get_xml(
object_type IN VARCHAR2,
name IN VARCHAR2,
schema IN VARCHAR2 DEFAULT NULL,
version IN VARCHAR2 DEFAULT 'COMPATIBLE',
model IN VARCHAR2 DEFAULT 'ORACLE',
transform IN VARCHAR2 DEFAULT NULL)
RETURN CLOB;
conn sys@pdbdev as sysdba
-- table
CREATE TABLE test
PCTFREE 0
TABLESPACE uwdata AS
SELECT table_name, tablespace_name
FROM user_all_tables;
SELECT dbms_metadata.get_xml('TABLE', 'TEST')
FROM dual;
-- view
CREATE OR REPLACE VIEW my_tables AS
SELECT table_name, tablespace_name
FROM user_all_tables;
SET LONG 4000
SELECT dbms_metadata.get_xml('VIEW', 'MY_TABLES')
FROM dual;
-- function
CREATE OR REPLACE FUNCTION whoami RETURN VARCHAR2 IS
BEGIN
RETURN user;
END whoami;
/
SELECT dbms_metadata.get_xml('FUNCTION', 'WHOAMI')
FROM dual;
Checks the current registration in impcalloutreg$ to see if it should be exported based on its beginning and ending RDBMSversions (if present) when compared to the job's target import version (1 if honored, 0 not honored)
dbms_metadata.is_active_registration(
beginning_version IN VARCHAR2,
ending_version IN VARCHAR2)
RETURN NUMBER;
desc impcalloutreg$
SELECT dbms_metadata.is_active_registration('6.0.12', '12.2.0.1')
FROM dual;
SELECT dbms_metadata.is_active_registration('11.2.0.4', '12.2.0.1')
FROM dual;
SELECT dbms_metadata.is_active_registration('0', '99.99.99.99')
FROM dual;
Fetch selected DB objects in a VARCHAR2 (used by network mode)
dbms_metadata.network_fetch_clob(
handle IN NUMBER,
do_xsl_parse IN NUMBER,
partial OUT NUMBER,
parse_delim OUT VARCHAR2,
do_callout OUT NUMBER,
have_errors OUT NUMBER)
RETURN VARCHAR2;
dbms_metadata.network_open(
object_type IN VARCHAR2,
version IN VARCHAR2 DEFAULT 'COMPATIBLE',
model IN VARCHAR2 DEFAULT 'ORACLE',
client_version IN NUMBER,
protocol_version OUT NUMBER)
RETURN NUMBER;
Specifies the type of object to be retrieved, the version of its metadata, and the object model
dbms_metadata.open(
object_type IN VARCHAR2,
version IN VARCHAR2 DEFAULT 'COMPATIBLE',
model IN VARCHAR2 DEFAULT 'ORACLE',
network_link IN VARCHAR2 DEFAULT NULL)
RETURN NUMBER;
set serveroutput on
DECLARE
h NUMBER;
BEGIN
h := dbms_metadata.open('TABLE');
dbms_output.put_line(h);
dbms_metadata.close(h);
END;
/ 400001
Returns a handle that can be used in subsequent calls
dbms_metadata.open_get_fk_constraint_name(
object_type IN VARCHAR2,
schema IN VARCHAR2,
name IN VARCHAR2,
ref_schema IN VARCHAR2,
ref_name IN VARCHAR2)
RETURN NUMBER;
conn sys@pdbdev as sysdba
CREATE TABLE parent (
testcol NUMBER(3));
ALTER TABLE parent
ADD CONSTRAINT pk_parent
PRIMARY KEY (testcol);
Submits an XML document containing object metadata to the database to create the objects
Overload 1
dbms_metadata.put(
handle IN NUMBER,
document IN sys.xmltype,
flags IN NUMBER,
results IN OUT NOCOPY sys.ku$_SubmitResults)
RETURN BOOLEAN;
TBD
Overload 2
dbms_metadata.put(
handle IN NUMBER,
document IN CLOB,
flags IN NUMBER,
results IN OUT NOCOPY sys.ku$_SubmitResults)
RETURN BOOLEAN;
conn sys@pdbdev as sysdba
SELECT COUNT(*)
FROM dba_objects_ae
WHERE object_name = 'SERVERS' and owner = 'SCOTT';
CREATE OR REPLACE PROCEDURE put_table(
tname IN VARCHAR2, fschema IN VARCHAR2, tschema IN VARCHAR2) AUTHID CURRENT_USER IS
dmoh NUMBER; -- OPENW handle
th1 NUMBER; -- ADD_TRANSFORM for MODIFY handle
th2 NUMBER; -- ADD_TRANSFORM for DDL handle
tabxml CLOB; -- table XML
errors sys.ku$_SubmitResults := sys.ku$_SubmitResults();
err_t sys.ku$_SubmitResult;
retval BOOLEAN;
BEGIN
tabxml := dbms_metadata.get_xml('TABLE', tname, 'UWCLASS');
-- specify the object type using OPENW
dmoh := dbms_metadata.openw('TABLE');
-- add the MODIFY transform
th1 := dbms_metadata.add_transform(dmoh, 'MODIFY');
-- specify a schema remap transform
dbms_metadata.set_remap_param(th1, 'REMAP_SCHEMA', fschema, tschema);
-- sanction the DDL transform
th2 := dbms_metadata.add_transform(dmoh, 'DDL');
-- recreates the table
retval := dbms_metadata.put(dmoh, tabxml, 0, errors);
dbms_metadata.close(dmoh);
IF NOT retval THEN
-- display errors if any
FOR i IN errors.FIRST..errors.LAST LOOP
err_t := errors(i);
FOR j IN err_t.errorLines.FIRST .. err_t.errorLines.LAST LOOP
dbms_output.put_line(err_t.errorLines(j).errorText);
END LOOP;
END LOOP;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20001, 'Metadata XML Not Available');
END put_table;
/
set serveroutput on
exec put_table('SERVERS' ,'UWCLASS', 'SCOTT');
SELECT COUNT(*)
FROM dba_objects_ae
WHERE object_name = 'SERVERS'
AND owner = 'SCOTT';
After calling OPEN_GET_FK_CONSTRAINT_NAME, the program calls this for each pair of corresponding columns. The order of calls defines the order of columns in the constraint
dbms_metadata.set_fk_constraint_col_pair(
handle IN NUMBER, -- handle returned by OPEN_GET_FK_CONSTRAINT_NAME
src_col IN VARCHAR2, -- name of column in base table
tgt_col IN VARCHAR2); -- name of corresponding column in ref table
Specify parameters to the XSLT stylesheet identified by transform_handle. Use them to modify or customize the output of the transform
dbms_metadata.set_remap_param(
transform_handle IN NUMBER,
name IN VARCHAR2,
old_value IN VARCHAR2,
new_value IN VARCHAR2,
object_type IN VARCHAR2 DEFAULT NULL);
conn sys@pdbdev as sysdba
set serveroutput on
DECLARE
h NUMBER;
th NUMBER;
BEGIN
SELECT dbms_metadata.openw('TABLE')
INTO h
FROM dual;
th := dbms_metadata.add_transform(h,'MODIFY');
-- prepare for a different schema
dbms_metadata.set_remap_param(th, 'REMAP_SCHEMA', 'UWCLASS', 'IDS');
Specify parameters to the XSLT stylesheet identified by transform_handle. Use them to modify or customize the output of the transform
Overload 1
dbms_metadata.set_transform_param(
transform_handle IN NUMBER,
name IN VARCHAR2,
value IN VARCHAR2),
object_type IN VARCHAR2 DEFAULT NULL,
flags IN NUMBER DEFAULT 0);
Transform Name Parameters
Transform
Applies To
Description
BODY
PACKAGE
TYPE
If TRUE, omit the package body. Defaults to TRUE.
CONSTRAINTS
TABLE
If TRUE, omit all non-referential table constraints. Defaults to TRUE.
CONSTRAINTS_AS_ALTER
TABLE
If TRUE, omit table constraints as separate ALTER TABLE (and, if necessary, CREATE INDEX) statements.
If FALSE, specify table constraints as part of the CREATE TABLE statement. Defaults to FALSE. Requires that CONSTRAINTS be TRUE.
DEFAULT
ALL
ICalling SET_TRANSFORM_PARAM with this parameter set to TRUE has the effect of resetting all parameters for the transform to their default values. Setting this FALSE has no effect. There is no default.
FORCE
VIEW
If TRUE, use the FORCE keyword in the CREATE VIEW statement. Defaults to TRUE.
INHERIT
ALL
If TRUE, inherits session-level parameters. Defaults to FALSE. If an application calls ADD_TRANSFORM to add the DDL transform,
then by default the only transform parameters that apply are those explicitly set for that transform handle. This has no effect if the transform handle is the session transform handle.
INSERT
OUTLINE
If TRUE, emit the INSERT statements into the OL$ dictionary tables that will create the outline and its hints. If FALSE, emit a CREATE OUTLINE statement. Defaults to FALSE.
Note: This object type is being deprecated.
OID
TABLE
TYPE
If TRUE, emit the OID clause for object tables. Defaults to FALSE.
PARTITIONING
INDEX
TABLE
Omit partitioning clause: Defaults to TRUE
PCTSPACE
CLUSTER
INDEX
TABLE
TABLESPACE
A number representing the percentage by which space allocation for the object type is to be modified. The value is the number of one-hundreths of the current allocation. For example, 100 means 100%.
If the object type is TABLESPACE, the following size values are affected:
in file specifications, the value of SIZE
MINIMUM EXTENT
EXTENT MANAGEMENT LOCAL UNIFORM SIZE
For other object types, INITIAL and NEXT are affected.
PRETTY
ALL
Format the output with indentation and line feeds. Defaults to TRUE
REF_CONSTRAINTS
TABLE
If TRUE, emit all referential constraints (foreign keys). Defaults to TRUE.
REUSE
TABLESPACE
If TRUE, include the REUSE parameter for datafiles in a tablespace to indicate that existing files can be reused.
Defaults to FALSE.
REVOKE_FROM
ROLE
The name of a user from whom the role must be revoked.
If this is a non-null string and if the CREATE ROLE statement grants you the role, a REVOKE statement is emitted after the CREATE ROLE.
Note: When you issue a CREATE ROLE statement, Oracle may grant you the role. You can use this transform parameter to undo the grant.
Defaults to null string.
SEGMENT_ATTRIBUTES
CLUSTER
CONSTRAINT
INDEX
TABLE
TABLESPACE
If TRUE, emit segment attributes (physical attributes, storage attributes, tablespace, logging). Defaults to TRUE.
SIZE_BYTE_KEYWORD
TABLE
If TRUE, emit the BYTE keyword as part of the size specification of CHAR and VARCHAR2 columns that use byte semantics. If FALSE, omit the keyword. Defaults to FALSE.
SPECIFICATION
PACKAGE
TYPE
If TRUE, emit the package specification. Defaults to TRUE.
SQLTERMINATOR
ALL
Append a SQL terminator ";" or "/" to each DDL statement. Defaults to FALSE
STORAGE
CLUSTER
CONSTRAINT
INDEX
TABLE
If TRUE, emit storage clause. (Ignored if SEGMENT_ATTRIBUTES is FALSE.) Defaults to TRUE.
TABLESPACE
CLUSTER
CONSTRAINT
INDEX
TABLE
If TRUE, emit segment attributes (physical attributes, storage attributes, tablespace, logging). Defaults to TRUE.
conn uwclass/uwclass@pdbdev
set long 2000000
set pagesize 0
SELECT dbms_metadata.get_ddl('TABLE', 'SERVERS')
FROM dual;
-- omit the storage clause
exec dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'STORAGE', FALSE);
SELECT dbms_metadata.get_ddl('TABLE', 'SERVERS')
FROM dual;
-- omit the segment attributes clause
exec dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'SEGMENT_ATTRIBUTES', FALSE);
SELECT dbms_metadata.get_ddl('TABLE', 'SERVERS')
FROM dual;
SELECT dbms_metadata.get_ddl('TABLE', 'SERVERS')
FROM dual;
Overload 2
dbms_metadata.set_transform_param(
transform_handle IN NUMBER,
name IN VARCHAR2,
value IN BOOLEAN DEFAULT TRUE,
object_type IN VARCHAR2 DEFAULT NULL,
flags IN NUMBER DEFAULT 0);
TBD
Overload 3
dbms_metadata.set_transform_param(
transform_handle IN NUMBER,
name IN VARCHAR2,
value IN NUMBER,
object_type IN VARCHAR2 DEFAULT NULL,
flags IN NUMBER DEFAULT 0);
CREATE TYPE tableddl_ty AS OBJECT (
table_name VARCHAR2(30),
orig_schema VARCHAR2(30),
orig_ddl CLOB,
comp_schema VARCHAR2(30),
comp_ddl CLOB);
/
CREATE TYPE tableddl_ty_tb AS TABLE OF tableddl_ty;
/
CREATE OR REPLACE FUNCTION tableddl_fc (input_values SYS_REFCURSOR)
RETURN tableddl_ty_tb PIPELINED IS
PRAGMA AUTONOMOUS_TRANSACTION;
-- variables to be passed in by sys_refcursor
table_name VARCHAR2(30);
orig_schema VARCHAR2(30);
comp_schema VARCHAR2(30);
-- setup output record of TYPE tableddl_ty
out_rec tableddl_ty := tableddl_ty(NULL,NULL,NULL,NULL,NULL);
-- set up handles to be used for setup and fetching metadata information.
-- handles are used to keep track of the different objects (DDL) referenced in the PL/SQL code
hOpenOrig0 NUMBER;
hOpenOrig NUMBER;
hOpenComp NUMBER;
hModifyOrig NUMBER;
hTransDDL NUMBER;
dmsf PLS_INTEGER;
/* CLOBs to hold DDL
Orig_ddl0 will hold the baseline DDL for the object to be compared
Orig_ddl1 will also hold the baseline DDL for the object to be compared against
but will also go through some translations before being compared against Comp_ddl2
Comp_ddl2 will contain the DDL to be compared against the baseline */
Orig_ddl0 CLOB;
Orig_ddl1 CLOB;
Comp_ddl2 CLOB;
ret NUMBER;
BEGIN
-- Strip off Attributes not concerned with in DDL. If you are concerned with TABLESPACE, STORAGE, or SEGMENT information just comment out these few lines
dmsf := dbms_metadata.session_transform;
dbms_metadata.set_transform_param(dmsf, 'TABLESPACE', FALSE);
dbms_metadata.set_transform_param(dmsf, 'STORAGE', FALSE);
dbms_metadata.set_transform_param(dmsf, 'SEGMENT_ATTRIBUTES', FALSE);
-- loop through each of the rows passed in by the reference cursor
LOOP
-- fetch the input cursor into PL/SQL variables
FETCH input_values INTO table_name, orig_schema, comp_schema;
EXIT WHEN input_values%NOTFOUND;
/* Here is the first use of our handles for pointing to the original table DDL
It names the object_type (TABLE), provides the name of the object (our PL/SQL
variable table_name), and states the schema it is from */
hOpenOrig0 := dbms_metadata.open('TABLE');
dbms_metadata.set_filter(hOpenOrig0,'NAME',table_name);
dbms_metadata.set_filter(hOpenOrig0,'SCHEMA',orig_schema);
/* Setup handle again for the original table DDL that will undergo transformation
We setup two handles for the original object DDL because we want to be able to
Manipulate one set for comparison but output the original DDL to the user */
hOpenOrig := dbms_metadata.open('TABLE');
dbms_metadata.set_filter(hOpenOrig,'NAME',table_name);
dbms_metadata.set_filter(hOpenOrig,'SCHEMA',orig_schema);
-- setup handle for table to compare original against
hOpenComp := dbms_metadata.open('TABLE');
dbms_metadata.set_filter(hOpenComp,'NAME',table_name);
dbms_metadata.set_filter(hOpenComp,'SCHEMA',comp_schema);
/* Modify the transformation of "orig_schema" to take on ownership of "comp_schema"
If we didn't do this, when we compared the original to the comp objects there
would always be a difference because the schema_owner is in the DDL generated */
hModifyOrig := dbms_metadata.add_transform(hOpenOrig,'MODIFY');
dbms_metadata.set_remap_param(hModifyOrig,'REMAP_SCHEMA',orig_schema,comp_schema);
-- created DDL instead of peforming an XML comparison
hTransDDL := dbms_metadata.add_transform(hOpenOrig0,'DDL');
hTransDDL := dbms_metadata.add_transform(hOpenOrig ,'DDL');
hTransDDL := dbms_metadata.add_transform(hOpenComp ,'DDL');
-- get the DDD and store into the CLOB PL/SQL variables
Orig_ddl0 := dbms_metadata.fetch_clob(hOpenOrig0);
Orig_ddl1 := dbms_metadata.fetch_clob(hOpenOrig);
-- here we are providing for those instances where the baseline object does not exist in the Comp_schema
BEGIN
Comp_ddl2 := dbms_metadata.fetch_clob(hOpenComp);
EXCEPTION
WHEN OTHERS THEN
comp_ddl2 := 'DOES NOT EXIST';
END;
-- compare the two DDL statements and output any row if not equal
ret := dbms_lob.compare(Orig_ddl1, Comp_ddl2);
IF ret != 0 THEN
out_rec.table_name := table_name;
out_rec.orig_schema := orig_schema;
out_rec.orig_ddl := Orig_ddl0;
out_rec.comp_schema := comp_schema;
out_rec.comp_ddl := Comp_ddl2;
PIPE ROW(out_rec);
END IF;
-- cleanup and release the handles
dbms_metadata.close(hOpenOrig0);
dbms_metadata.close(hOpenOrig);
dbms_metadata.close(hOpenComp);
END LOOP;
RETURN;
END TABLEDDL_FC;
/
SELECT *
FROM TABLE(tableddl_fc(CURSOR(SELECT table_name, owner, 'UWCLASS' FROM dba_all_tables where owner = 'ABC')));