sql >> Databáze >  >> RDS >> Oracle

Procedura/funkce PL/SQL pro dynamické zobrazení dat z různých tabulek spolu s názvy sloupců v prvním řádku dat

Použijte datový slovník k vytvoření příkazu SQL, který vybere správné sloupce. Pomocí dynamického SQL otevřete odkaz na tento příkaz a vraťte kurzor z funkce.

Ukázkové schéma

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;

Funkce

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;
/

Volání funkce

Funkce by měla fungovat, pokud aplikace rozumí rekurzorům. Níže je uveden příklad v nejnovější verzi 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



  1. Typ sloupce MySQL TIMESTAMP implicitně zahrnuje NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

  2. odeslání zprávy uživateli předáním jeho ID do modální schránky

  3. Jak získat záznamy za posledních 30 dní

  4. Jak mohu vybrat všechny sloupce z tabulky plus další sloupce, jako je ROWNUM?