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

jalankan segera tidak menampilkan catatan pernyataan Dynamic Select

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 klien perintah

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. java.sql.SQLException:ORA-01843:bukan bulan yang valid

  2. Buat ulang tabel Oracle DUAL

  3. Apakah PL/SQL memiliki StringTokenizer yang setara dengan Java?

  4. Angkat pernyataan

  5. Ekstensi Centos 6 PHP OCI8 tidak berfungsi (Fungsi tidak terdefinisi oci_connect ())