sql >> Database teknologi >  >> RDS >> Oracle

udfør øjeblikkelig ikke at vise registreringer af Dynamic Select-sætning

Da du ikke kender strukturen på forhånd, kan du på grund af den dynamiske pivot til et ukendt antal kolonner i resultatsættet bruge en ref-markør til at hente resultatet af den dynamiske forespørgsel.

Dette bruger SQL*Plus/SQL Developer/SQLcl bindevariabler;

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

klient-variable kommando

variable rc refcursor;

erklærer variabelen og datatypen for klientbindingsvariablen som en referencemarkør. Så i stedet for at bruge execute immediate den åben for med dit dynamiske udsagn:

  open :rc for sql_stmt; 

som åbner ref-markøren med resultaterne af den forespørgsel. (Bemærk : i starten af ​​:rc , hvilket indikerer, at det er en bindevariabelreference, ikke en lokal PL/SQL-variabel).

Så uden for blokken kan du udskrive resultatsættet med:

print rc

Forskellige klienter/IDE'er har brug for forskellig syntaks. Du kunne også gøre noget lignende over JDBC. Du kan også have en funktion, der returnerer en sys_refcursor . Men det afhænger af, hvad dit endelige mål for dette er.

I øvrigt vil du i øjeblikket få null for alle de pivoterede totaler; din sidste forespørgsel skal have PERIOD_NAME i det samme format som pivotsætningen leder efter, f.eks.

  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 || '))';

selvom det ville være lidt nemmere at lade det originale format blive i pivotsætningen i stedet:

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;
/

Med en dummy-tabel og data:

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;

kører begge versioner og laver print rc viser:

    JAN-18     FEB-18     MAR-18
---------- ---------- ----------
        42         11         99


  1. jqGrid Act Strange Genindlæsning af data efter indsættelse og opdatering

  2. Apache 2.4 med PHP 5.4:ingen mysql tilgængelig

  3. Hvordan gendanner man data fra MySQL .frm?

  4. Hvordan kan jeg køre en mysql-forespørgsel, når brugeren vælger en ny mulighed i et udvalgt felt?