Как выполнить вывод запроса - PullRequest
0 голосов
/ 07 мая 2019

Мы написали sql, который возвращает сумму и среднее число числовых столбцов, присутствующих в схеме.

Не могли бы вы помочь нам, если есть способ выполнить запрос и результат запроса вместе в одном запросе. У нас нет разрешения на создание или вставку.

select 'select  avg(' || column_name ||'), sum('||column_name|| '), '|| table_name 
       ||' from '|| table_name ||'   ' ||'union all' 
from all_tab_columns
where data_type= 'NUMBER'
and owner not in ('SYS','PUBLIC','WMSYS','SYSTEM') 
and column_name not in ('BATCHNUM')

Результат запроса выше

select  avg(amt), sum(amt2), table1 from table1   
union all
select  avg(amt2), sum(amt5), table2 from table2  

Вот что мы пытаемся достичь одним запросом

schema Tablename  columname   average  sum 
Test    testable   amount       10      1000
Test    testable   amounttrans  100      4000
Test2   transtable  amount       100     5000

спасибо

1 Ответ

0 голосов
/ 07 мая 2019

Вы можете создать динамическое представление (попросите вашего суперпользователя / dba создать его для вас, если у вас нет разрешения)

В этом примере я буду использовать несколько строк из схемы HR. Вы можете изменить его, добавив также имя схемы, используя all_tab_columns

DECLARE
     v_sql CLOB := empty_clob();
    BEGIN

    for rec IN (select 'select '''||table_name||''' as tablename,
         '''||column_name||''' as columname,
                   avg(' || column_name ||') as average,sum('
                         || column_name || ') as "SUM" from '
                         || table_name
                         ||'   ' as qry
                  FROM user_tab_columns --all_tab_columns
    where data_type= 'NUMBER'
    --and owner not in ('SYS','PUBLIC','WMSYS','SYSTEM') 
                        AND column_name NOT IN ('BATCHNUM'
                  )
                        AND ROWNUM < 10
                ) LOOP v_sql := v_sql
                                || rec.qry
                                || ' UNION ALL ';
      END LOOP;
        v_sql := regexp_replace(v_sql,' UNION ALL $');
     EXECUTE IMMEDIATE 'CREATE OR REPLACE view my_view as ' || v_sql;
END;
/

Теперь запросите представление.

SQL> set sqlformat ansiconsole
SQL> select * from my_view;
TABLENAME     COLUMNAME                                           AVERAGE      SUM
REGIONS       REGION_ID                                               2.5       10
COUNTRIES     REGION_ID                                               2.4       60
LOCATIONS     LOCATION_ID                                            2100    48300
DEPARTMENTS   DEPARTMENT_ID                                           140     3780
DEPARTMENTS   MANAGER_ID         154.909090909090909090909090909090909091     1704
DEPARTMENTS   LOCATION_ID       1777.777777777777777777777777777777777778    48000
JOBS          MIN_SALARY        6573.052631578947368421052631578947368421   124888
JOBS          MAX_SALARY         13215.1578947368421052631578947368421053   251088
EMPLOYEES     EMPLOYEE_ID                                             153    16371

Если вы используете Oracle 12c и выше, вы можете использовать DBMS_SQL.RETURN_RESULT

использовать тот же блок, что и выше, за исключением этих изменений.

DECLARE
 ..
 v_cur SYS_REFCURSOR;
  BEGIN
  ...
  END LOOP;
    v_sql := regexp_replace(v_sql,' UNION ALL $');
     OPEN v_cur for v_sql;
    DBMS_SQL.RETURN_RESULT(v_cur);
  END;
/ 


ResultSet #1


TABLENAME   COLUMNAME        AVERAGE        SUM
----------- ------------- ---------- ----------
REGIONS     REGION_ID            2.5         10
COUNTRIES   REGION_ID            2.4         60
LOCATIONS   LOCATION_ID         2100      48300
DEPARTMENTS DEPARTMENT_ID        140       3780
DEPARTMENTS MANAGER_ID    154.909091       1704
DEPARTMENTS LOCATION_ID   1777.77778      48000
JOBS        MIN_SALARY    6573.05263     124888
JOBS        MAX_SALARY    13215.1579     251088
EMPLOYEES   EMPLOYEE_ID          153      16371

9 rows selected. 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...