示例:
从用户表中选择 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
) ;
可以从输出中删除默认值和虚拟列吗?
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
关键字 - 或者,在更复杂的情况下,通过将查询解析为抽象语法树并修剪适当的分支)。