Een opgeslagen functie (of procedure ) kan worden gemaakt om een SQL voor Dynamic Pivoting te maken, en de resultatenset wordt geladen in een variabele van het type SYS_REFCURSOR
:
CREATE OR REPLACE FUNCTION Get_Categories_RS RETURN SYS_REFCURSOR IS
v_recordset SYS_REFCURSOR;
v_sql VARCHAR2(32767);
v_cols_1 VARCHAR2(32767);
v_cols_2 VARCHAR2(32767);
BEGIN
SELECT LISTAGG( ''''||"level"||''' AS "'||"level"||'"' , ',' )
WITHIN GROUP ( ORDER BY "level" DESC )
INTO v_cols_1
FROM (
SELECT DISTINCT "level"
FROM temp
);
SELECT LISTAGG( 'MAX(CASE WHEN category = '''||category||''' THEN "'||"level"||'" END) AS "'||"level"||'_'||category||'"' , ',' )
WITHIN GROUP ( ORDER BY category, "level" DESC )
INTO v_cols_2
FROM (
SELECT DISTINCT "level", category
FROM temp
);
v_sql :=
'SELECT "set", '|| v_cols_2 ||'
FROM
(
SELECT *
FROM temp
PIVOT
(
MAX(value) FOR "level" IN ( '|| v_cols_1 ||' )
)
)
GROUP BY "set"
ORDER BY "set"';
OPEN v_recordset FOR v_sql;
RETURN v_recordset;
END;
waarin ik twee niveaus van draaien gebruikte:de eerste is binnen de innerlijke query met PIVOT
Clausule, en de tweede is in de buitenste query met de voorwaardelijke aggregatielogica. Merk op dat de volgorde van de niveaus in aflopende volgorde moet staan( Z
, Y
, X
) binnen het verwachte resultaat als in overeenstemming met de beschrijving.
En roep dan
. opVAR rc REFCURSOR
EXEC :rc := Get_Categories_RS;
PRINT rc
van SQL Developer's Command Line om de resultatenset te krijgen
Btw, vermijd het gebruik van gereserveerde zoekwoorden zoals set
en level
zoals in jouw geval. Ik moest ze citeren om ze te kunnen gebruiken.