Буферизация Serveroutput в файл CSV - PullRequest
0 голосов
/ 23 апреля 2020

Я получил задание обновить довольно большой файл, состоящий из множества операторов update и delete.

Первым делом нужно проверить, какие операторы действительно нужны / используются.

Я хотел бы поместить это в отдельный файл, но трудно получить его в хорошем формате.

Например:

set serveroutput on
spool xxx.csv

update xx set yy where a = b;

Создает файл наподобие:

sql: обновление xx .....

1100 строк обновлено.

Самое близкое, что я получил к желаемому выводу, - это использовать что-то вроде:

spool xxx.csv

select 'update xx set yy where a = b;' query, count(x) count from xx where (update where clause)

Это будет работать в основном хорошо (за исключением многострочных запросов), но для этого потребуется, чтобы я переписал все операторы обновления / удаления, а их много.

У кого-нибудь есть идеи, как мне решить эту проблему наилучшим образом? путь? Наилучшим результатом будет файл типа:

Query            Count
update xx ...    1100

Заранее спасибо!

1 Ответ

0 голосов
/ 23 апреля 2020

Вы можете использовать SQL%ROWCOUNT и выбрать ниже, чтобы достичь ваших требований

    DECLARE
      l_sql_text  VARCHAR2(32767);
      l_sql_count NUMBER;
    BEGIN
      insert into tttt values(4);

      l_sql_count:= SQL%rowcount;
      SELECT
             (
                    SELECT t2.sql_fulltext
                    FROM   v$sql t2
                    WHERE  t1.prev_sql_id = t2.sql_id
                    AND    t1.prev_child_number = t2.child_number ) prev_sql_fulltext
      INTO   l_sql_text
      FROM   v$session t1
      WHERE  t1.audsid = Sys_context('userenv', 'sessionid');

      dbms_output.put_line('Query,Count');

      dbms_output.Put_line(l_sql_text
      ||','
      ||l_sql_count);
    END;

Выход

Query,Count
INSERT INTO TTTT VALUES(4),1
...