sql >> Databáze >  >> RDS >> Oracle

provést okamžité nezobrazování záznamů příkazu Dynamic Select

Protože neznáte strukturu předem, kvůli dynamickému pivotování na neznámý počet sloupců v sadě výsledků můžete použít referenční kurzor k načtení výsledku dynamického dotazu.

Toto používá proměnné vazby 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

klientská variable příkaz

variable rc refcursor;

deklaruje proměnnou a datový typ proměnné vazby klienta jako referenční kurzor. Pak raději než pomocí execute immediate otevře se pro s vaším dynamickým prohlášením:

  open :rc for sql_stmt; 

který otevře referenční kurzor s výsledky tohoto dotazu. (Všimněte si : na začátku :rc , což znamená, že jde o odkaz na proměnnou vazby, nikoli o lokální proměnnou PL/SQL).

Poté můžete mimo blok tisknout výsledná sada s:

print rc

Různí klienti/IDE budou potřebovat různou syntaxi. Něco podobného byste mohli udělat i přes JDBC. Můžete mít také funkci, která vrací sys_refcursor . Ale záleží, jaký je váš konečný cíl.

Mimochodem, v tuto chvíli dostanete nulu pro všechny pivotované součty; váš poslední dotaz musí získat PERIOD_NAME ve stejném formátu, který pivotní klauzule hledá, např.

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

i když by bylo o něco jednodušší ponechat původní formát v pivotní klauzuli:

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

S fiktivní tabulkou a daty:

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;

spuštění jedné verze a provedení print rc ukazuje:

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


  1. Jak nastavit proměnné prostředí pro Laravel 5 na AWS EC2 s MySQL

  2. nelze přenést hodnotu jako float

  3. Nesprávná syntaxe poblíž ')' volání uložené procedury s GETDATE

  4. neplatná chyba spouštěče