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

У меня есть процедура, которая выводит в файл .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 ответа


Введите переменную для хранения суммы. Добавьте отдельные суммы внутри цикла. 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;
/

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

TOTALS := TOTALS + ROW_COUNT;

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

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

utl_file.put_line(file_handle, 'Total count : '||TOTALS);

Есть идеи?

10000