Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

UNPIVOT pada jumlah kolom tak tentu

Kedengarannya seperti Anda ingin unpivot tabel (memutar akan melibatkan pergi dari banyak baris dan 2 kolom ke 1 baris dengan banyak kolom). Anda kemungkinan besar perlu menggunakan SQL dinamis untuk menghasilkan kueri dan kemudian menggunakan DBMS_SQL paket (atau berpotensi EXECUTE IMMEDIATE ) untuk mengeksekusinya. Anda juga harus dapat membuat fungsi tabel pipelined yang melakukan unpivoting. Anda harus menggunakan SQL dinamis dalam fungsi tabel pipelined juga tetapi berpotensi menjadi lebih sedikit kode. Saya mengharapkan pernyataan SQL dinamis murni menggunakan UNPIVOT agar lebih efisien.

Pendekatan yang tidak efisien, tetapi yang relatif mudah diikuti, adalah seperti

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.

Anda kemudian dapat menyebutnya dalam pernyataan SQL (saya pikir Anda ingin setidaknya kolom ketiga dengan nama kolom)

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.

Pendekatan yang lebih efisien adalah dengan mengadaptasi fungsi tabel pipa show_table Tom Kyte.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Fungsi DBTIMEZONE di Oracle

  2. Peningkatan otomatis di Oracle ke tabel yang sudah dibuat

  3. Oracle Database Explorer:Pelatihan dan Akreditasi Gratis

  4. Klien Oracle dan komponen jaringan tidak ditemukan

  5. Menjaga agnostik database aplikasi (ADO.NET vs enkapsulasi logika DB)