आप सही रास्ते पर हैं लेकिन वह मामला तब विफल हो जाता है जब कम से कम एक छात्र के लिए एक से अधिक कक्षाएं निर्धारित की जाती हैं। एक ROW_NUMBER()
विश्लेषणात्मक कार्य इस मुद्दे को हल करता है। तो, SYS_REFCURSOR
. सहित एक संग्रहित फ़ंक्शन बनाएं :
CREATE OR REPLACE FUNCTION get_student_rs RETURN SYS_REFCURSOR IS
recordset SYS_REFCURSOR;
sqlqry VARCHAR2(32767);
cols VARCHAR2(32767);
BEGIN
SELECT LISTAGG(''''||name||''' AS "'||name||'"' ,',') WITHIN GROUP (ORDER BY 0)
INTO cols
FROM ( SELECT DISTINCT name FROM Students );
sqlqry :=
'SELECT *
FROM
(
SELECT ROW_NUMBER() OVER (PARTITION BY name ORDER BY 0) AS rn,
s.*
FROM Students s
)
PIVOT (
MAX(class) FOR name IN ('||cols||')
)
ORDER BY rn';
OPEN recordset FOR sqlqry;
RETURN recordset;
END;
/
मान लें कि एक और रिकॉर्ड डाला गया है;
Name School Class
---- ------ -------
Jim Hs History
फिर आह्वान करें
VAR rc REFCURSOR
EXEC :rc := get_student_rs;
PRINT rc
एसक्यूएल डेवलपर . से की कमांड लाइन परिणाम सेट देखने के लिए जो होगा:
RN SCHOOL Jim John Matthew Steve
-- ------ ------- ------- ------- ------
1 Hs Maths English Science Maths
2 Hs History