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

एक विशिष्ट मूल्य (ओरेकल) के लिए सभी तालिकाओं में सभी फ़ील्ड खोजें

उद्धरण:

<ब्लॉकक्वॉट>

मैंने नीचे दिए गए इस कथन का उपयोग करके एक उपयुक्त कॉलम खोजने की कोशिश की है जो मुझे लगता है कि इसे नाम दिया जाना चाहिए, लेकिन इसका कोई परिणाम नहीं निकला।*

SELECT * from dba_objects WHERE
object_name like '%DTN%'

एक कॉलम एक वस्तु नहीं है। यदि आपका मतलब है कि आप कॉलम नाम '%DTN%' की तरह होने की उम्मीद करते हैं, तो आप जो क्वेरी चाहते हैं वह है:

SELECT owner, table_name, column_name FROM all_tab_columns WHERE column_name LIKE '%DTN%';

लेकिन अगर 'डीटीएन' स्ट्रिंग आपकी ओर से सिर्फ एक अनुमान है, तो शायद इससे कोई फायदा नहीं होगा।

वैसे, आप कितने निश्चित हैं कि '1/22/2008P09RR8' एक कॉलम से सीधे चुना गया मान है? यदि आप बिल्कुल नहीं जानते हैं कि यह कहां से आ रहा है, तो यह कई स्तंभों का संयोजन हो सकता है, या किसी फ़ंक्शन का परिणाम हो सकता है, या नेस्टेड टेबल ऑब्जेक्ट में बैठा मान हो सकता है। तो आप उस मूल्य के लिए प्रत्येक कॉलम की जांच करने की कोशिश कर रहे जंगली हंस का पीछा कर सकते हैं। क्या आप इस मूल्य को प्रदर्शित करने वाले किसी भी क्लाइंट एप्लिकेशन से शुरू नहीं कर सकते हैं और यह पता लगाने की कोशिश कर सकते हैं कि इसे प्राप्त करने के लिए यह किस क्वेरी का उपयोग कर रहा है?

वैसे भी, diciu का उत्तर मान के लिए प्रत्येक तालिका के प्रत्येक कॉलम को जांचने के लिए SQL क्वेरी उत्पन्न करने का एक तरीका देता है। आप पीएल/एसक्यूएल ब्लॉक और डायनेमिक एसक्यूएल का उपयोग करके पूरी तरह से एक एसक्यूएल सत्र में समान सामान भी कर सकते हैं। उसके लिए जल्दबाजी में लिखा गया कुछ कोड यहां दिया गया है:

    SET SERVEROUTPUT ON SIZE 100000

    DECLARE
      match_count INTEGER;
    BEGIN
      FOR t IN (SELECT owner, table_name, column_name
                  FROM all_tab_columns
                  WHERE owner <> 'SYS' and data_type LIKE '%CHAR%') LOOP

        EXECUTE IMMEDIATE
          'SELECT COUNT(*) FROM ' || t.owner || '.' || t.table_name ||
          ' WHERE '||t.column_name||' = :1'
          INTO match_count
          USING '1/22/2008P09RR8';

        IF match_count > 0 THEN
          dbms_output.put_line( t.table_name ||' '||t.column_name||' '||match_count );
        END IF;

      END LOOP;

    END;
    /

कुछ तरीके हैं जिनसे आप इसे और अधिक कुशल भी बना सकते हैं।

इस मामले में, आप जिस मान की तलाश कर रहे हैं, आप NUMBER या DATE प्रकार के किसी भी कॉलम को स्पष्ट रूप से समाप्त कर सकते हैं, जिससे प्रश्नों की संख्या कम हो जाएगी। शायद इसे उन स्तंभों तक भी सीमित कर दें जहां प्रकार '%CHAR%' जैसा है।

प्रति कॉलम एक क्वेरी के बजाय, आप प्रति टेबल एक क्वेरी इस तरह बना सकते हैं:

SELECT * FROM table1
  WHERE column1 = 'value'
     OR column2 = 'value'
     OR column3 = 'value'
     ...
     ;


  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 डाटाबेस में PL/SQL सबरूटीन्स के लिए कॉलिंग नोटेशन

  2. OracleParameter.Value को Int32 . में बदलें

  3. तालिका से अधिकतम मूल्य से शुरू होने वाला ओरेकल अनुक्रम कैसे बनाएं?

  4. ACOS () Oracle में फंक्शन

  5. Oracle में PL/SQL फ़ंक्शन DBMS_AQ नहीं देख सकता है