Как я могу сложить числовые значения, заданные циклом pl / sql в одно единственное значение? - PullRequest
0 голосов
/ 14 мая 2019

У меня есть процедура, которая выводит в файл .csv, она в основном создает заголовок для некоторых значений, а затем перечисляет значения внизу.Я пытаюсь адаптировать этот код, чтобы просто добавить все эти значения.Я помещу их в другой заголовок в том же файле CSV в разделе «ВСЕГО» или аналогичный.

Я еще ничего не пробовал с этим, потому что, честно говоря, я озадачен тем, как я могу сложить значения, которые получаются из зацикленного вывода.

Мой код в основном такой:

create or replace procedure PROJECT is
  --variables
  l_dblink varchar2(100) := 'DB1';
  ROW_COUNT number;
  file_handle UTL_FILE.file_type;
BEGIN
  utl_file.put_line(file_handle, 'OWNER,TABLE_NAME,ROW_COUNT');

  --main loop
  for rws in (select /*+parallel */ owner, table_name
                from dba_tables@DB1 a
               where table_name in (select table_name
                                      from meta_table
                                     where driver_table is not null
                                       and additional_joins is null)
                 and a.owner in (select distinct schema
                                   from meta_table c)
               order by table_name)
 loop
    execute immediate 'select count(*) from '     ||rws.owner||'.'||rws.table_name || '@' || l_dblink into ROW_COUNT;
utl_file.put_line(file_handle,
                  rws.OWNER || ',' ||
                  rws.TABLE_NAME || ',' ||
                  ROW_COUNT);
  end loop;
END PROJECT;
/

, который выдает следующий результат:

OWNER       TABLE_NAME  ROW_COUNT
SCOUSE_BOB  KELLOGS     1000
SCOUSE_BOB  UNCLE_TOBY  4000

Я ищу средство, с помощью которого можно добавить эти ROW_COUNTS.

Я добавлю новую utl_file.put_line с

TOTALS

Но как мне получить PL / SQL для суммирования значений и получения '5000'?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 14 мая 2019

Введите переменную для хранения суммы.Добавьте отдельные суммы внутри цикла.utl_file.put_line, чтобы отобразить это будет вне цикла.

create or replace procedure PROJECT is
  --variables
  l_dblink varchar2(100) := 'DB1';
  ROW_COUNT number;
  file_handle UTL_FILE.file_type;
  v_total number := 0;  
BEGIN
  utl_file.put_line(file_handle, 'OWNER,TABLE_NAME,ROW_COUNT');

  --main loop
for rws in (select /*+parallel */ owner, table_name
               from dba_tables@DB1 a
             where table_name in (select table_name
                                    from meta_table
                                  where driver_table is not null
                                  and additional_joins is null)
               and a.owner in (select distinct schema
                                   from meta_table c)
               order by table_name)
 loop
    execute immediate 'select count(*) from '  
     ||rws.owner||'.'||rws.table_name 
     || '@'     || l_dblink into ROW_COUNT;

    v_total := v_total + ROW_COUNT; 
   utl_file.put_line(file_handle,
                     rws.OWNER || ',' ||
                     rws.TABLE_NAME || ',' ||
                     ROW_COUNT);

  end loop;

     utl_file.put_line(file_handle,
                     'Total '|| v_total
                     );

END PROJECT;
/
1 голос
/ 14 мая 2019

Просто используйте присвоение внутри последнего цикла как

TOTALS := TOTALS + ROW_COUNT;

где TOTALS - локальная переменная, определенная как number тип данных

и печатать после end loop как

utl_file.put_line(file_handle, 'Total count : '||TOTALS);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...