首页 > 解决方案 > 如何将 pl/sql 循环给出的数值加起来为一个值?

问题描述

我有一个输出到 .csv 文件的程序,它基本上为某些值生成一个标题,然后列出下面的值。我正在尝试调整该代码以将所有这些值相加。我会将它们放在“TOTAL”或类似文件下的同一 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”?

谢谢!

标签: oracleplsql

解决方案


引入一个变量来保存总计。在循环内添加单独的总和。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;
/

推荐阅读