Plsql 如何批量收集到子查询中UDT所在的类型中
我正在尝试创建一个值集合,我计划对其运行FORALL DELETE FROM[table]。 当我在子查询中有一个UDT时,似乎没有任何东西被批量收集到集合中 这似乎不起作用Plsql 如何批量收集到子查询中UDT所在的类型中,plsql,subquery,oracle12c,user-defined-types,bulk-collect,Plsql,Subquery,Oracle12c,User Defined Types,Bulk Collect,我正在尝试创建一个值集合,我计划对其运行FORALL DELETE FROM[table]。 当我在子查询中有一个UDT时,似乎没有任何东西被批量收集到集合中 这似乎不起作用 SELECT ATTR1 BULK COLLECT INTO tmpTBL1 FROM Table1 WHERE ATTR1 NOT IN (SELECT ATTR1 FROM TABLE(tmpPList)); --99% sure problem is here. 还确认了对象类型中的列大小与Person表中的列大小
SELECT ATTR1
BULK COLLECT INTO tmpTBL1
FROM Table1
WHERE ATTR1 NOT IN (SELECT ATTR1 FROM TABLE(tmpPList)); --99% sure problem is here.
还确认了对象类型中的列大小与Person表中的列大小相同。(我认为填充可能是个问题。)
对象类型
收集类型
存储过程
模拟表数据
tmpPList
__________________________________________
|__attr1__||__attr2__||__attr3__||__attr4__|
jdoe John Doe abcd
fmac Frank Mac efgh
wgab Wayne Gab ijkl
Table1
__________________________________________
|__attr1__||__attr2__||__attr3__||__attr4__|
jdoe John Doe abcd
fmac Frank Mac efgh
wgab Wayne Gab ijkl
mkell Mike Kell mnop
Table2
__________________________________________
|__attr1__||__attr2__||__attr3__||__attr4__|
mdoe Mary Doe abcd
jmac John Mac efgh
mgab Mitch Gab ijkl
mkell Mike Kell mnop
tmpTBL1
_________
|__attr1__|
mkell
Collection1
__________________________________________
|__attr1__||__attr2__||__attr3__||__attr4__|
mkell Mike Kell mnop
Before delete - Person
__________________________________________
|__attr1__||__attr2__||__attr3__||__attr4__|
jdoe John Doe abcd
fmac Frank Mac efgh
wgab Wayne Gab ijkl
mkell Mike Kell mnop
After delete - Person
__________________________________________
|__attr1__||__attr2__||__attr3__||__attr4__|
jdoe John Doe abcd
fmac Frank Mac efgh
wgab Wayne Gab ijkl
当我使用表(tmpPList)时,tmpTBL1不会被值填充。
我希望有记录从个人身上删除。
正在尝试查找亲自存在但在tmpPList中不存在的ATTR1
更新:
使用:Oracle Database 12c Enterprise Edition 12.1.0.2.0版-64位我的问题不在这里
SELECT ATTR1
BULK COLLECT INTO tmpTBL1
FROM Table1
WHERE ATTR1 NOT IN (SELECT ATTR1 FROM TABLE(tmpPList));
而是在这里。不需要整个for循环,没有它FORALL语句也可以正常工作
FOR indx IN 1 .. tmpTBL1.COUNT
LOOP
Collection1(Collection1.COUNT + 1) := tmpPList(indx);
END LOOP;
我的问题不在这里
SELECT ATTR1
BULK COLLECT INTO tmpTBL1
FROM Table1
WHERE ATTR1 NOT IN (SELECT ATTR1 FROM TABLE(tmpPList));
而是在这里。不需要整个for循环,没有它FORALL语句也可以正常工作
FOR indx IN 1 .. tmpTBL1.COUNT
LOOP
Collection1(Collection1.COUNT + 1) := tmpPList(indx);
END LOOP;
FOR indx IN 1 .. tmpTBL1.COUNT
LOOP
Collection1(Collection1.COUNT + 1) := tmpPList(indx);
END LOOP;