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

UNPIVOT na neurčitém počtu sloupců

Zní to, jako byste chtěli odklopit tabulku (otočení by znamenalo přechod z mnoha řádků a 2 sloupců na 1 řádek s mnoha sloupci). K vygenerování dotazu byste s největší pravděpodobností museli použít dynamické SQL a poté použít DBMS_SQL balíček (nebo potenciálně EXECUTE IMMEDIATE ), abyste jej provedli. Měli byste být také schopni sestavit funkci zřetězené tabulky, která provedla unpivoting. V rámci funkce zřetězené tabulky byste museli použít také dynamické SQL, ale potenciálně by to bylo méně kódu. Očekával bych čistě dynamický příkaz SQL pomocí UNPIVOT být však efektivnější.

Neefektivní přístup, ale takový, který lze relativně snadno následovat, by byl něco jako

SQL> ed
Wrote file afiedt.buf

  1  create or replace type emp_unpivot_type
  2  as object (
  3    empno number,
  4    col   varchar2(4000)
  5* );
SQL> /

Type created.

SQL> create or replace type emp_unpivot_tbl
  2  as table of emp_unpivot_type;
  3  /

Type created.

SQL> ed
Wrote file afiedt.buf

  1  create or replace function unpivot_emp
  2  ( p_empno in number )
  3    return emp_unpivot_tbl
  4    pipelined
  5  is
  6    l_val varchar2(4000);
  7  begin
  8    for cols in (select column_name from user_tab_columns where table_name = 'EMP')
  9    loop
 10      execute immediate 'select ' || cols.column_name || ' from emp where empno = :empno'
 11         into l_val
 12       using p_empno;
 13      pipe row( emp_unpivot_type( p_empno, l_val ));
 14    end loop;
 15    return;
 16* end;
SQL> /

Function created.

Pak to můžete zavolat v příkazu SQL (myslím si, že byste chtěli alespoň třetí sloupec s názvem sloupce)

SQL> ed
Wrote file afiedt.buf

  1  select *
  2*   from table( unpivot_emp( 7934 ))
SQL> /

     EMPNO COL
---------- ----------------------------------------
      7934 7934
      7934 MILLER
      7934 CLERK
      7934 7782
      7934 23-JAN-82
      7934 1301
      7934
      7934 10

8 rows selected.

Efektivnějším přístupem by bylo přizpůsobení funkce zřetězené tabulky show_table Toma Kytea.




  1. Jak maskovat tabulky a zachovat referenční integritu

  2. Získat celkový počet řádků při použití LIMIT?

  3. Nelze načíst ID posledního vloženého řádku v režimu spánku pomocí Oracle

  4. Generování UUID v Postgres pro příkaz Insert?