Я пытаюсь создать коллекцию значений, для которых я планирую запустить FORALL DELETE FROM [table] on.Когда у меня есть UDT в подзапросе, кажется, что ничто не собирается в коллекцию.
Это не похоже на работу.
SELECT ATTR1
BULK COLLECT INTO tmpTBL1
FROM Table1
WHERE ATTR1 NOT IN (SELECT ATTR1 FROM TABLE(tmpPList)); --99% sure problem is here.
Также подтвердили, что размеры столбцов вТип объекта одинаковых размеров в таблице Person.(Заполнение мыслей могло быть проблемой.)
Тип объекта
CREATE OR REPLACE type dbo.P_REC AS OBJECT
(
ATTR1 VARCHAR2(64 BYTE),
ATTR2 VARCHAR2(128 BYTE),
ATTR3 VARCHAR2(128 BYTE),
ATTR4 VARCHAR2(128 BYTE)
);
Тип коллекции
CREATE OR REPLACE type dbo.P_REC_LIST is table of P_REC;
Хранимая процедура
PROCEDURE Get_PRecList(tmpPList IN P_REC_LIST,
resultCursor out sys_refcursor)
IS
TYPE CNsTable IS TABLE OF PERSON.ATTR1%TYPE INDEX BY PLS_INTEGER;
TYPE TmpTable IS TABLE OF P_REC INDEX BY PLS_INTEGER;
tmpTBL1 CNsTable;
Collection1 TmpTable;
BEGIN
IF tmpPList.count > 0 THEN
SELECT ATTR1
BULK COLLECT INTO tmpTBL1
FROM Table1
WHERE ATTR1 NOT IN (SELECT ATTR1 FROM TABLE(tmpPList)); --99% sure problem is here.
FOR indx IN 1 .. tmpTBL1.COUNT
LOOP
Collection1(Collection1.COUNT + 1) := tmpPList(indx);
END LOOP;
IF Collection1.COUNT > 0 THEN
FORALL ind IN 1 .. Collection1.COUNT
DELETE
FROM PERSON
WHERE ATTR1 = Collection1(ind).ATTR1;
END IF;
Данные таблицы макетов
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
tmpTBL1 неполучить значения, когда я использую TABLE (tmpPList).Я ожидаю, что записи будут удалены от человека.Попытка найти ATTR1, который существует в PERSON, но НЕ существует в tmpPList.
Обновление: Использование: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 -64 бита