Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

UNPIVOT trên một số cột không xác định

Có vẻ như bạn muốn bỏ chia bảng (xoay vòng sẽ liên quan đến việc chuyển từ nhiều hàng và 2 cột thành 1 hàng có nhiều cột). Rất có thể bạn sẽ cần sử dụng SQL động để tạo truy vấn và sau đó sử dụng DBMS_SQL gói (hoặc có khả năng EXECUTE IMMEDIATE ) để thực thi nó. Bạn cũng có thể xây dựng một hàm bảng pipelined đã thực hiện việc giải nén. Bạn cũng cần phải sử dụng SQL động trong hàm bảng pipelined nhưng nó có thể sẽ ít mã hơn. Tôi mong đợi một câu lệnh SQL động thuần túy sử dụng UNPIVOT để hiệu quả hơn.

Một cách tiếp cận không hiệu quả, nhưng tương đối dễ làm theo, sẽ giống như

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.

Sau đó, bạn có thể gọi nó trong một câu lệnh SQL (tôi nghĩ rằng bạn muốn có ít nhất một cột thứ ba có tên cột)

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.

Một cách tiếp cận hiệu quả hơn sẽ là điều chỉnh hàm bảng tổng hợp show_table của 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. Cấp quyền đối với thủ tục đã lưu trữ cho người dùng khác của Oracle

  2. PLS-00428:mệnh đề INTO được mong đợi trong câu lệnh SELECT này

  3. Hàm NCHR () trong Oracle

  4. TO_CHAR của một loại Oracle PL / SQL TABLE

  5. SQL:làm thế nào để sử dụng UNION và sắp xếp theo một lựa chọn cụ thể?