Oracle
 sql >> Baza danych >  >> RDS >> Oracle

UNPIVOT na nieokreślonej liczbie kolumn

Wygląda na to, że chcesz odwrócić tabelę (przestawianie wymagałoby przejścia z wielu wierszy i 2 kolumn do 1 wiersza z wieloma kolumnami). Najprawdopodobniej będziesz musiał użyć dynamicznego SQL do wygenerowania zapytania, a następnie użyć DBMS_SQL pakiet (lub potencjalnie EXECUTE IMMEDIATE ), aby go wykonać. Powinieneś również być w stanie skonstruować funkcję tabeli potokowej, która wykonała cofanie. Musiałbyś również użyć dynamicznego SQL w ramach funkcji tabeli potokowej, ale potencjalnie oznaczałoby to mniej kodu. Spodziewałbym się czystej dynamicznej instrukcji SQL przy użyciu UNPIVOT być bardziej wydajnym.

Nieefektywnym podejściem, ale stosunkowo łatwym do naśladowania, byłoby coś w stylu

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.

Możesz to następnie wywołać w instrukcji SQL (myślę, że potrzebujesz przynajmniej trzeciej kolumny z nazwą kolumny)

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.

Bardziej wydajnym podejściem byłoby dostosowanie funkcji tabeli potokowej show_table Toma Kyte'a.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Odwołaj się do tabeli w innym schemacie, pomijając nazwę schematu

  2. Połącz wyniki z zapytania SQL w Oracle

  3. System.Data.OracleClient wymaga oprogramowania klienckiego Oracle w wersji 8.1.7

  4. Obcinanie tabeli w procedurze składowanej

  5. Przewodnik krok po kroku dotyczący instalacji MySQL w systemie Windows