powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подсчет вставленных строк.
10 сообщений из 35, страница 2 из 2
Подсчет вставленных строк.
    #39751686
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгения ЗайцеваОчень интересно спасибо все прочитала. Не знала что есть такое. Но я как поняла в ней нельзя задавать кастомные проверки строк.
check constraint?
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751688
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymouscheck constraint? 21771072
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751696
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для полноты изложения вариант на FORALL SAVE EXCEPTIONS:
Код: 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.
38.
39.
40.
41.
42.
43.
44.
alter table table1 add constraint ck_allowed_name check ( name in ('Петя'));
Table altered.

DECLARE 
   failure_in_forall   EXCEPTION;  
   PRAGMA EXCEPTION_INIT (failure_in_forall, -24381);  
  cursor c3 is select * from table3; 
  type t_buffer is table of c3%rowtype index by pls_integer; 
  v_buffer t_buffer; 
  c_blocksize constant integer := 100; 
    V_T1_CNT NUMBER := 0; 
    V_T2_CNT NUMBER := 0; 
BEGIN 
  open c3; 
  loop 
    fetch c3 bulk collect into v_buffer limit c_blocksize; 
    begin 
        forall i in 1..v_buffer.count save exceptions
          insert into table1 values v_buffer(i); 
        v_t1_cnt := v_t1_cnt + sql%rowcount; 
    exception
      when failure_in_forall
        then declare e_idx pls_integer;
                begin
                    v_t1_cnt := v_t1_cnt + sql%rowcount; 
                    FOR i IN 1 .. SQL%BULK_EXCEPTIONS.COUNT  
                    LOOP
                      e_idx := SQL%BULK_EXCEPTIONS(i).ERROR_INDEX;
                      insert into table2 values v_buffer(e_idx) ; 
                      v_t2_cnt := v_t2_cnt + 1; 
                    END LOOP;
               end;
    end;
    exit when v_buffer.count < c_blocksize; 
  end loop; 
  close c3; 
 
    DBMS_OUTPUT.PUT_LINE(V_T1_CNT || ' row(s) inserted into TABLE1'); 
    DBMS_OUTPUT.PUT_LINE(V_T2_CNT || ' row(s) inserted into TABLE2'); 
END; 
/

4999 row(s) inserted into TABLE1
10000 row(s) inserted into TABLE2

...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751716
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousДля полноты изложения вариант на FORALL SAVE EXCEPTIONS

Вопрос в том глобален ли name in ('Петя')? Если да - то да, если нет то можно что-то типа:

Код: plsql
1.
2.
forall i in 1..v_buffer.count save exceptions
  insert into table1 values(case when v_buffer(i).name in ('Петя') then v_buffer(i).name else to_char(1/0) end, v_buffer(i).col2,...); 



и exception на zerodivide.

SY.
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751742
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
Код: plsql
1.
forall save exceptions


exception на zerodivide.

ммм?
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751780
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousммм?

В смысле zerodivide вызовет еxception :).


Код: 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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
drop table table1 purge;
drop table table2 purge;
drop table table3 purge;
create table table3 as
select case mod(level,3) when 0 then 'Petya' else 'Vasya' end name
from dual connect by level < 15000
;
create table table1 as select * from table3 where 1=0;
create table table2 as select * from table3 where 1=0;
DECLARE 
   failure_in_forall   EXCEPTION;  
   PRAGMA EXCEPTION_INIT (failure_in_forall, -24381);  
  cursor c3 is select * from table3; 
  type t_buffer is table of c3%rowtype index by pls_integer; 
  v_buffer t_buffer; 
  c_blocksize constant integer := 100; 
    V_T1_CNT NUMBER := 0; 
    V_T2_CNT NUMBER := 0; 
BEGIN 
  open c3; 
  loop 
    fetch c3 bulk collect into v_buffer limit c_blocksize; 
    begin 
        forall i in 1..v_buffer.count save exceptions
          insert into table1 values(case when v_buffer(i).name in ('Petya') then v_buffer(i).name else to_char(1/0) end); 
        v_t1_cnt := v_t1_cnt + sql%rowcount; 
    exception
      when failure_in_forall
        then declare e_idx pls_integer;
                begin
                    v_t1_cnt := v_t1_cnt + sql%rowcount; 
                    FOR i IN 1 .. SQL%BULK_EXCEPTIONS.COUNT  
                    LOOP
                      e_idx := SQL%BULK_EXCEPTIONS(i).ERROR_INDEX;
                      insert into table2 values v_buffer(e_idx) ; 
                      v_t2_cnt := v_t2_cnt + 1; 
                    END LOOP;
               end;
    end;
    exit when v_buffer.count < c_blocksize; 
  end loop; 
  close c3; 
 
    DBMS_OUTPUT.PUT_LINE(V_T1_CNT || ' row(s) inserted into TABLE1'); 
    DBMS_OUTPUT.PUT_LINE(V_T2_CNT || ' row(s) inserted into TABLE2'); 
END; 
/
4999 row(s) inserted into TABLE1
10000 row(s) inserted into TABLE2

PL/SQL procedure successfully completed.

SQL> 




SY.
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751782
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousДля полноты изложения вариант на FORALL SAVE EXCEPTIONS:


Все так, но, как говорится, есть нюанс - "инсерт около 100 млн строк". Так-что боюсь c SAVE EXCEPTIONS будет "что-то с памятью моей стало" :).

SY.
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751798
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYandrey_anonymousДля полноты изложения вариант на FORALL SAVE EXCEPTIONS:
Все так, но, как говорится, есть нюанс - "инсерт около 100 млн строк". Так-что боюсь c SAVE EXCEPTIONS будет "что-то с памятью моей стало" :).

С какой радости?
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751799
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousС какой радости?

Да, пора пить кофе - про LIMIT совсем забыл.

SY.
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39753320
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

для table2 forall не прикрутить?

Код: plsql
1.
2.
3.
4.
5.
6.
                      FORALL i IN 1 .. SQL%BULK_EXCEPTIONS.COUNT
                      insert into table2 values v_buffer(SQL%BULK_EXCEPTIONS(i).ERROR_INDEX) ;
                                                            *
ERROR at line 26:
ORA-06550: line 26, column 61:
PL/SQL: ORA-00911: invalid character
...
Рейтинг: 0 / 0
10 сообщений из 35, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подсчет вставленных строк.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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