1

我发现了许多示例,展示了如何使用嵌套表列创建表以及如何“手动”更新它们,如步骤 1-5 中所述。

我想做的是:直接/自动从数据库中的其他表(具有相同结构的NEW_TBL-)更新嵌套表列(示例中的“cust_info”),而不是手动输入一个接一个的值。

(1) 创建对象:

CREATE TYPE TEST_OBJECT_T AS OBJECT
(
x   NUMBER,
y   NUMBER 
);

(2) 创建集合:

CREATE  TYPE TEST_OBJ_TBL IS TABLE OF TEST_OBJECT_T;

(3) 用嵌套表列创建表

create table aaaTable
 (
 CUSTID number,
 cust_info TEST_OBJ_TBL
 )
 NESTED TABLE cust_info STORE AS xx_tbl
 ;

(4) --插入数据

insert into AAATABLE  
 VALUES (1,TEST_OBJ_TBL(
                             TEST_OBJECT_T(33,77),
                             TEST_OBJECT_T(66,67),
                             TEST_OBJECT_T(320,999)
                            )
        );

++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++

insert into AAATABLE  
 VALUES (2,TEST_OBJ_TBL(
                             TEST_OBJECT_T(444,555),
                             TEST_OBJECT_T(333,67),
                             TEST_OBJECT_T(111,978)
                            )
        );

(5)查询2查看结果

 select T1.custid ,T2.*
  from AAATABLE T1 , table(T1. CUST_INFO) T2;

results :
CUSTID          X          Y
---------- ---------- ----------
         1         33         77 
         1         66         67 
         1        320        999 
         2        444        555 
         2        333         67 
         2        111        978

(6)新建表,作为更新嵌套表列的数据源)

create table new_tbl
(
X1  NUMBER,
Y1  NUMBER 
);

(7) 向新表中插入数据

insert into NEW_TBL values (222,444);
insert into NEW_TBL values (345,777);
insert into NEW_TBL values (867,222);

+++++++++++++++++++++++++++++++++++

select * from NEW_TBL


   X 1         Y1
---------- ----------
       222        444 
       345        777 
       867        222 

问题再次:我可以将“new_tbl”数据批量插入嵌套表列(“cust_info”)(意思是 - 替换第 4 阶段 TEST_OBJECT_T(33,77)、TEST_OBJECT_T(66,67)、TEST_OBJECT_T(320,999)的数据 )我尝试使用批量收集但没有成功。

谢谢克伦

4

1 回答 1

1

您可以使用COLLECT功能(与 CAST)

update aaatable d
set d.cust_info = (select cast ( collect(TEST_OBJECT_T(x1,y1)) as TEST_OBJ_TBL ) from new_tbl)
where d.custid = 1;

这是一个 sqlfiddle 演示

于 2013-09-30T06:20:48.170 回答