我正在尝试修改数据类型,同时保留现有数据。这是当前的设置:
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
命令以插入到新表中,但这似乎过多了。我希望有人能够提出一个更简单的解决方案。
答案 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
子句将数据类型更改传播到依赖对象,无论是表还是其他数据类型。