是否可以运行dbms_metadata.get_ddl并排除列默认值和虚拟列?

问题描述 投票:0回答:1

示例:

从用户表中选择 dbms_metadata.get_ddl('TABLE', table_name, 'BOB') WHERE 表名 = '约会';

具有各种变换渲染:

create table "bob"."appointments"
       (
        "appointment_id" number(12,0)                   default "bob"."appointment_id"."nextval",
        "appointment_title" varchar2(50 byte),
        "appointment_priority"                          number generated always as <some logic> virtual
       ) ;

可以从输出中删除默认值和虚拟列吗?

oracle ddl dbms-metadata
1个回答
0
投票

一般来说,您可以使用

DBMS_METADATA.SET_TRANSFORM_PARAM
来更改
DBMS_METADATA
包的输出。

鉴于设置:

CREATE SEQUENCE "appointment_id";

create table "appointments"
       (
        "appointment_id" number(12,0)                   default "appointment_id".nextval,
        "appointment_title" varchar2(50 byte),
        "appointment_priority"                          number generated always as (1) virtual
       ) ;

然后:

SELECT dbms_metadata.get_ddl(
          'TABLE',
          'appointments',
          USER
       )
FROM   DUAL;

输出:

DBMS_METADATA.GET_DDL('表','约会',用户)

  创建表 "FIDDLE_QANZBEWAVFHDLPFZAAC"."约会"
   ( "appointment_id" NUMBER(12,0) DEFAULT "FIDDLE_QANZBEWCAVFHDLPFZAAC"."appointment_id"."NEXTVAL",
"appointment_title" VARCHAR2 (50),
“appointment_priority”已生成数字始终为 (1) 虚拟
   ) 延迟创建段
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS 日志记录
  表空间“用户”

并且,如果您应用一些变换参数:

BEGIN
  DBMS_METADATA.set_transform_param(
    DBMS_METADATA.session_transform,
    'SQLTERMINATOR',
    TRUE
  );
  DBMS_METADATA.set_transform_param(
    DBMS_METADATA.session_transform,
    'PRETTY',
    TRUE
  );
  DBMS_METADATA.set_transform_param(
    DBMS_METADATA.session_transform,
    'SEGMENT_ATTRIBUTES',
    FALSE
  );
  DBMS_METADATA.set_transform_param(
    DBMS_METADATA.session_transform,
    'STORAGE',
    FALSE
  );
  DBMS_METADATA.set_transform_param(
    DBMS_METADATA.session_transform,
    'CONSTRAINTS',
    FALSE
  );
END;
/

SELECT dbms_metadata.get_ddl(
          'TABLE',
          'appointments',
          USER
       )
FROM   DUAL;

然后输出更改为:

DBMS_METADATA.GET_DDL('表','约会',用户)

  创建表 "FIDDLE_HKDFRKLPCSXVVQXILGQE"."约会"
   ( "appointment_id" NUMBER(12,0) DEFAULT "FIDDLE_HKDFRKLPCSXVVQXILGQE"."appointment_id"."NEXTVAL",
"appointment_title" VARCHAR2(50),
“appointment_priority”已生成数字始终为 (1) 虚拟
   ) ;

DBMS_METADATA
文档中给出了转换参数的完整列表,并且回答您的具体问题:

可以从输出中删除默认值和虚拟列吗?

仅使用

DBMS_METADATA
包,不,似乎没有任何转换参数会禁用列的
DEFAULT
GENERATED
子句的输出。

如果您想删除这些子句,那么您需要在生成 DDL 语句后通过重写查询来执行此操作(可能使用简单的正则表达式 - 在最简单的情况下查找

DEFAULT
GENERATED
并删除一切,直到下一个逗号或
VIRTUAL
关键字 - 或者,在更复杂的情况下,通过将查询解析为抽象语法树并修剪适当的分支)。

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.