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/2008P09RR8
olması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
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'
...
;
Nasıl belirli bir dize için depodaki G...
Nasıl PHP belirli bir anahtar değeri i...
Sağa ve yukarıdan aşağıya, soldan 2 bo...
Ruby: bir desen için dosya metin Arama...
nasıl = eğer belirli bir dize değeri N...