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

SQL:दिए गए मान वाले स्तंभों की सूची खोजें (एक पंक्ति के भीतर)

यह डेटाबेस कार्यक्षमता का एक सामान्य टुकड़ा नहीं है। हालांकि आप पहले व्यक्ति नहीं हैं जिन्होंने इसके लिए कहा है, या ऐसा कुछ नहीं है।

समाधान के लिए दो चीजों की आवश्यकता होती है। पहला डेटा डिक्शनरी है; Oracle डेटाबेस परावर्तन का समर्थन नहीं करता है, लेकिन यह विचारों के एक सेट के साथ आता है जो हमें हमारे डेटाबेस ऑब्जेक्ट्स के बारे में मेटाडेटा देता है। इस मामले में हमें user_tab_columns . की आवश्यकता है , जो हमें दी गई तालिका के लिए कॉलम देगा। दूसरी बात गतिशील एसक्यूएल है; यह रनटाइम पर SQL क्वेरी को इकट्ठा करने और फिर इसे निष्पादित करने की क्षमता है। ऐसा करने के कुछ तरीके हैं, लेकिन आमतौर पर रेफरी कर्सर पर्याप्त होते हैं।

निम्नलिखित कोड अवधारणा का प्रमाण है। इसमें चार पैरामीटर लगते हैं:

  1. तालिका का नाम जिसे आप खोजना चाहते हैं
  2. उस तालिका के प्राथमिक कुंजी स्तंभ का नाम
  3. प्राथमिक कुंजी मान जिसे आप प्रतिबंधित करना चाहते हैं
  4. वह मान जिसे आप खोजना चाहते हैं।

यह रफ'न'रेडी है इसलिए आउटपुट को व्यवस्थित करने या प्रोग्राम को अधिक लचीला बनाने के लिए आपको इसे संपादित करने की आवश्यकता हो सकती है।

create or replace procedure search_cols
  (tname in user_tables.table_name%type
   , pk_col in user_tab_columns.column_name%type
   , pk in number
   , val in number )
is
    firstcol boolean := true;
    stmt varchar2(32767);
    result varchar2(32767);
    rc sys_refcursor;
begin
    stmt := 'select ';
    << projection >>
    for lrec in ( select column_name from user_tab_columns
                  where table_name = tname
                  and column_name != pk_col
                  and data_type = 'NUMBER'
                  order by column_id )
    loop
        if not firstcol then
            stmt := stmt || chr(10) || '||'',''||';
        else
            firstcol := false;
        end if;
        stmt := stmt || ' case when '|| lrec.column_name||' = '|| val ||
                           ' then '''|| lrec.column_name || ''' else null end';
    end loop projection;
    stmt := stmt || chr(10)|| ' from '||tname||' where '|| pk_col || ' = '|| pk;
    --  dbms_output.put_line(stmt);
    open rc for stmt;
    fetch rc into result;
    close rc;
    dbms_output.put_line(tname || '::' || val || ' found in '||result);
end search_cols;
/

जैसा कि आप देख सकते हैं, डायनेमिक SQL को पढ़ना मुश्किल है। डिबग करना कठिन है :) इसलिए अंतिम विवरण दिखाने के लिए साधन होना एक अच्छा विचार है।

वैसे भी, ये रहे परिणाम:

SQL> set serveroutput on size unlimited
SQL> exec search_cols('T23', 'ID', 111, 10)
T23::10 found in ,COL_B,COL_C,

PL/SQL procedure successfully completed.

SQL> exec search_cols('T23', 'ID', 222, 10)
T23::10 found in COL_A,,,

PL/SQL procedure successfully completed.

SQL>


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle में SYSDATE फ़ंक्शन

  2. अखंडता बाधा (...) का उल्लंघन किया गया - चाइल्ड रिकॉर्ड मिला, जावा, ओरेकल, हाइबरनेट

  3. Oracle में एंगल ब्रैकेट्स के साथ नेगेटिव नंबर्स को कैसे फॉर्मेट करें?

  4. अपने माता-पिता के स्वामित्व वाले मूल के प्रतिशत की गणना करें

  5. Oracle SQL क्वेरी फ़िल्टर JOIN ON बनाम WHERE में