【问题标题】:Oracle: How do I reorder columns using the DBMS_REDEFINITION package?Oracle:如何使用 DBMS_REDEFINITION 包重新排序列?
【发布时间】:2013-07-06 01:21:43
【问题描述】:

我需要使用DBMS_REDEFINITION 包对表中的某些列重新排序。我该如何为诸如

之类的表执行此操作
create table a (z number, x number);

这样重新排序的表的第一列是 x?

(上下文:我正在编写一些实用程序,它们将一些元数据列添加到一些现有的表中,如果元数据列位于前面,这对所有相关人员都会很有用,以便在 sql 中拉起时可以方便地查看它们开发人员或其他表格浏览工具。我知道逻辑处理列顺序无关紧要的论点,但这是为了使用现成的工具使表格更容易理解。)

【问题讨论】:

标签: oracle dbms-redefinition


【解决方案1】:

不确定您的问题是什么,因为手册中解释了用法。

但是由于您的表似乎没有主键(或者您忘记提及),您需要使用特殊标志才能使用 dbms_redefinition 重新定义它:

create table a_ (x number, z number);

begin
  dbms_redefinition.start_redef_table(
    uname => user, 
    orig_table => 'A', 
    int_table => 'A_', 
    options_flag => dbms_redefinition.cons_use_rowid);

  dbms_redefinition.finish_redef_table(
    uname => user, 
    orig_table => 'A', 
    int_table => 'A_');
end;
/

drop table a_;

【讨论】:

  • 大声笑,如果我足够聪明,可以从手册中找出这个干净、准确的例子,我就不必在 Stack Overflow 上提问了!是不是start_redef_table不需要col_mapping参数?
  • @MarkHarrison:如果我没记错的话,只有在重命名列时才需要列映射。
  • 经过测试并完美运行。我以 SYS 身份执行此操作,因为该软件包需要 CREATE ANY ... 授权。
【解决方案2】:

抱歉,我还不能评论你的问题,
那么 rename + create as select 呢?

alter table a rename to a_01;
create a as select x,z from a_01;

???

【讨论】:

  • DMBS_REDEFINITION的主要吸引力在于(a)在线操作,(b)自动处理索引,触发器等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 2013-03-30
  • 1970-01-01
  • 2011-06-23
  • 2011-09-17
  • 2018-06-22
相关资源
最近更新 更多