Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Подсчет вставленных строк.  [new]
Евгения Зайцева
Member

Откуда:
Сообщений: 52
Ребят есть такой запрос

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 не подходит так как он подсчитает все вставленные строки по двум таблицам
22 дек 18, 13:01    [21771007]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет вставленных строк.  [new]
Elic
Member

Откуда:
Сообщений: 29979
Евгения Зайцева
INSERT WHEN

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

Но проще не создавать себе таких сложностей.
22 дек 18, 13:26    [21771016]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет вставленных строк.  [new]
Евгения Зайцева
Member

Откуда:
Сообщений: 52
returning count(*) не совсем подходит тоже так как в таблице уже могут быть данные . Я ж так поняла мне вернеться тогда все строчки которые есть в таблице. INSERT WHEN Очень хорошо подходит для решения моей задачи просто =)
22 дек 18, 13:47    [21771026]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет вставленных строк.  [new]
Elic
Member

Откуда:
Сообщений: 29979
Евгения Зайцева
Я ж так поняла мне вернеться тогда все строчки которые есть в таблице.
Твоё "понимание" необосновано.
22 дек 18, 13:54    [21771027]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет вставленных строк.  [new]
Elic
Member

Откуда:
Сообщений: 29979
Евгения Зайцева
Очень хорошо подходит для решения моей задачи просто
20165163
22 дек 18, 13:57    [21771030]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет вставленных строк.  [new]
Евгения Зайцева
Member

Откуда:
Сообщений: 52
Сагу прочитала =) Я что не правильно поняла как действует return count(*) . Он мне посчитает все строчки которые на данный момент в таблицу было вставлено. По поводу саги у меня очень большой инсерт около 100 млн строк и + строчки могут строчки быть невалидные . Потому и идет вставка в 2 таблицы . В цикле на pl/sql крутить долго. Двумя инсертами тоже долго так как я буду дергать 2 практически одинаковых селекта . Один insert when работает гораздо быстрее и экономит время загрузки. Потому я и спрашивала возможно ли выйти малой кровью юзая эту конструкцию.
22 дек 18, 14:20    [21771043]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет вставленных строк.  [new]
Elic
Member

Откуда:
Сообщений: 29979
Евгения Зайцева
Я что не правильно поняла как действует return count(*)
Да, неправильно. Но в данной форме insert-а это неважно, так как returning не поддерживается. Пардон за дезу.
Евгения Зайцева
очень большой инсерт около 100 млн строк и + строчки могут строчки быть невалидные
RTFM log errors
22 дек 18, 14:29    [21771050]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет вставленных строк.  [new]
Евгения Зайцева
Member

