powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Добавление строк в таблицу в цикле курсора этой же таблицы
9 сообщений из 9, страница 1 из 1
Добавление строк в таблицу в цикле курсора этой же таблицы
    #40028238
your_frend
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица T с полями A, B, C ,D
Задача дублировать каждую строку по количеству значения в поле D раз.

То есть
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 Declare
   cnt T.C%TYPE;
 begin 
     for RT IN (select * from T)  LOOP
        cnt:=RT.C
   while CNT>1 LOOP
     insert into T (T.A, T.B, T.C ,T.D) values (RT .A, RT .B, RT .C ,RT .D);
   commit;
      END LOOP;
      END LOOP:
END;


Новые строки вставляют в конец таблицы и есть вероятность, что они также будут обрабатывать до бесконечности или пока тейблспейс не закончится.
А если commit поставить ?
Код: plsql
1.
2.
3.
4.
5.
......
    END LOOP;
      END LOOP:
commit;
END;


спасёт или тут таблица будет выглядеть обновленной для этого курсора?

Вообще вопрос как можно сделать такого рода insert?
...
Рейтинг: 0 / 0
Добавление строк в таблицу в цикле курсора этой же таблицы
    #40028253
your_frend
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения... утро

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Declare
   cnt T.C%TYPE;
 begin 
     for RT IN (select * from T)  LOOP
        cnt:=RT.C;
   while CNT>1 LOOP
     insert into T (T.A, T.B, T.C ,T.D) values (RT .A, RT .B, RT .C ,RT .D);
    cnt:= CNT-1;
   commit;
      END LOOP;
      END LOOP:
END;
...
Рейтинг: 0 / 0
Добавление строк в таблицу в цикле курсора этой же таблицы
    #40028255
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
your_frend
Новые строки вставляют в конец таблицы
...
Рейтинг: 0 / 0
Добавление строк в таблицу в цикле курсора этой же таблицы
    #40028263
your_frend
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сам спросил, сам протестировал)
создал тестовую таблицу добавил поле K дал значение 1

Declare
cnt T.C%TYPE;
begin
for RT IN (select * from T) LOOP
cnt:=RT.C;
if RT.K =2 THEN
RAISE_APPLICATION_ERROR(-20001,'пошла обработка новых строчек');
end if;
while CNT>1 LOOP
insert into T (T.A, T.B, T.C ,T.D, TK) values (RT .A, RT .B, RT .C ,RT .D, 2);
cnt:= CNT-1;
commit;
END LOOP;
END LOOP:
END;

Нет тут всё окей добавилось без проблем, новые строки не обрабатывались.
Тему можно закрывать.
...
Рейтинг: 0 / 0
Добавление строк в таблицу в цикле курсора этой же таблицы
    #40028267
oragraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
your_frend,

Я на твоем месте все же поинтересовался, почему же ошибка не стреляет
...
Рейтинг: 0 / 0
Добавление строк в таблицу в цикле курсора этой же таблицы
    #40028312
your_frend
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
oragraf,
Вё ок проверил

Код: plsql
1.
2.
select test_t.A , test_t.B, test_t.C , count(*)  from test_t
group by test_t.A , test_t.B, test_t.C ;



ABCCOUNT(*)7 7 2 211 11 2 215 57 6 623 65 6 626 68 6 6171 36 2 23001 113 6 6

Единственное поменял :
Код: plsql
1.
2.
....
 while CNT>=2 LOOP
...
Рейтинг: 0 / 0
Добавление строк в таблицу в цикле курсора этой же таблицы
    #40028334
Vlad074
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Состояние курсора фиксируется в момент открытия.

По этой же причине не будет вставки в таблицу T до бесконечности в
Код: plsql
1.
INSERT INTO T SELECT * FROM T



По крайней мере в Oracle, может кто про другие БД скажет.
...
Рейтинг: 0 / 0
Добавление строк в таблицу в цикле курсора этой же таблицы
    #40028466
oragraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
your_frend
oragraf,
Вё ок проверил
Понятно, значит скоро начнешь спускаться в Долину Отчаяния...
...
Рейтинг: 0 / 0
Добавление строк в таблицу в цикле курсора этой же таблицы
    #40028570
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad074


По крайней мере в Oracle, может кто про другие БД скажет.


изоляция транзакций корнями уходит в простые файлы. чтобы inser select не зациклился, достаточно перед select определить размер файла. даже если к файлу добавятся новые данные, select не станет их выбирать.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Добавление строк в таблицу в цикле курсора этой же таблицы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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