DBMS_METADATA提供了获取数据库对象的元数据信息的方法,用于重建数据库中的对象。元数据信息以XML形式或者DDL语句的形式返回。
DBMS_METADATA子程序总览
子程序 | 说明 |
GET_DDL Function | 获取对象的DDL。 |
GET_DDL
该函数用于获取对象的DDL(Data Definition Language,数据库模式定义语言),函数定义在DBMS_METADATA包中。
语法
FUNCTION get_ddl(
object_type IN VARCHAR2,
name IN VARCHAR2,
schema IN VARCHAR2 DEFAULT NULL,
version IN VARCHAR2 DEFAULT 'compatible',
model IN VARCHAR2 DEFAULT 'polardb',
transform IN VARCHAR2 DEFAULT 'ddl'
) RETURN CLOB
参数说明
参数 | 说明 |
object_type | 对象的类型。支持的类型见类型表。 |
name | 对象的名称。 |
schema | (可选参数)对象所属的模式。 |
version | (可选参数)对象的元数据版本,PolarDB仅做参数兼容。 |
model | (可选参数)元数据的类型,PolarDB仅做参数兼容。 |
transform | (可选参数)用于修改对象,PolarDB仅做参数兼容。 |
示例
该示例以表类型为例,介绍使用DBMS_METADATA.GET_DDL
获取对象的DDL语句。
在public模式下创建表t
,然后使用DBMS_METADATA.GET_DDL
获取其DDL语句。其中,对象类型为 table,对象名为 t,对象所属的模式为 public。
CREATE TABLE t(a int, b text);
SELECT DBMS_METADATA.GET_DDL('table', 't', 'public');
get_ddl
---------------------------------------
CREATE TABLE IF NOT EXISTS public.t (
a integer,
b text COLLATE "default"
)
(1 row)
在调用DBMS_METADATA.GET_DDL
时不指定模式,会在当前模式下查找对象。
注意事项
参数大小写
对象类型是大小写不敏感的,以表类型为例,table、TABLE、Table是等价的。
对象名是大小写敏感的,如果对象名为BIG_t,使用big_t则无法查到该对象。
模式名是大小写敏感的,如果模式为public,使用PUBLIC则无法查到该对象。
对于大写的对象名和模式名,获取的DDL中会在对象名和模式名上加双引号,以保证大小写敏感。
示例如下:
CREATE TABLE "BIG_t"("BIG_a" int, "BIG_b" text);
# 对象类型大小写不敏感:table/TABLE均可
SELECT DBMS_METADATA.GET_DDL('table', 'BIG_t', 'public');
get_ddl
---------------------------------------------
CREATE TABLE IF NOT EXISTS public."BIG_t" (
"BIG_a" integer,
"BIG_b" text COLLATE "default"
)
(1 row)
SELECT DBMS_METADATA.GET_DDL('TABLE', 'BIG_t', 'public');
get_ddl
---------------------------------------------
CREATE TABLE IF NOT EXISTS public."BIG_t" (
"BIG_a" integer,
"BIG_b" text COLLATE "default"
)
(1 row)
# 对象名、模式名大小写敏感,大小写错误就会导致无法找到对象
SELECT DBMS_METADATA.GET_DDL('table', 'big_t', 'public');
ERROR: Polar-31603: Object "big_t" of type "table" not found in schema "public"
SELECT DBMS_METADATA.GET_DDL('table', 'BIG_t', 'PUBLIC');
ERROR: Polar-31603: Object "BIG_t" of type "table" not found in schema "PUBLIC"
不支持模式的类型
对于部分对象,无法指定模式名,因为这些对象不属于某个模式。以role类型为例,对其指定模式名时,会抛出-31600号异常。
create role role1; select dbms_metadata.get_ddl('role', 'role1'); get_ddl ------------------------------------------- CREATE ROLE role1 WITH NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOLOGIN NOREPLICATION NOBYPASSRLS CONNECTION LIMIT -1 PASSWORD NULL (1 row) select dbms_metadata.get_ddl('role', 'role1', 'public'); ERROR: Polar-31600: Invalid input value "public" for parameter SCHEMA in function get_ddl DETAIL: No need to specify schema for type ROLE/USER
对于部分类型,例如,触发器,在Oracle中可以指定模式名,但是在PolarDB中无法指定模式名,因为触发器不属于某个模式。为了与Oracle保持兼容,在指定模式名时不会报错,只打印一条警告,提示该模式名被忽略,然后继续返回结果。
create trigger trigger1 after insert on public.t for each row execute procedure print_insert(); select dbms_metadata.get_ddl('trigger', 'trigger1', 'public'); WARNING: No need to specify schema for trigger, ignore it. get_ddl ----------------------------------------------------------------------------------------------------------------------------------- create trigger trigger1 after insert on public.t each row execute procedure print_insert() (1 row)
支持的类型
当前版本支持获取DDL的对象类型如下:
类型 | 说明(是否支持指定schema) |
索引(index) | 支持指定schema。 |
视图(view) | 支持指定schema。 |
物化视图(materialized_view) | 支持指定schema。 |
函数(function) | 支持指定schema。 |
存储过程(procedure) | 支持指定schema。 |
触发器(trigger) | 不支持指定schema。 |
约束(constraint) | 支持指定schema。 |
表(table) | 支持指定schema。 |
表空间(tablespace) | 不支持指定schema。 |
角色(role) | 不支持指定schema。 |
用户(user) | 不支持指定schema,与role基本一致。 |
异常信息
PolarDB的DBMS_METADATA.GET_DDL
函数主要有以下两类常见的异常。
出现对象类型错误、对象类型为空、对象名为空等错误时,抛出异常,错误码为-31600,表示参数异常。
出现对象无法找到时,抛出异常,错误码为-31603,表示找不到对象。