SORU
16 EKİM 2008, PERŞEMBE


Arama Belirli Bir Değeri (Oracle)İçin Tüm Tablolardaki Tüm Alanları

Oracle belirli bir değer için her tablonun her alanda aramak mümkün mü?

Bu çok uzun bir süre sorguya çekebilir ve biliyorum ki bazı tablolardaki satırları binlerce yüzlerce tablo var. Ama bildiğim tek şey sorgusu için istiyorum alan için bir değer 1/22/2008P09RR8olmasıdır. <

Aşağıda bu deyimi uygun bir sütun adında olması gerektiğini düşünüyorum Ne dayalı bulmak için kullanarak denedim ama hiçbir sonuç döndürdü.

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

Kesinlikle bu veritabanı üzerinde belge yok Hayır bu sahadan çekilir hiçbir fikrim yok.

Herhangi bir düşünce?

CEVAP
16 EKİM 2008, PERŞEMBE


Alıntı:

Aşağıda bu deyimi kullanarak denedim uygun bir sütuna göre bulmak için ne ben onu ama adında olması gerektiğini düşünüyorum sonuç.* döndü

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

Bir sütun bir nesne değil. Eğer sütun adı', istediğiniz sorgu:. %'% DTN gibi beklediğiniz kastediyorsan

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

Ama eğer 'DTN' string sadece sizin açınızdan, bu pek bir yardımı olmaz sanırım.

Bu arada, emin misiniz '/2008P09RR8 1/22' bir değeri doğrudan tek bir sütun seçilir? Eğer nereden geldiğini tam olarak tanımıyorsun bile, birden fazla sütun veya bazı işlev sonucu bir birleştirme olabilir, ya da bir değeri iç içe geçmiş bir tablo içinde oturan bir nesne. Boşu boşuna bu değer için her sütunu kontrol etmeye çalışıyor olabilirsiniz. Her istemci uygulama bu değeri görüntülüyor başlayabilirsiniz ve onu elde etmek için kullanarak ne olduğunu anlamaya çalışalım?

Neyse, diciu cevabı SQL sorguları değeri için her tablonun her sütun için onay üreten bir yöntem verir. Ayrıca benzer şeyler tamamen bir SQL oturum/SQL bloğu ve dinamik bir SQL PL kullanarak yapabilirsiniz. İşte aceleyle yazılmış bir kod için:

    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;
    /

Daha verimli de yapabilir bazı yolları vardır.

Aradığınız değer verilen bu durumda, açıkça sorgu sayısını azaltacak NUMARASI veya TARİH türü, herhangi bir sütun ortadan kaldırabilirsiniz. Tipi gibi olduğu, hatta belki de sütunlar için kısıtlama '%CHAR%'.

Sütun başına bir sorgu yerine, bu gibi masa başı bir sorgu oluşturabilirsin:

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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Barnacules Nerdgasm

    Barnacules N

    20 Temmuz 2006
  • Bart Baker

    Bart Baker

    1 Aralık 2006
  • macpulenta

    macpulenta

    9 EYLÜL 2006