12c और उससे अधिक के लिए, आप DBMS_SQL.RETURN_RESULT
. का उपयोग कर सकते हैं एक REFCURSOR
खोलकर गतिशील PIVOT
. के लिए क्वेरी।
मैंने कुख्यात (+)
. को हटा दिया है left join
. के लिए सिंटैक्स , हमेशा एएनएसआई का उपयोग करें join
वाक्य रचना।
DECLARE
exam_ids VARCHAR2(255);
x SYS_REFCURSOR;
BEGIN
SELECT
LISTAGG(''''
|| exam_id
|| ''' AS "'
|| exam_name
|| '"',',') WITHIN GROUP(
ORDER BY
exam_id DESC
)
INTO exam_ids
FROM
exam;
OPEN x FOR 'SELECT
*
FROM
(
SELECT
u.user_id,
u.user_name,
e.exam_id,
eu.exam_date
FROM
users u
LEFT JOIN exam_user eu ON u.user_id = eu.user_id
LEFT JOIN exam e ON e.exam_id = eu.exam_id
ORDER BY
u.user_id
)
PIVOT ( MAX ( exam_date )
FOR exam_id
IN ( ' || EXAM_IDS || ' )
)
ORDER BY
1';
dbms_sql.return_result(x);
END;
/
11g के लिए, आप एक बाइंड वेरिएबल और print
. का उपयोग कर सकते हैं कमांड (स्क्रिप्ट (F5) के रूप में चलाने पर sqlplus और sql डेवलपर/टॉड में काम करता है)
variable x REFCURSOR -- bind variable declared.
DECLARE
.. -- no need to declare sys_refcursor
BEGIN
..
OPEN :x FOR 'SELECT . --note the change with colon
*
FROM
(
SELECT
..
END;
/
print x