PL / SQL процедура / функция для динамического отображения данных из разных таблиц вместе с именами столбцов в первой строке данных - PullRequest
0 голосов
/ 29 мая 2020

У меня есть требование, подобное приведенному ниже.

Есть 70 таблиц, и мне нужно построить 70 запросов из этих 70 различных таблиц в зависимости от некоторых условий.

Допустим, имена таблиц: TAB_1, TAB_2, TAB_3 ....., TAB_70 . Количество столбцов и тип данных столбцов различны в каждой таблице. Я получаю данные, введенные пользователем, и мне нужно передать это значение в функцию Oracle PL / SQL или процедуру GET_RESULT() и получить результат в табличном формате (такой же, как при выполнении запроса).

Кроме того, я должен показать имена столбцов в 1-й строке данных.

Пример:

Я беру две таблицы, TAB_1 и TAB_2.

TAB_1

ID Quarter Risk 00001 Q0 2
00001 Q1 3
00001 Q2 1
00001 Q3 1
00001 Q4 2

TAB_2

ID Status 00001 ACTIVE
00002 PURGED
00003 ACTIVE
00004 ACTIVE

Если я получу пользовательский ввод 1, я передам его в параметр процедуры GET_RESULTS(1) и получите вывод, как показано ниже:

Col1 Col2 Col3 ID Quarter Risk 00001 Q0 2
00001 Q1 3
00001 Q2 1
00001 Q3 1
00001 Q4 2

Если GET_RESULTS(2), то:

Col1 Col2 ID STATUS
00001 ACTIVE
00002 PURGED
00003 ACTIVE
00004 ACTIVE

Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 29 мая 2020

Используйте словарь данных, чтобы построить оператор SQL, который выбирает правильные столбцы. Используйте динамический c SQL, чтобы открыть рефкурсор для этого оператора и вернуть курсор из функции.

Пример схемы

create table tab_1 as
select '00001' id, 'Q0' quarter, 2 risk from dual union all
select '00001' id, 'Q1' quarter, 3 risk from dual union all
select '00001' id, 'Q2' quarter, 1 risk from dual union all
select '00001' id, 'Q3' quarter, 1 risk from dual union all
select '00001' id, 'Q4' quarter, 2 risk from dual;

create table tab_2 as
select '00001' id, 'ACTIVE' status from dual union all
select '00002' id, 'PURGED' status from dual union all
select '00003' id, 'ACTIVE' status from dual union all
select '00004' id, 'ACTIVE' status from dual;

Функция

create or replace function get_results(p_id number) return sys_refcursor is
    v_sql varchar2(32767);
    v_refcursor sys_refcursor;
begin
    --Get SQL statement.
    select
        'select ' || 
        listagg(column_name, ',') within group (order by column_id) ||
        ' from ' || table_name
    into v_sql
    from user_tab_columns
    where table_name = 'TAB_' || p_id
        and column_id <= 2
    group by table_name;

    open v_refcursor for v_sql;

    return v_refcursor;
end;
/

Вызов функции

Функция должна работать до тех пор, пока приложение понимает рефкурсоры. Ниже приведен пример из последней версии SQL* Plus:

SQL> select get_results(1) from dual;

GET_RESULTS(1)
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

ID    QU
----- --
00001 Q0
00001 Q1
00001 Q2
00001 Q3
00001 Q4
...