修改列数据类型时保留数据

时间:2013-12-03 18:16:13

标签: sql oracle

我正在尝试修改数据类型,同时保留现有数据。这是当前的设置:

create or replace type xyz.Varray2 is varray(50) of varchar2(20);

CREATE TABLE xyz.owner (
MODIFIED DATE,
ID Varchar(18),
STATE Varchar(2),
CONTRIBUTOR_IDS xyz.Varray2
)

示例记录如下所示:

10-MAR-13 408923100000000002 CA VARRAY2('Bob', 'Tom', 'Mary', 'Henry', 'Bart')

我需要将Varray2数据类型修改为varray(150)。我宁愿保留Varray2类型,但如果需要,可以创建一个新的Varray3类型以供使用。

此表包含需要保留的数百万条记录。为了修改现有的Varray2类型,我必须删除表,这是我的第一个问题。我尝试导出表,然后在将Varray2更改为150后导入它,但它会给出类型不同的错误。我尝试使用新数据类型创建备份表,但在尝试保存数据时出错(再次出现不兼容的类型)。它不允许我动态修改列数据类型(ORA-22859)。

我即将编写一个游标甚至一个bash脚本来解析假脱机输出以生成INSERT命令以插入到新表中,但这似乎过多了。我希望有人能够提出一个更简单的解决方案。

1 个答案:

答案 0 :(得分:3)

可以使用varray2语句增加alter type数据类型的上限:

create or replace type Varray2 is varray(50) of varchar2(20);
/
TYPE VARRAY2 compiled


create table owner (
  modified        date,          
  id1             Varchar2(18),  --   use varchar2 data type, not varchar. 
  state           Varchar2(2),  
  contributer_ids Varray2
)
/

table OWNER created.

有关varray2数据类型的当前信息:

SQL> clear screen;
SQL> column type_name format a11;
SQL> column upper_bound format a11

SQL> select t.type_name
  2       , t.upper_bound
  3   from all_coll_types t
  4  where type_name = 'VARRAY2';

TYPE_NAME   UPPER_BOUND
----------- -----------
VARRAY2              50 

更改varray2数据类型的上限:

SQL> alter type Varray2 modify limit 150 cascade;

type VARRAY2 altered.

varray2数据类型的上限发生变化后:

SQL> clear screen;
SQL> column type_name format a11;
SQL> column upper_bound format a11

SQL> select t.type_name
  2       , t.upper_bound
  3   from all_coll_types t
  4  where type_name = 'VARRAY2';

TYPE_NAME   UPPER_BOUND
----------- -----------
VARRAY2             150 
cascade语句的

alter type子句将数据类型更改传播到依赖对象,无论是表还是其他数据类型。