Я планирую динамизировать отчет "
Вам нужно решение, которое может обрабатывать любое количество столбцов. Поэтому вы не можете сделать это обычным запросом. Вам нужно использовать динамическийSQL для сборки проекции на лету.
Это означает, что хранимая процедура или функция выполняет динамический оператор SQL и возвращает слабый курсор ref. Опять же, это должен быть курсор ref, поскольку это единственная конструкциякоторый может обрабатывать переменную проекцию. Ссылочные курсоры совместимы с JDBC ResultSet и ODBC ResultSet, а также эквивалентны в большинстве распространенных языков интерфейса.
Вот функция, которая использует ваши опубликованные таблицы:
create or replace function get_any_report return sys_refcursor
is
stmt varchar2(32767);
rc sys_refcursor;
begin
select 'select 1 as row_type, ' ||
listagg(''''||rc_column_name||''' as col'||trim(to_char(rc_seq)), ',') within group (order by rc_seq)
||' from dual'
||' union all
select 2 as row_type, r1.*
from report1 r1
order by 1, 2'
into stmt
from dyna_report_columns ;
dbms_output.put_line(stmt);
open rc for stmt;
return rc;
end;
/
Существует дополнительный столбец row_type
, на который ссылаются в предложении ORDER BY, чтобы гарантировать, что строка заголовка является первой строкой набора результатов.
Здесь anOracle LiveSQL Demo . Извините, для запуска вам нужна бесплатная учетная запись Oracle, но в настоящий момент SQL Fiddle немного ненадежен.
Вот демо-версия SQL Fiddle , но Fiddle не поддерживает DBMS_OUTPUT.