Oracle将旧列移动到新的用户定义类型

时间:2018-04-29 13:41:54

标签: sql database oracle relational-database user-defined-types

我的oracle数据库中有一个表,其中有几列用于表示地址字段,例如:city,street,state ...现在我想使用这样创建的地址UDT:

CREATE TYPE ADDRESS AS OBJECT
( 
state NUMBER(6),
street CHAR(50),
city CHAR(50),
)

如何在新列中移动旧列并将其转换为此新对象?

2 个答案:

答案 0 :(得分:2)

你要求的是在表格中有一张桌子。这样做的方法是定义你的类型,然后将你的新表定义为如下所示(将Gordon的建议考虑在内,因为这是正确的方法,并添加了N前缀以包含多个语言支持):

创建类型

CREATE TYPE FULL_ADDRESS_T AS OBJECT
 ( state  NUMBER(6)     ,
   street NVARCHAR2(50) ,
   city   NVARCHAR2(50)   ) ;

创建新表

CREATE TABLE MY_TABLE AS 
 ( First_Name   NVARCHAR2(32)   ,
   Mid_Name     NVARCHAR2(32)   ,
   Last_Name    NVARCHAR2(32)   ,
   Address      FULL_ADDRESS_T    ) ;

请注意,这会使操作变得更加复杂。

答案 1 :(得分:1)

创建TYPE

CREATE TYPE ADDRESS_TYP AS OBJECT
( 
state NUMBER(6),
street VARCHAR2(50),
city VARCHAR2(50)
);

ADD TABLE

的对象类型列
ALTER TABLE YOURTABLE ADD ( ADDRESS ADDRESS_TYP );

从列中的现有值更新新的ADDRESS列。

UPDATE YOURTABLE SET  ADDRESS = ADDRESS_TYP( state,street,city );

其余的由您决定是否要保留表中的旧列。但是,如果您要删除这些列,请清楚地了解INDEX,FOREIGN KEY等依赖项。

对于大型数据集,更新可能有点慢。您可以使用此处讨论的一些技巧:Ask TOM