Något i stil med:
VARIABLE cur REFCURSOR;
DECLARE
dates VARCHAR2(4000);
start_date DATE := DATE '2017-09-18';
end_date DATE := DATE '2017-09-19';
BEGIN
SELECT LISTAGG(
'DATE ''' || TO_CHAR( dt, 'YYYY-MM-DD' )
|| ''' AS "' || TO_CHAR( dt, 'FMDY-DD' ) || '"',
','
) WITHIN GROUP ( ORDER BY dt )
INTO dates
FROM (
SELECT start_date + LEVEL - 1 AS dt
FROM DUAL
CONNECT BY LEVEL <= end_date - start_date + 1
);
OPEN :cur FOR
'SELECT * FROM (
SELECT t.*,
MIN( start_date ) OVER ( PARTITION BY prod_id ) AS min_start_date,
SUM( tot_hours ) OVER ( PARTITION BY prod_id ) AS prod_tot_hours
FROM prod_timings t
WHERE start_date BETWEEN :1 AND :2
)
PIVOT (
SUM( tot_hours )
FOR start_date IN (' || dates || ')
)
ORDER BY prod_id'
USING start_date, end_date;
END;
/
PRINT cur;