Как массово собрать в тип, где UDT в подзапросе - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь создать коллекцию значений, для которых я планирую запустить 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 бита

1 Ответ

0 голосов
/ 08 февраля 2019

Моей проблемы не было здесь.

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...