为什么 Oracle 的 dbms_metadata.get_ddl 返回不同的结果?

Why is Oracle's dbms_metadata.get_ddl returning different results?

我正在尝试使用 dbms_metadata.get_ddl 比较两个模式。这两个模式是使用完全相同的 SQL 脚本创建的。但是,在一个主键上,我发现 DDL 有所不同:

ALTER TABLE "SCHEMA_NAME"."AUDIT_EVENTS_LOG" ADD CONSTRAINT "AUDIT_EVENTS_LOG_PK" PRIMARY KEY ("LOG_ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "DATA_INDEX"  ENABLE

对比:

  ALTER TABLE "SCHEMA_NAME"."AUDIT_EVENTS_LOG" ADD CONSTRAINT "AUDIT_EVENTS_LOG_PK" PRIMARY KEY ("LOG_ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  TABLESPACE "DATA_INDEX"  ENABLE

两个模式都位于同一个数据库实例上。用于创建此主键的脚本,用于两个模式,是:

ALTER TABLE "AUDIT_EVENTS_LOG" ADD CONSTRAINT "AUDIT_EVENTS_LOG_PK" PRIMARY KEY ("LOG_ID")
  USING INDEX  TABLESPACE "DATA_INDEX" ENABLE;

当 GET_DDL 使用完全相同的脚本创建时,什么会导致结果不同?

查看 DBMS_METADATA.SET_TRANSFORM_PARAM,尤其是 STORAGE 参数。

您第一次调用 DBMS_METADATA.GET_DDL 似乎启用了它(这是默认设置),但第二次调用没有。

如果您希望每次都能获得完全相同的结果,那么请注意提前调用 SET_TRANSFORM_PARAM 以了解影响输出的每个设置。