Oracle嵌套表追加

时间:2013-12-19 10:25:28

标签: sql oracle nested

我有一个oracle嵌套表,如下所示:

create table test_tab
(
Col1        VARCHAR,
Col2        VARCHAR,
Col3        VARCHAR,
Col4       Coltype,
PK(col1,col2,col3)
 );

Coltype定义:

create type Coltype as varray(10) of Coltuple;

Coltuple定义:

create type remarktuple as object
(
ColX varchar,
Coly varchar,
Colz varchar
);

我插入了一行

insert into test_tab values('A','B','C',Coltype(Coltuple('X','Y','Z'));

现在,如果我想将Coltype(Coltupele('P','Q','R'))插入到同一个A,B,C行,我该怎么办?... 当我使用像insert into test_tab values('A','B','C',Coltype(Coltuple('P','Q','R'));这样的单独插入时,由于PK声音,它假定它是第二个插入并抛出错误。

希望我已清楚地解释了我的要求。提前谢谢。

2 个答案:

答案 0 :(得分:1)

根据上面的定义,Col4不是嵌套表;这是一种变形。要使Col4成为嵌套表,首先,Coltype应定义为:

CREATE TYPE Coltype AS TABLE of Coltuple;

然后,test_tab应定义如下:

CREATE TABLE test_tab
(
Col1        VARCHAR2(30),
Col2        VARCHAR2(30),
Col3        VARCHAR2(30),
Col4        Coltype,
PRIMARY KEY (col1,col2,col3)
)
NESTED TABLE Col4 STORE AS ColtypeStoreTab;

现在,将(Col1,Col2,Col3)定义为父表的主键,无法插入值为('A','B','C')的另一行,而表中已存在此行,除非放宽父表的主键约束。 很可能,您希望将('P','Q','R')插入到(Col1,Col2,Col3)('A','B','C')的父表行的嵌套表中。如果是这种情况,可以通过以下方式实现:

INSERT INTO TABLE(SELECT Col4 FROM test_tab 
                  WHERE Col1 = 'A' AND Col2 = 'B' AND  Col3 = 'C')
VALUES('P','Q','R');

答案 1 :(得分:0)

另一种方法是:

UPDATE test_tab 
SET Col4 = Col4 MULTISET UNION Coltype(Coltuple('P','Q','R'))
WHERE Col1 = 'A' AND Col2 = 'B' AND  Col3 = 'C';