Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Использование коллекции при удалении из таблицы / 2 сообщений из 2, страница 1 из 1
06.05.2019, 16:05
    #39810290
Amberit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование коллекции при удалении из таблицы
Всем добрый день!

Натолкнулся на необычное поведение следующего кода:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
CREATE TABLE test_table AS SELECT level AS id FROM dual CONNECT BY LEVEL <= 3;
/
CREATE TYPE  type_table IS TABLE OF number;
/
DECLARE
    la_id_DEL   type_table := type_table(2);
    la_id_DEL1  type_table := type_table();
    la_id_DEL2  type_table := type_table();
BEGIN
    la_id_DEL1 := la_id_DEL;
    
    DBMS_OUTPUT.put_line('la_id_DEL.COUNT=' || la_id_DEL.COUNT);
    DBMS_OUTPUT.put_line('la_id_DEL1.COUNT=' || la_id_DEL1.COUNT);
    
    DELETE 
    FROM    test_table tt
    WHERE   tt.id IN (SELECT to_number(column_value) FROM TABLE(CAST(la_id_DEL1 AS type_table)))
    RETURNING   tt.id
    BULK COLLECT INTO   la_id_DEL1;
    
    DBMS_OUTPUT.put_line('SQL%ROWCOUNT=' || SQL%ROWCOUNT);
    DBMS_OUTPUT.put_line('la_id_DEL.COUNT=' || la_id_DEL.COUNT);
    DBMS_OUTPUT.put_line('la_id_DEL1.COUNT=' || la_id_DEL1.COUNT);

    DELETE 
    FROM    test_table tt
    WHERE   tt.id IN (SELECT to_number(column_value) FROM TABLE(CAST(la_id_DEL AS type_table)))
    RETURNING   tt.id
    BULK COLLECT INTO   la_id_DEL2;
    
    DBMS_OUTPUT.put_line('SQL%ROWCOUNT=' || SQL%ROWCOUNT);
    DBMS_OUTPUT.put_line('la_id_DEL.COUNT=' || la_id_DEL.COUNT);
    DBMS_OUTPUT.put_line('la_id_DEL2.COUNT=' || la_id_DEL2.COUNT);
    
    ROLLBACK;
END;
/



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
la_id_DEL.COUNT=1
la_id_DEL1.COUNT=1
SQL%ROWCOUNT=0
la_id_DEL.COUNT=1
la_id_DEL1.COUNT=0
SQL%ROWCOUNT=1
la_id_DEL.COUNT=1
la_id_DEL2.COUNT=1



Очень похоже на то, что в случае возврата данных после удаления в ту же переменную-коллекцию, на основе которой происходит удаление, Oracle ре-инициализирует эту переменную коллекцию, и удаления не происходит.

Версия БД:
Код: plsql
1.
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production



Есть ли объяснение такому поведению?
...
Рейтинг: 0 / 0
06.05.2019, 16:56
    #39810313
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование коллекции при удалении из таблицы
AmberitЕсть ли объяснение такому поведению?BULK COLLECT INTO инициализирует коллекцию. Это известная фича.
А ты не экономь на количестве коллекций.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Использование коллекции при удалении из таблицы / 2 сообщений из 2, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]