powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Использование коллекции при удалении из таблицы
2 сообщений из 2, страница 1 из 1
Использование коллекции при удалении из таблицы
    #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
Использование коллекции при удалении из таблицы
    #39810313
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmberitЕсть ли объяснение такому поведению?BULK COLLECT INTO инициализирует коллекцию. Это известная фича.
А ты не экономь на количестве коллекций.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Использование коллекции при удалении из таблицы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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