DBMS_METADATA

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基本一致。

异常信息

PolarDBDBMS_METADATA.GET_DDL函数主要有以下两类常见的异常。

  • 出现对象类型错误、对象类型为空、对象名为空等错误时,抛出异常,错误码为-31600,表示参数异常。

  • 出现对象无法找到时,抛出异常,错误码为-31603,表示找不到对象。