You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Oracle的dbms_metadata.fetch_ddl输出中移除闪回归档语句

移除DBMS_METADATA输出中的FLASHBACK ARCHIVE ALTER语句

问题描述

执行dbms_metadata.fetch_ddl或dbms_metadata.get_ddl生成表的DDL时,输出会额外包含ALTER TABLE "SCHEMA"."TABLE" FLASHBACK ARCHIVE "ARCHIVE_NAME"语句,希望通过DBMS_METADATA自带的配置移除这条语句,尽量避免用正则表达式处理。已经尝试调整set_transform_parameter的所有可见选项,但均无法生效。

另外发现一个特殊现象:即使将SQLTERMINATOR参数设为true,这条FLASHBACK ARCHIVE的ALTER语句末尾也不会添加分号。

解决方案

可以通过设置FLASHBACK_ARCHIVE这个transform参数来禁用该语句的生成,在你的脚本中添加一行配置即可:

dbms_metadata.set_transform_param (ddl_handle, 'FLASHBACK_ARCHIVE', false);

修改后的完整脚本

set SERVEROUTPUT ON

declare
  metadata_handle number;
  transform_handle number;
  ddl_handle number;
  result_array sys.ku$_ddls;

begin

  metadata_handle := dbms_metadata.open('TABLE');
--  transform_handle := dbms_metadata.add_transform(metadata_handle, 'MODIFY');
--  dbms_metadata.set_remap_param(transform_handle, 'REMAP_NAME', 'TABLE1', 'TABLE2');
--  dbms_metadata.set_remap_param(transform_handle, 'REMAP_SCHEMA', 'X', 'Y');
  ddl_handle := dbms_metadata.add_transform(metadata_handle, 'DDL');
  dbms_metadata.set_transform_param (ddl_handle, 'SQLTERMINATOR', true);
  dbms_metadata.set_transform_param (ddl_handle, 'PRETTY', true);
  dbms_metadata.set_transform_param (ddl_handle, 'SEGMENT_ATTRIBUTES', false);
  dbms_metadata.set_transform_param (ddl_handle, 'STORAGE', false);
  dbms_metadata.set_transform_param (ddl_handle, 'TABLESPACE', false);
  dbms_metadata.set_transform_param (ddl_handle, 'PARTITIONING', false);
  dbms_metadata.set_transform_param (ddl_handle, 'CONSTRAINTS', false);
  -- 添加这一行禁用FLASHBACK ARCHIVE语句
  dbms_metadata.set_transform_param (ddl_handle, 'FLASHBACK_ARCHIVE', false);
  dbms_metadata.set_filter(metadata_handle, 'SCHEMA', 'SCHEMA_NAME');


  loop
    result_array := dbms_metadata.fetch_ddl(metadata_handle);
    exit when result_array is null;
      for i in result_array.first..result_array.last loop
      dbms_output.put_line(result_array(i).ddltext);
    end loop;
  end loop; 
  dbms_metadata.close(metadata_handle);
end;
/

关于SQLTERMINATOR的补充说明

这条FLASHBACK ARCHIVE的ALTER语句属于DBMS_METADATA生成的独立DDL条目,默认逻辑下不会为这类附加语句自动添加终止符。不过添加上述FLASHBACK_ARCHIVE=false的参数后,这条语句会被直接移除,也就无需再处理终止符的问题了。

内容的提问来源于stack exchange,提问作者Josh Reynolds

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 16:03:17