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 VARCHAR2,RET 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;