When you retrieve metadata, you use the DBMS_METADATA
PL/SQL API. The following examples illustrate the programmatic and browsing interfaces.
Table 21-1 for descriptions of DBMS_METADATA
procedures used in the programmatic interface
Table 21-2 for descriptions of DBMS_METADATA
procedures used in the browsing interface
Oracle Database PL/SQL Packages and Types Reference for a complete description of the DBMS_METADATA
API.
Example 21-1 provides a basic demonstration of how you might use the DBMS_METADATA
programmatic interface to retrieve metadata for one table. It creates a DBMS_METADATA
program that creates a function named get_table_md
. This function returns metadata for one table.
You can use the browsing interface and get the same results, as shown in Example 21-2.
Example 21-1 Using the DBMS_METADATA Programmatic Interface to Retrieve Data
Create a DBMS_METADATA
program that creates a function named get_table_md
, which will return the metadata for one table, timecards
, in the hr
schema. The content of such a program looks as follows. (For this example, name the program metadata_program
.sql
.)
CREATE OR REPLACE FUNCTION get_table_md RETURN CLOB IS -- Define local variables. h NUMBER; --handle returned by OPEN th NUMBER; -- handle returned by ADD_TRANSFORM doc CLOB; BEGIN -- Specify the object type. h := DBMS_METADATA.OPEN('TABLE'); -- Use filters to specify the particular object desired. DBMS_METADATA.SET_FILTER(h,'SCHEMA','HR'); DBMS_METADATA.SET_FILTER(h,'NAME','TIMECARDS'); -- Request that the metadata be transformed into creation DDL. th := DBMS_METADATA.ADD_TRANSFORM(h,'DDL'); -- Fetch the object. doc := DBMS_METADATA.FETCH_CLOB(h); -- Release resources. DBMS_METADATA.CLOSE(h); RETURN doc; END; /
Connect as user hr
.
Run the program to create the get_table_md
function:
SQL> @metadata_program
Use the newly created get_table_md
function in a select operation. To generate complete, uninterrupted output, set the PAGESIZE
to 0 and set LONG
to some large number, as shown, before executing your query:
SQL> SET PAGESIZE 0 SQL> SET LONG 1000000 SQL> SELECT get_table_md FROM dual;
The output, which shows the metadata for the timecards
table in the hr
schema, looks similar to the following:
CREATE TABLE "HR"."TIMECARDS" ( "EMPLOYEE_ID" NUMBER(6,0), "WEEK" NUMBER(2,0), "JOB_ID" VARCHAR2(10), "HOURS_WORKED" NUMBER(4,2), FOREIGN KEY ("EMPLOYEE_ID") REFERENCES "HR"."EMPLOYEES" ("EMPLOYEE_ID") ENABLE ) 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 "EXAMPLE"
Example 21-2 Using the DBMS_METADATA Browsing Interface to Retrieve Data
SQL> SET PAGESIZE 0 SQL> SET LONG 1000000 SQL> SELECT DBMS_METADATA.GET_DDL('TABLE','TIMECARDS','HR') FROM dual;
The results will be the same as shown in step 5 for Example 21-1.