Откуда:
Сообщений: 52
RTFM log errors -- это к чему ? Если трассировку дать ? То к сожалению не могу ... запрещено политикой компании =((((
22 дек 18, 14:36    [21771056]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет вставленных строк.  [new]
Elic
Member

Откуда:
Сообщений: 29979
RTFM Avoiding Bulk INSERT Failures with DML Error Logging (FAQ)
22 дек 18, 14:42    [21771058]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет вставленных строк.  [new]
Евгения Зайцева
Member

Откуда:
Сообщений: 52
Очень интересно спасибо все прочитала. Не знала что есть такое. Но я как поняла в ней нельзя задавать кастомные проверки строк.
например когда надо чтобы id начиналось только на 0000 в любом другом случае это все должно уходить в таблицу ошибок.
22 дек 18, 15:14    [21771067]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет вставленных строк.  [new]
Elic
Member

Откуда:
Сообщений: 29979
Евгения Зайцева
Но я как поняла
Ты ещё не поняла, что тебе вредно понимать?
Евгения Зайцева
нельзя задавать кастомные проверки строк.
Добавь столбик is_error с check-ом и заполняй его результатом сколь угодно сложной проверки
22 дек 18, 15:50    [21771072]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет вставленных строк.  [new]
Евгения Зайцева
Member

Откуда:
Сообщений: 52
Мы наверно не понимаем друг друга. Наверно я. Но мне надо просто узнать сколько строчек было вставлено в основную таблицу и таблицу ошибок и все =) Таблица с ошибками уже реализована и принята.
И вопрос был в том что можно ли используя такую контрукцию подсчитать вставленные строчки отдельно по каждой таблице . Если нет . То зачем мне нужна еще таблица ошибок.
WHEN (u_name='Петя') THEN
INTO table1 (name)
VALUES (u_name)
ELSE
INTO table2 (name)
VALUES (u_name )
SELECT u_name FROM table3;[/SRC]
22 дек 18, 16:02    [21771076]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет вставленных строк.  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10043
Евгения Зайцева,

Ну сделaй

SELECT COUNT(*) FROM TABLE1;

до и после.

SY.
22 дек 18, 16:06    [21771079]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет вставленных строк.  [new]
Евгения Зайцева
Member

Откуда:
Сообщений: 52
SY
Евгения Зайцева,

Ну сделaй

SELECT COUNT(*) FROM TABLE1;

до и после.

SY.

Как вариант . Подсчитать до потом посчитать после и после - до . Получу вставленные . Но я думала есть в оракле более гуманное решение =)
22 дек 18, 16:17    [21771081]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет вставленных строк.  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10043
Можно через MV LOG:

CREATE MATERIALIZED VIEW LOG ON TABLE1 WITH ROWID
/


Выполнение:

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.

Сообщение было отредактировано: 22 дек 18, 16:31
22 дек 18, 16:28    [21771084]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет вставленных строк.  [new]
Elic
Member

Откуда:
Сообщений: 29979
Евгения Зайцева
Таблица с ошибками уже реализована и принята.
Точно XYZ.
22 дек 18, 16:29    [21771085]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет вставленных строк.  [new]
Elic
Member

Откуда:
Сообщений: 29979
Евгения Зайцева
гуманное
SY
Можно через MV LOG:
Евгения Зайцева
100 млн строк
22 дек 18, 16:31    [21771086]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет вставленных строк.  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18347
Евгения Зайцева
Как посчтитать кол-во вставленных строк по каждой таблице ?. SQL%ROWCOUNT не подходит так как он подсчитает все вставленные строки по двум таблицам

Обязательно ли делать вставку одним sql-предложением?
Можно ли заменить этот вызов, к примеру, pl/sql-блоком?
22 дек 18, 16:37    [21771089]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет вставленных строк.  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10043
andrey_anonymous
Обязательно ли делать вставку одним sql-предложением?


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

SY.
22 дек 18, 16:43    [21771093]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет вставленных строк.  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18347
SY
andrey_anonymous
Обязательно ли делать вставку одним sql-предложением?


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

Зачем?
22 дек 18, 16:43    [21771094]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет вставленных строк.  [new]
Евгения Зайцева
Member

Откуда:
Сообщений: 52
andrey_anonymous
Евгения Зайцева
Как посчтитать кол-во вставленных строк по каждой таблице ?. SQL%ROWCOUNT не подходит так как он подсчитает все вставленные строки по двум таблицам

Обязательно ли делать вставку одним sql-предложением?
Можно ли заменить этот вызов, к примеру, pl/sql-блоком?

Заменить можно но будет по скорости плохо будет . Так как прийдеться два раза выполнять по сути один и тот же долгоиграющий селект с различием в одном условии .
22 дек 18, 16:44    [21771095]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет вставленных строк.  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10043
SY
Тогда TABLE3 будем читать дважды.


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

SY.
22 дек 18, 16:45    [21771096]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет вставленных строк.  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18347
Евгения Зайцева
Так как прийдеться два раза выполнять по сути один и тот же долгоиграющий селект с различием в одном условии .

????
22 дек 18, 16:45    [21771097]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет вставленных строк.  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18347
SY
SY
Тогда TABLE3 будем читать дважды.


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

bulk limit, и дважды forall insert indices of
22 дек 18, 16:47    [21771099]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет вставленных строк.  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18347
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
22 дек 18, 17:36    [21771112]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить