Ряды с колоннами в оракуле - PullRequest
0 голосов
/ 14 октября 2018

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

Это наборы результатов.

select drc.rc_column_name from dyna_report_columns drc;

Column Names

select * from REPORT1;

enter image description here

я пытаюсь получить результаты из rc_column_name в разные столбцы в виде одной строки для следующего набора результатов.

как то так.enter image description here

1 Ответ

0 голосов
/ 14 октября 2018

Я планирую динамизировать отчет "

Вам нужно решение, которое может обрабатывать любое количество столбцов. Поэтому вы не можете сделать это обычным запросом. Вам нужно использовать динамический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.

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