Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подсчет вставленных строк. / 25 сообщений из 35, страница 1 из 2
22.12.2018, 13:01
    #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
22.12.2018, 13:26
    #39751604
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет вставленных строк.
Евгения Зайцева
Код: plsql
1.
INSERT WHEN


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


Но проще не создавать себе таких сложностей.
...
Рейтинг: 0 / 0
22.12.2018, 13:47
    #39751612
Подсчет вставленных строк.
returning count(*) не совсем подходит тоже так как в таблице уже могут быть данные . Я ж так поняла мне вернеться тогда все строчки которые есть в таблице. INSERT WHEN Очень хорошо подходит для решения моей задачи просто =)
...
Рейтинг: 0 / 0
22.12.2018, 13:54
    #39751613
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет вставленных строк.
Евгения ЗайцеваЯ ж так поняла мне вернеться тогда все строчки которые есть в таблице.Твоё "понимание" необосновано.
...
Рейтинг: 0 / 0
22.12.2018, 13:57
    #39751616
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет вставленных строк.
Евгения ЗайцеваОчень хорошо подходит для решения моей задачи просто 20165163
...
Рейтинг: 0 / 0
22.12.2018, 14:20
    #39751626
Подсчет вставленных строк.
Сагу прочитала =) Я что не правильно поняла как действует return count(*) . Он мне посчитает все строчки которые на данный момент в таблицу было вставлено. По поводу саги у меня очень большой инсерт около 100 млн строк и + строчки могут строчки быть невалидные . Потому и идет вставка в 2 таблицы . В цикле на pl/sql крутить долго. Двумя инсертами тоже долго так как я буду дергать 2 практически одинаковых селекта . Один insert when работает гораздо быстрее и экономит время загрузки. Потому я и спрашивала возможно ли выйти малой кровью юзая эту конструкцию.
...
Рейтинг: 0 / 0
22.12.2018, 14:29
    #39751633
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет вставленных строк.
Евгения ЗайцеваЯ что не правильно поняла как действует return count(*)Да, неправильно. Но в данной форме insert-а это неважно, так как returning не поддерживается. Пардон за дезу.
Евгения Зайцеваочень большой инсерт около 100 млн строк и + строчки могут строчки быть невалидныеRTFM log errors
...
Рейтинг: 0 / 0
22.12.2018, 14:36
    #39751639
Подсчет вставленных строк.
RTFM log errors -- это к чему ? Если трассировку дать ? То к сожалению не могу ... запрещено политикой компании =((((
...
Рейтинг: 0 / 0
22.12.2018, 14:42
    #39751641
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет вставленных строк.
...
Рейтинг: 0 / 0
22.12.2018, 15:14
    #39751649
Подсчет вставленных строк.
Очень интересно спасибо все прочитала. Не знала что есть такое. Но я как поняла в ней нельзя задавать кастомные проверки строк.
например когда надо чтобы id начиналось только на 0000 в любом другом случае это все должно уходить в таблицу ошибок.
...
Рейтинг: 0 / 0
22.12.2018, 15:50
    #39751651
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет вставленных строк.
Евгения ЗайцеваНо я как понялаТы ещё не поняла, что тебе вредно понимать?
Евгения Зайцеванельзя задавать кастомные проверки строк.Добавь столбик is_error с check-ом и заполняй его результатом сколь угодно сложной проверки
...
Рейтинг: 0 / 0
22.12.2018, 16:02
    #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
22.12.2018, 16:06
    #39751658
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет вставленных строк.
Евгения Зайцева,

Ну сделaй

SELECT COUNT(*) FROM TABLE1;

до и после.

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

Ну сделaй

SELECT COUNT(*) FROM TABLE1;

до и после.

SY.
Как вариант . Подсчитать до потом посчитать после и после - до . Получу вставленные . Но я думала есть в оракле более гуманное решение =)
...
Рейтинг: 0 / 0
22.12.2018, 16:28
    #39751662
SY
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
22.12.2018, 16:29
    #39751663
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет вставленных строк.
Евгения ЗайцеваТаблица с ошибками уже реализована и принята.Точно XYZ.
...
Рейтинг: 0 / 0
22.12.2018, 16:31
    #39751664
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет вставленных строк.
Евгения ЗайцевагуманноеSYМожно через MV LOG:Евгения Зайцева100 млн строк
...
Рейтинг: 0 / 0
22.12.2018, 16:37
    #39751667
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет вставленных строк.
Евгения ЗайцеваКак посчтитать кол-во вставленных строк по каждой таблице ?. SQL%ROWCOUNT не подходит так как он подсчитает все вставленные строки по двум таблицам
Обязательно ли делать вставку одним sql-предложением?
Можно ли заменить этот вызов, к примеру, pl/sql-блоком?
...
Рейтинг: 0 / 0
22.12.2018, 16:43
    #39751671
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчет вставленных строк.
andrey_anonymousОбязательно ли делать вставку одним sql-предложением?


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

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


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

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


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

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


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

bulk limit, и дважды forall insert indices of
...
Рейтинг: 0 / 0
22.12.2018, 17:36
    #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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подсчет вставленных строк. / 25 сообщений из 35, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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