चूंकि आप संरचना को पहले से नहीं जानते हैं, क्योंकि परिणाम सेट में अज्ञात संख्या में कॉलम के लिए डायनामिक पिवट के कारण, आप डायनेमिक क्वेरी के परिणाम को पुनः प्राप्त करने के लिए रेफ कर्सर का उपयोग कर सकते हैं।
यह 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
variable rc refcursor;
क्लाइंट बाइंड वैरिएबल के वेरिएबल और डेटा टाइप को रेफरेंस कर्सर के रूप में घोषित करता है। फिर execute immediate
. का उपयोग करने के बजाय यह के लिए खुला हैए> आपके गतिशील कथन के साथ:
open :rc for sql_stmt;
जो उस क्वेरी के परिणामों के साथ रेफ कर्सर खोलता है। (:
:rc
. की शुरुआत में , यह दर्शाता है कि एक बाँध चर संदर्भ है न कि स्थानीय PL/SQL चर)।
फिर ब्लॉक के बाहर आप प्रिंट कर सकते हैं इसके साथ परिणाम सेट:
print rc
अलग-अलग क्लाइंट/आईडीई को अलग-अलग सिंटैक्स की ज़रूरत होगी। आप जेडीबीसी पर भी कुछ ऐसा ही कर सकते हैं। आपके पास एक फ़ंक्शन भी हो सकता है जो sys_refcursor
. देता है . लेकिन यह निर्भर करता है कि इसके लिए आपका अंतिम लक्ष्य क्या है।
संयोग से, इस समय आप सभी पिवट योगों के लिए शून्य हो जाएंगे; आपकी अंतिम क्वेरी को PERIOD_NAME
प्राप्त करने की आवश्यकता है उसी प्रारूप में पिवट क्लॉज की तलाश है, उदा.
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 || '))';
हालांकि इसके बजाय मूल प्रारूप को पिवट क्लॉज में छोड़ना थोड़ा आसान होगा:
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;
/
डमी टेबल और डेटा के साथ:
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;
किसी भी संस्करण को चलाना और print rc
करना दिखाता है:
JAN-18 FEB-18 MAR-18
---------- ---------- ----------
42 11 99