powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подсчет вставленных строк.
35 сообщений из 35, показаны все 2 страниц
Подсчет вставленных строк.
    #39751601
Ребят есть такой запрос

INSERT
WHEN (u_name='Петя') THEN
INTO table1 (name)
VALUES (u_name)
ELSE
INTO table2 (name)
VALUES (u_name )
SELECT u_name FROM table3;

Как посчтитать кол-во вставленных строк по каждой таблице ?. SQL%ROWCOUNT не подходит так как он подсчитает все вставленные строки по двум таблицам
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751604
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгения Зайцева
Код: plsql
1.
INSERT WHEN


Как посчтитать кол-во вставленных строк по каждой таблице ?Попробуй
Код: plsql
1.
returning count(case


Но проще не создавать себе таких сложностей.
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751612
returning count(*) не совсем подходит тоже так как в таблице уже могут быть данные . Я ж так поняла мне вернеться тогда все строчки которые есть в таблице. INSERT WHEN Очень хорошо подходит для решения моей задачи просто =)
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751613
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгения ЗайцеваЯ ж так поняла мне вернеться тогда все строчки которые есть в таблице.Твоё "понимание" необосновано.
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751616
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгения ЗайцеваОчень хорошо подходит для решения моей задачи просто 20165163
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751626
Сагу прочитала =) Я что не правильно поняла как действует return count(*) . Он мне посчитает все строчки которые на данный момент в таблицу было вставлено. По поводу саги у меня очень большой инсерт около 100 млн строк и + строчки могут строчки быть невалидные . Потому и идет вставка в 2 таблицы . В цикле на pl/sql крутить долго. Двумя инсертами тоже долго так как я буду дергать 2 практически одинаковых селекта . Один insert when работает гораздо быстрее и экономит время загрузки. Потому я и спрашивала возможно ли выйти малой кровью юзая эту конструкцию.
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751633
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгения ЗайцеваЯ что не правильно поняла как действует return count(*)Да, неправильно. Но в данной форме insert-а это неважно, так как returning не поддерживается. Пардон за дезу.
Евгения Зайцеваочень большой инсерт около 100 млн строк и + строчки могут строчки быть невалидныеRTFM log errors
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751639
RTFM log errors -- это к чему ? Если трассировку дать ? То к сожалению не могу ... запрещено политикой компании =((((
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751641
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751649
Очень интересно спасибо все прочитала. Не знала что есть такое. Но я как поняла в ней нельзя задавать кастомные проверки строк.
например когда надо чтобы id начиналось только на 0000 в любом другом случае это все должно уходить в таблицу ошибок.
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751651
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгения ЗайцеваНо я как понялаТы ещё не поняла, что тебе вредно понимать?
Евгения Зайцеванельзя задавать кастомные проверки строк.Добавь столбик is_error с check-ом и заполняй его результатом сколь угодно сложной проверки
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751655
Мы наверно не понимаем друг друга. Наверно я. Но мне надо просто узнать сколько строчек было вставлено в основную таблицу и таблицу ошибок и все =) Таблица с ошибками уже реализована и принята.
И вопрос был в том что можно ли используя такую контрукцию подсчитать вставленные строчки отдельно по каждой таблице . Если нет . То зачем мне нужна еще таблица ошибок.
WHEN (u_name='Петя') THEN
INTO table1 (name)
VALUES (u_name)
ELSE
INTO table2 (name)
VALUES (u_name )
SELECT u_name FROM table3;[/SRC]
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751658
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгения Зайцева,

Ну сделaй

SELECT COUNT(*) FROM TABLE1;

до и после.

SY.
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751659
SYЕвгения Зайцева,

Ну сделaй

SELECT COUNT(*) FROM TABLE1;

до и после.

SY.
Как вариант . Подсчитать до потом посчитать после и после - до . Получу вставленные . Но я думала есть в оракле более гуманное решение =)
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751662
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно через MV LOG:

Код: plsql
1.
2.
CREATE MATERIALIZED VIEW LOG ON TABLE1 WITH ROWID
/



Выполнение:

Код: 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.
TRUNCATE TABLE MLOG$_TABLE1
/
SET SERVEROUTPUT ON
DECLARE
    V_TOTAL_CNT NUMBER;
    V_TABLE1_CNT NUMBER;
BEGIN
    INSERT
      WHEN (DEPTNO = 10)
       THEN
         INTO TABLE1(NAME)
         VALUES(ENAME)
       ELSE
         INTO TABLE2(NAME)
         VALUES(ENAME)
    SELECT  *
      FROM  EMP;
    V_TOTAL_CNT := SQL%ROWCOUNT;
    SELECT  COUNT(*)
      INTO  V_TABLE1_CNT
      FROM  MLOG$_TABLE1;
    DBMS_OUTPUT.PUT_LINE(V_TABLE1_CNT || ' row(s) inserted into TABLE1');
    DBMS_OUTPUT.PUT_LINE((V_TOTAL_CNT - V_TABLE1_CNT) || ' row(s) inserted into TABLE2');
END;
/
3 row(s) inserted into TABLE1
11 row(s) inserted into TABLE2

PL/SQL procedure successfully completed.

SQL> 



Естественно и COUNT до/после и MV LOG не сработают если другие сессии встaвляют/удаляют строки TABLE1.

SY.
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751663
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгения ЗайцеваТаблица с ошибками уже реализована и принята.Точно XYZ.
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751664
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгения ЗайцевагуманноеSYМожно через MV LOG:Евгения Зайцева100 млн строк
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751667
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгения ЗайцеваКак посчтитать кол-во вставленных строк по каждой таблице ?. SQL%ROWCOUNT не подходит так как он подсчитает все вставленные строки по двум таблицам
Обязательно ли делать вставку одним sql-предложением?
Можно ли заменить этот вызов, к примеру, pl/sql-блоком?
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751671
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousОбязательно ли делать вставку одним sql-предложением?


Тогда TABLE3 будем читать дважды.

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


Тогда TABLE3 будем читать дважды.

Зачем?
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751673
andrey_anonymousЕвгения ЗайцеваКак посчтитать кол-во вставленных строк по каждой таблице ?. SQL%ROWCOUNT не подходит так как он подсчитает все вставленные строки по двум таблицам
Обязательно ли делать вставку одним sql-предложением?
Можно ли заменить этот вызов, к примеру, pl/sql-блоком?
Заменить можно но будет по скорости плохо будет . Так как прийдеться два раза выполнять по сути один и тот же долгоиграющий селект с различием в одном условии .
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751674
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYТогда TABLE3 будем читать дважды.


Упс, не понял. Ты предлагаешь FOR V_REC IN (SELECT * FROM TABLE3).

SY.
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751675
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгения ЗайцеваТак как прийдеться два раза выполнять по сути один и тот же долгоиграющий селект с различием в одном условии .
????
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751677
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYSYТогда TABLE3 будем читать дважды.


Упс, не понял. Ты предлагаешь FOR V_REC IN (SELECT * FROM TABLE3).

bulk limit, и дважды forall insert indices of
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #39751685
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
create table table3 as
select case mod(level,3) when 0 then 'Петя' else 'Вася' end name
from dual connect by level < 15000
;

Table created.

create table table1 as select * from table3 where 1=0;

Table created.

create table table2 as select * from table3 where 1=0;

Table created.

select count(*) from table3;

COUNT(*)
14999

DECLARE
  cursor c3 is select * from table3;
  type t_buffer is table of c3%rowtype index by pls_integer;
  v_buffer t_buffer;
  type t_ind_arr is table of pls_integer index by pls_integer;
  v_idx_t1 t_ind_arr;
  v_idx_t2 t_ind_arr;
  c_blocksize constant integer := 100;
    V_T1_CNT NUMBER := 0;
    V_T2_CNT NUMBER := 0;
BEGIN
  open c3; -- Долгоиграющий запрос
  loop
    v_idx_t1.delete;
    v_idx_t2.delete;

    -- Дергаем c_blocksize записей в буфер
    fetch c3 bulk collect into v_buffer limit c_blocksize;

    -- Делим на Петь и прочих
    for i in 1..v_buffer.count loop
      case v_buffer(i).name
        when 'Петя' then v_idx_t1(v_idx_t1.count+1) := i;
        else v_idx_t2(v_idx_t2.count+1) := i;
      end case;
    end loop;
   
    -- Загоняем данные по предписанию
    forall i in values of v_idx_t1
      insert into table1 values v_buffer(i);
    v_t1_cnt := v_t1_cnt + v_idx_t1.count;

    forall i in values of v_idx_t2
      insert into table2 values v_buffer(i);
    v_t2_cnt := v_t2_cnt + v_idx_t2.count;

    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

select 'Table1', count(*) from table1
union all select 'Table2', count(*) from table2;

'TABLE1'	COUNT(*)
Table1	4999
Table2	10000
...
Рейтинг: 0 / 0
Подсчет вставленных строк.
    #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
35 сообщений из 35, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подсчет вставленных строк.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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