DBMS_METADATA包

DBMS_MEATADATA包当前只支持调用GET_DDL来获取数据库对象的定义。

表展示了DBMS_METADATA的子程序。

子程序 说明
函数GET_DDL 通过对象名字或对象OID来获取数据库对象的定义

以下介绍了GET_DDL函数的语法、参数和说明。

示例

示例1: 获取表的定义

 --清理环境
 DROP TABLE TAB1 CASCADE;
 DROP TABLE TAB2 CASCADE;
 DROP TABLE TAB3 CASCADE;

 --  带有 NOT NULL 、 UNIQUE 约束
CREATE TABLE tab1
(
    a   CHAR(3)     NOT NULL UNIQUE,
    b   CHAR(20),
    c   CHAR(6),
    d   DECIMAL(9),
    e   CHAR(15)
);

SELECT DBMS_METADATA.GET_DDL('TABLE','TAB1');
 
--  带有外键、主键约束
CREATE TABLE tab2
(
    aa   CHAR(3)     NOT NULL,
    bb   CHAR(3)     NOT NULL REFERENCES tab1(a),
    cc   DECIMAL(5),
    PRIMARY KEY (aa, cc)
);

SELECT DBMS_METADATA.GET_DDL('TABLE','TAB2');

--  带有 DEFAULT 、 CHECK 约束
CREATE TABLE tab3
(
    aaa   CHAR(30)   NOT NULL UNIQUE,
    bbb   CHAR(20)   DEFAULT 'Bill',
    ccc   DECIMAL(4) CHECK(ccc > 3),
    ddd   CHAR(15)
);

SELECT DBMS_METADATA.GET_DDL('TABLE','TAB3');

--清理环境
 DROP TABLE TAB1 CASCADE;
 DROP TABLE TAB2 CASCADE;
 DROP TABLE TAB3 CASCADE;

示例2: 获取索引的定义

--  清理环境
DROP INDEX IDX1 CASCADE;
DROP TABLE TAB1 CASCADE;

--  创建表
CREATE TABLE TAB1 (A INT, B INT);

--  创建简单索引
CREATE INDEX IDX1 ON TAB1(b);

SELECT DBMS_METADATA.GET_DDL('INDEX','IDX1');

--  删除索引和表
DROP INDEX IDX1;
DROP TABLE TAB1;

示例3: 获取过程的定义

--  清理环境
DROP PROCEDURE PROC1 CASCADE;

--  创建存储过程
CREATE OR REPLACE PROCEDURE PROC1(i INOUT INT, j INT) AS
    res INT;
BEGIN
    res := i + j;
    i := res;
END;
LANGUAGE 'ploscar';

SELECT DBMS_METADATA.GET_DDL('PROCEDURE','PROC1');

--  删除存储过程
DROP PROCEDURE PROC1;

示例4: 通过OID查询数据库对象的定义

DROP PROCEDURE TEST_GET_DDL;
--创建存储过程,用于完成测试
CREATE OR REPLACE PROCEDURE TEST_GET_DDL(TYPE VARCHAR2,NAME VARCHAR2RET OUT CLOB) AS  
OID OID;
DDL_TEXT TEXT;
BEGIN
     SELECT OID FROM SYS_CLASS WHERE RELNAME=NAME INTO OID; 
     SELECT DBMS_METADATA.GET_DDL(TYPE,OID) INTO DDL_TEXT;
     RET = DDL_TEXT;
END;
/
 --  清理环境
DROP TABLE TAB1 CASCADE;
DROP TABLE TAB2 CASCADE;
DROP VIEW VIEW1 CASCADE;
DROP INDEX IDX1 CASCADE;

-- 带有 NOT NULL 、 UNIQUE 约束
CREATE TABLE TAB1(
    a   CHAR(3)     NOT NULL UNIQUE,
    b   CHAR(20),
    c   CHAR(6),
    d   DECIMAL(9),
    e   CHAR(15)
);

EXEC TEST_GET_DDL('TABLE','TAB1',NULL);

CREATE TABLE TAB2 (a INT, b INT, c INT);

--  创建视图
CREATE VIEW VIEW1 AS SELECT * FROM TAB2 WHERE A % 2 = 0 ORDER BY A, B, C;

EXEC TEST_GET_DDL('VIEW','VIEW1',NULL);

--  创建简单索引
CREATE INDEX IDX1 ON TAB1(B);

EXEC TEST_GET_DDL('INDEX','IDX1',NULL);

--  删除创建的东西
DROP INDEX IDX1;
DROP VIEW VIEW1;
DROP TABLE TAB1;
DROP TABLE TAB2;