Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

डायनामिक सेलेक्ट स्टेटमेंट के रिकॉर्ड नहीं दिखाते हुए तत्काल निष्पादित करें

चूंकि आप संरचना को पहले से नहीं जानते हैं, क्योंकि परिणाम सेट में अज्ञात संख्या में कॉलम के लिए डायनामिक पिवट के कारण, आप डायनेमिक क्वेरी के परिणाम को पुनः प्राप्त करने के लिए रेफ कर्सर का उपयोग कर सकते हैं।

यह 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 आदेश

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ओरेकल पर अद्यतन कैस्केड के साथ एक विदेशी कुंजी कैसे बनाएं?

  2. एसएसआईएस में ओरेकल से SQL2005 डेटाटाइम फ़ील्ड ओवरफ्लो हो जाता है

  3. JDBC:एकल डेटाबेस आमंत्रण के माध्यम से एकाधिक परिणाम सेट लौटाना - Oracle के लिए काम नहीं करना

  4. ORA-01027:बाइंड वेरिएबल्स को डेटा परिभाषा के लिए अनुमति नहीं है, जब उपयोग करने का प्रयास कर रहा है ifelif

  5. रेल का उपयोग करके ऑरैकल से कनेक्ट होने के बाद विशिष्ट स्क्रिप्ट कैसे चलाएं?