Karena Anda tidak mengetahui struktur sebelumnya, karena pivot dinamis ke jumlah kolom yang tidak diketahui dalam kumpulan hasil, Anda dapat menggunakan kursor ref untuk mengambil hasil kueri dinamis.
Ini menggunakan variabel pengikatan SQL*Plus/SQL Developer/SQLcl;
variable rc refcursor;
declare
sql_stmt clob;
pivot_clause clob;
begin
select listagg('''' || TO_CHAR(PERIOD_NAME,'MON-YY') || ''' as "' || TO_CHAR(PERIOD_NAME,'MON-YY') || '"', ',')
within group (order by PERIOD_NAME)
into pivot_clause from (select TO_DATE(PERIOD_NAME,'MON-YYYY') PERIOD_NAME
from table1
where request_id=<id>
GROUP BY TO_DATE(PERIOD_NAME,'MON-YYYY')
order by TO_DATE(PERIOD_NAME,'MON-YYYY') ASC);
sql_stmt := 'select * from (select PERIOD_NAME, depreciation
from table1) pivot (sum(depreciation) for PERIOD_NAME in (' || pivot_clause || '))';
open :rc for sql_stmt;
end;
/
print rc
variable rc refcursor;
mendeklarasikan variabel dan tipe data dari variabel pengikatan klien, sebagai kursor referensi. Kemudian daripada menggunakan execute immediate
itu terbuka untuk dengan pernyataan dinamis Anda:
open :rc for sql_stmt;
yang membuka kursor ref dengan hasil kueri itu. (Perhatikan :
di awal :rc
, menunjukkan bahwa itu adalah referensi variabel ikat bukan variabel PL/SQL lokal).
Kemudian di luar blok Anda dapat mencetak hasil ditetapkan dengan:
print rc
Klien/IDE yang berbeda akan membutuhkan sintaks yang berbeda. Anda dapat melakukan hal serupa melalui JDBC juga. Anda juga dapat memiliki fungsi yang mengembalikan sys_refcursor
. Tapi itu tergantung apa tujuan akhir Anda.
Kebetulan, saat ini Anda akan mendapatkan nol untuk semua total yang diputar; kueri terakhir Anda harus mendapatkan PERIOD_NAME
dalam format yang sama dengan yang dicari oleh klausa pivot, mis.
sql_stmt := 'select * from (select to_char(to_date(PERIOD_NAME, ''MON-YYYY''), ''MON-YY'') as PERIOD_NAME, depreciation
from table1) pivot (sum(depreciation) for PERIOD_NAME in (' || pivot_clause || '))';
meskipun akan sedikit lebih mudah untuk meninggalkan format aslinya di klausa pivot sebagai gantinya:
declare
sql_stmt clob;
pivot_clause clob;
begin
select listagg('''' || PERIOD_NAME || ''' as "' || TO_CHAR(PERIOD_DATE,'MON-YY') || '"', ',')
within group (order by PERIOD_DATE)
into pivot_clause from (select distinct PERIOD_NAME, TO_DATE(PERIOD_NAME,'MON-YYYY') PERIOD_DATE
from table1
where request_id=<id>);
sql_stmt := 'select * from (select PERIOD_NAME, depreciation
from table1) pivot (sum(depreciation) for PERIOD_NAME in (' || pivot_clause || '))';
open :rc for sql_stmt;
end;
/
Dengan tabel dan data dummy:
create table table1 (request_id, period_name, depreciation) as
select 1, 'JAN-2018', 42 from dual
union all select 1, 'FEB-2018', 11 from dual
union all select 1, 'MAR-2018', 22 from dual
union all select 1, 'MAR-2018', 33 from dual
union all select 2, 'MAR-2018', 44 from dual;
menjalankan salah satu versi dan melakukan print rc
menunjukkan:
JAN-18 FEB-18 MAR-18
---------- ---------- ----------
42 11 99