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


115

Oracle'da belirli bir değer için her tablonun her alanında arama yapmak mümkün müdür?

Bazı tablolarda binlerce satır içeren yüzlerce tablo var, bu yüzden bunu sorgulamanın çok uzun zaman alabileceğini biliyorum. Ancak bildiğim tek şey, sorgulamak istediğim alan için bir değer olduğudur 1/22/2008P09RR8. <

Adlandırılması gerektiğini düşündüğüm şeyi temel alan uygun bir sütun bulmak için aşağıdaki ifadeyi kullanmayı denedim, ancak sonuç vermedi.

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

Bu veritabanında kesinlikle hiçbir belge yok ve bu alanın nereden alındığı hakkında hiçbir fikrim yok.

Düşüncesi olan var mı?


Bunu saklı yordam kullanmak yerine tek bir sorgu kullanarak yapabilir miyiz?
Freakyuser


@LalitKumarB Listelediğiniz sayfaya artık erişilemiyor. Cevap olarak bazı bilgileri göndermek mümkün müdür?
Dodzi Dzakuma

@DodziDzakuma Sayfaya erişilebilir lalitkumarb.wordpress.com/2015/01/06/… Ayrıca bir cevap gönderdim, lütfen aşağı kaydırın veya stackoverflow.com/a/27794127/3989608'e
Lalit Kumar B

Lalit Kumar sorgusunu anlamada
DxTx

Yanıtlar:


93

Alıntı:

Adlandırılması gerektiğini düşündüğüm şeyi temel alan uygun bir sütun bulmak için aşağıdaki ifadeyi kullanmayı denedim, ancak sonuç vermedi. *

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

Sütun bir nesne değildir. Sütun adının '% DTN%' gibi olmasını beklediğinizi kastediyorsanız, istediğiniz sorgu şudur:

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

Ancak 'DTN' dizesi sizin açınızdan sadece bir tahmin ise, bu muhtemelen yardımcı olmayacaktır.

Bu arada, '1/22 ​​/ 2008P09RR8'in doğrudan tek bir sütundan seçilen bir değer olduğundan ne kadar eminsiniz? Nereden geldiğini hiç bilmiyorsanız, birkaç sütunun bir araya getirilmesi veya bazı işlevlerin sonucu veya iç içe geçmiş bir tablo nesnesinde bulunan bir değer olabilir. Bu nedenle, bu değer için her sütunu kontrol etmeye çalışan bir vahşi kaz kovalamacasında olabilirsiniz. Bu değeri görüntüleyen istemci uygulamasıyla başlayıp, onu elde etmek için hangi sorguyu kullandığını anlamaya çalışamaz mısınız?

Her neyse, diciu'nun cevabı, değer için her tablonun her sütununu kontrol etmek için SQL sorguları oluşturmanın bir yöntemini verir. Bir PL / SQL bloğu ve dinamik SQL kullanarak benzer şeyleri tamamen tek bir SQL oturumunda da yapabilirsiniz. İşte bunun için aceleyle yazılmış bazı kodlar:

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

Bunu daha verimli hale getirmenin de bazı yolları var.

Bu durumda, aradığınız değer göz önüne alındığında, SAYI veya TARİH türündeki tüm sütunları net bir şekilde ortadan kaldırabilirsiniz, bu da sorgu sayısını azaltır. Hatta türünün '% CHAR%' gibi olduğu sütunlarla bile sınırlandırabilirsiniz.

Sütun başına bir sorgu yerine, tablo başına şu şekilde bir sorgu oluşturabilirsiniz:

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

Sayı ve tarih sütunları muhtemelen bu dizeyi içeremeyeceğinden, onu char, varchar ve varchar2 sütunlarıyla sınırlamalısınız.
Erich Kitzmueller

8
@ammoQ - sondan ikinci paragrafta söylediğim gibi?
Dave Costa

Bunu 9i'de çalıştırdım ve column_name unknown hatası alıyorum. Biri bana bunu 9i'de çalıştırmak için hangi değişikliğin gerekli olduğunu söyleyebilir mi?
Regmi

@Regmi - üzgünüm, bu aslında kodumdaki bir hataydı, sürüm sorunu değil. Döngü, all_tab_columnsdeğil tarafından yönlendirilmeliydi all_tables. Ben düzelttim.
Dave Costa

@DaveCosta - Düzeltme için teşekkürler, ancak 6. satırda hala 'tablo veya görünüm yok' hatası alıyorum. Satır 6 "Hemen Yürüt".
Regmi

34

Yalnızca bir sahipte arama yapıyorsanız daha hızlı çalışmasını sağlamak için yukarıdaki kodda bazı değişiklikler yaptım. Sadece aradığınız şeye uyması için 3 değişkeni v_owner, v_data_type ve v_search_string değiştirmelisiniz.

SET SERVEROUTPUT ON SIZE 100000

DECLARE
  match_count INTEGER;
-- Type the owner of the tables you are looking at
  v_owner VARCHAR2(255) :='ENTER_USERNAME_HERE';

-- Type the data type you are look at (in CAPITAL)
-- VARCHAR2, NUMBER, etc.
  v_data_type VARCHAR2(255) :='VARCHAR2';

-- Type the string you are looking at
  v_search_string VARCHAR2(4000) :='string to search here...';

BEGIN
  FOR t IN (SELECT table_name, column_name FROM all_tab_cols where owner=v_owner and data_type = v_data_type) LOOP

    EXECUTE IMMEDIATE 
    'SELECT COUNT(*) FROM '||t.table_name||' WHERE '||t.column_name||' = :1'
    INTO match_count
    USING v_search_string;

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

  END LOOP;
END;
/

Bu sorguyu çalıştırabilmek için ilk satırı yorumlamam gerekiyordu. Ayrıca sahip filtresini kaldıramadım ve sorguyu çalıştıramadım.
Popa Andrei

1
Bunlardan alıntı yapılması gerektiğinde sorunlardan kaçınmak için tablo adı / sütun adının etrafına çift tırnak işareti koymam gerekiyordu:'SELECT COUNT(*) FROM "'||t.table_name||'" WHERE "'||t.column_name||'" = :1'
Steve Chambers

All_tab_cols'un ismine rağmen görünümler de içerdiğine dikkat edin
phil_w

tam olarak nedir dbms_output? Çünkü sorgular DataGrip'te başarıyla yürütüldü, ancak sonrasında herhangi bir sonuç görmüyorum.
misteeque

Bunun biraz eski olduğunu biliyorum, ancak bunu çalıştırdığımda "anonim blok tamamlandı" komut dosyası çıktısı
alıyorum

7

İşte daha düşük bir alt dize eşleşmesini karşılaştıracak başka bir değiştirilmiş sürüm. Bu Oracle 11g'de çalışır.

DECLARE
  match_count INTEGER;
-- Type the owner of the tables you are looking at
  v_owner VARCHAR2(255) :='OWNER_NAME';

-- Type the data type you are look at (in CAPITAL)
-- VARCHAR2, NUMBER, etc.
  v_data_type VARCHAR2(255) :='VARCHAR2';

-- Type the string you are looking at
  v_search_string VARCHAR2(4000) :='%lower-search-sub-string%';

BEGIN
  FOR t IN (SELECT table_name, column_name FROM all_tab_cols where owner=v_owner and data_type = v_data_type) LOOP

    EXECUTE IMMEDIATE 
    'SELECT COUNT(*) FROM '||t.table_name||' WHERE lower('||t.column_name||') like :1'
    INTO match_count
    USING v_search_string;

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

  END LOOP;
END;
/

7

Evet yapabilirsiniz ve DBA'nız sizden nefret edecek ve ayakkabılarınızı zemine çivilemenizi sağlayacak çünkü bu, çok sayıda G / Ç'ye neden olacak ve önbellek temizlenirken veritabanı performansını gerçekten düşürür.

select column_name from all_tab_columns c, user_all_tables u where c.table_name = u.table_name;

başlangıç ​​için.

Çalıştıran sorgularla, v$sessionve v$sqlarea. Bu, oracle sürümüne göre değişir. Bu, alanı daraltır ve her şeye çarpmaz.


7

Bunun eski bir konu olduğunu biliyorum. Ama soruya SQLkullanmak yerine yapılıp yapılamayacağını soran bir yorum görüyorum PL/SQL. Yani bir çözüm yayınlamayı düşündüm.

Aşağıdaki gösteri, bir ŞEMA'nın tamamındaki tüm TABLOLARIN tüm SÜTUNLARINDA bir DEĞER aramak içindir :

  • KARAKTER türü arayın

Değeri atalım KINGiçinde SCOTTşema.

SQL> variable val varchar2(10)
SQL> exec :val := 'KING'

PL/SQL procedure successfully completed.

SQL> SELECT DISTINCT SUBSTR (:val, 1, 11) "Searchword",
  2    SUBSTR (table_name, 1, 14) "Table",
  3    SUBSTR (column_name, 1, 14) "Column"
  4  FROM cols,
  5    TABLE (xmlsequence (dbms_xmlgen.getxmltype ('select '
  6    || column_name
  7    || ' from '
  8    || table_name
  9    || ' where upper('
 10    || column_name
 11    || ') like upper(''%'
 12    || :val
 13    || '%'')' ).extract ('ROWSET/ROW/*') ) ) t
 14  ORDER BY "Table"
 15  /

Searchword  Table          Column
----------- -------------- --------------
KING        EMP            ENAME

SQL>
  • NUMERIC bir tür arayın

Değeri atalım 20içinde SCOTTşema.

SQL> variable val NUMBER
SQL> exec :val := 20

PL/SQL procedure successfully completed.

SQL> SELECT DISTINCT SUBSTR (:val, 1, 11) "Searchword",
  2    SUBSTR (table_name, 1, 14) "Table",
  3    SUBSTR (column_name, 1, 14) "Column"
  4  FROM cols,
  5    TABLE (xmlsequence (dbms_xmlgen.getxmltype ('select '
  6    || column_name
  7    || ' from '
  8    || table_name
  9    || ' where upper('
 10    || column_name
 11    || ') like upper(''%'
 12    || :val
 13    || '%'')' ).extract ('ROWSET/ROW/*') ) ) t
 14  ORDER BY "Table"
 15  /

Searchword  Table          Column
----------- -------------- --------------
20          DEPT           DEPTNO
20          EMP            DEPTNO
20          EMP            HIREDATE
20          SALGRADE       HISAL
20          SALGRADE       LOSAL

SQL>

6
hrmm .... xml kullanmak abartılı gibi görünüyor. Ayrıca:Error occurred in XML processing ORA-00932: inconsistent datatypes: expected NUMBER got BLOB
towi

2
ORA-19202: XML işlemede hata oluştu ORA-00932: tutarsız veri türleri: beklenen CHAR BLOB aldı ORA-06512: "SYS.DBMS_XMLGEN" satır 288 ORA-06512: 1. satır 19202. 00000 - "XML işlemede hata oluştu % s "* Neden: XML işlevi işlenirken bir hata oluştu * Eylem: Verilen hata mesajını kontrol edin ve uygun sorunu düzeltin
Muhammed Faysal

Herhangi bir fikir? ORA-19202: XML işlemede hata oluştu ORA-22813: işlenen değeri sistem limitlerini aşıyor ORA-06512: "SYS.DBMS_XMLGEN" satır 288 ORA-06512: satır 1
Menios

5

Bunun gibi bir şey yapardım (ihtiyacınız olan tüm seçimleri üretir). Daha sonra bunları sqlplus'a besleyebilirsiniz:

echo "select table_name from user_tables;" | sqlplus -S user/pwd | grep -v "^--" | grep -v "TABLE_NAME" | grep "^[A-Z]" | while read sw;
do echo "desc $sw" | sqlplus -S user/pwd | grep -v "\-\-\-\-\-\-" | awk -F' ' '{print $1}' | while read nw;
do echo "select * from $sw where $nw='val'";
done;
done;

Verir:

select * from TBL1 where DESCRIPTION='val'
select * from TBL1 where ='val'
select * from TBL2 where Name='val'
select * from TBL2 where LNG_ID='val'

Her biri için - Ve ne yapar ise table_namegelen user_tables(desc itibaren) her alanı almak ve saha 'val' eşittir tablosundan seçin * oluşturun.


5

Daha hızlı yürütme için Flood'un komut dosyasını her tablonun her sütunu yerine her tablo için bir kez çalışacak şekilde değiştirdim. Oracle 11g veya üstünü gerektirir.

    set serveroutput on size 100000

declare
    v_match_count integer;
    v_counter integer;

    -- The owner of the tables to search through (case-sensitive)
    v_owner varchar2(255) := 'OWNER_NAME';
    -- A string that is part of the data type(s) of the columns to search through (case-insensitive)
    v_data_type varchar2(255) := 'CHAR';
    -- The string to be searched for (case-insensitive)
    v_search_string varchar2(4000) := 'FIND_ME';

    -- Store the SQL to execute for each table in a CLOB to get around the 32767 byte max size for a VARCHAR2 in PL/SQL
    v_sql clob := '';
begin
    for cur_tables in (select owner, table_name from all_tables where owner = v_owner and table_name in 
                       (select table_name from all_tab_columns where owner = all_tables.owner and data_type like '%' ||  upper(v_data_type) || '%')
                       order by table_name) loop
        v_counter := 0;
        v_sql := '';

        for cur_columns in (select column_name from all_tab_columns where 
                            owner = v_owner and table_name = cur_tables.table_name and data_type like '%' || upper(v_data_type) || '%') loop
            if v_counter > 0 then
                v_sql := v_sql || ' or ';
            end if;
            v_sql := v_sql || 'upper(' || cur_columns.column_name || ') like ''%' || upper(v_search_string) || '%''';
            v_counter := v_counter + 1;
        end loop;

        v_sql := 'select count(*) from ' || cur_tables.table_name || ' where ' || v_sql;

        execute immediate v_sql
        into v_match_count;

        if v_match_count > 0 then
            dbms_output.put_line('Match in ' || cur_tables.owner || ': ' || cur_tables.table_name || ' - ' || v_match_count || ' records');
        end if;
    end loop;

    exception
        when others then
            dbms_output.put_line('Error when executing the following: ' || dbms_lob.substr(v_sql, 32600));
end;
/

5

@Lalit Kumars cevabı için aşağıdaki sorunları yaşıyordum,

ORA-19202: Error occurred in XML processing
ORA-00904: "SUCCESS": invalid identifier
ORA-06512: at "SYS.DBMS_XMLGEN", line 288
ORA-06512: at line 1
19202. 00000 -  "Error occurred in XML processing%s"
*Cause:    An error occurred when processing the XML function
*Action:   Check the given error message and fix the appropriate problem

Çözüm şudur:

WITH  char_cols AS
  (SELECT /*+materialize */ table_name, column_name
   FROM   cols
   WHERE  data_type IN ('CHAR', 'VARCHAR2'))
SELECT DISTINCT SUBSTR (:val, 1, 11) "Searchword",
       SUBSTR (table_name, 1, 14) "Table",
       SUBSTR (column_name, 1, 14) "Column"
FROM   char_cols,
       TABLE (xmlsequence (dbms_xmlgen.getxmltype ('select "'
       || column_name
       || '" from "'
       || table_name
       || '" where upper("'
       || column_name
       || '") like upper(''%'
       || :val
       || '%'')' ).extract ('ROWSET/ROW/*') ) ) t
ORDER  BY "Table"
/ 

4

tablo ve sütun adlarını biliyorsak, ancak dizelerin her şema için kaç kez göründüğünü öğrenmek istiyorsak:

Declare

owner VARCHAR2(1000);
tbl VARCHAR2(1000);
cnt number;
ct number;
str_sql varchar2(1000);
reason varchar2(1000);
x varchar2(1000):='%string_to_be_searched%';

cursor csr is select owner,table_name 
from all_tables where table_name ='table_name';

type rec1 is record (
ct VARCHAR2(1000));

type rec is record (
owner VARCHAR2(1000):='',
table_name VARCHAR2(1000):='');

rec2 rec;
rec3 rec1;
begin

for rec2 in csr loop

--str_sql:= 'select count(*) from '||rec.owner||'.'||rec.table_name||' where CTV_REMARKS like '||chr(39)||x||chr(39);
--dbms_output.put_line(str_sql);
--execute immediate str_sql

execute immediate 'select count(*) from '||rec2.owner||'.'||rec2.table_name||' where column_name like '||chr(39)||x||chr(39)
into rec3;
if rec3.ct <> 0 then
dbms_output.put_line(rec2.owner||','||rec3.ct);
else null;
end if;
end loop;
end;

2

Tüm Veritabanını Arama Prosedürü:

    CREATE or REPLACE PROCEDURE SEARCH_DB(SEARCH_STR IN VARCHAR2, TAB_COL_RECS OUT VARCHAR2) IS
      match_count integer;
      qry_str varchar2(1000);
      CURSOR TAB_COL_CURSOR IS 
          SELECT TABLE_NAME,COLUMN_NAME,OWNER,DATA_TYPE FROM ALL_TAB_COLUMNS WHERE DATA_TYPE in ('NUMBER','VARCHAR2') AND OWNER='SCOTT';
          BEGIN  
            FOR TAB_COL_REC  IN TAB_COL_CURSOR
            LOOP
              qry_str := 'SELECT COUNT(*) FROM '||TAB_COL_REC.OWNER||'.'||TAB_COL_REC.TABLE_NAME|| 
              ' WHERE '||TAB_COL_REC.COLUMN_NAME;
               IF TAB_COL_REC.DATA_TYPE = 'NUMBER' THEN
                      qry_str := qry_str||'='||SEARCH_STR; 
               ELSE
                       qry_str := qry_str||' like '||SEARCH_STR; 
               END IF;
                       --dbms_output.put_line( qry_str );
                EXECUTE IMMEDIATE  qry_str  INTO match_count;
                IF match_count > 0 THEN          
                   dbms_output.put_line( qry_str );
                  --dbms_output.put_line( TAB_COL_REC.TABLE_NAME ||' '||TAB_COL_REC.COLUMN_NAME ||' '||match_count);     
                    TAB_COL_RECS := TAB_COL_RECS||'@@'||TAB_COL_REC.TABLE_NAME||'##'||TAB_COL_REC.COLUMN_NAME;
                END IF; 
          END LOOP;
     END SEARCH_DB;    

Yürütme İfadesi

  DECLARE
    SEARCH_STR VARCHAR2(200);
    TAB_COL_RECS VARCHAR2(200);
    BEGIN
      SEARCH_STR := 10;
      SEARCH_DB(
        SEARCH_STR => SEARCH_STR,
        TAB_COL_RECS => TAB_COL_RECS
      );
     DBMS_OUTPUT.PUT_LINE('TAB_COL_RECS = ' || TAB_COL_RECS);
     END;

Örnek Sonuçlar

Connecting to the database test.
SELECT COUNT(*) FROM SCOTT.EMP WHERE DEPTNO=10
SELECT COUNT(*) FROM SCOTT.DEPT WHERE DEPTNO=10
TAB_COL_RECS = @@EMP##DEPTNO@@DEPT##DEPTNO
Process exited.
Disconnecting from the database test.

1

SQL isteminde basit bir çözümüm yok. Ancak, bir kullanıcının aranacak dizeyi girebileceği ve bunun bulunduğu tabloyu / prosedürü / nesneyi döndüreceği bir GUI'ye sahip kurbağa ve PL / SQL Geliştirici gibi epeyce araç vardır.



1

Tam eşleşmeleri bulmak yerine LIKE sorgusu kullanarak büyük / küçük harfe duyarlı olarak arama yapmak için kodu değiştirme ...

DECLARE
  match_count INTEGER;
  -- Type the owner of the tables you want to search.
  v_owner VARCHAR2(255) :='USER';
  -- Type the data type you're looking for (in CAPS). Examples include: VARCHAR2, NUMBER, etc.
  v_data_type VARCHAR2(255) :='VARCHAR2';
  -- Type the string you are looking for.
  v_search_string VARCHAR2(4000) :='Test';
BEGIN
  dbms_output.put_line( 'Starting the search...' );
  FOR t IN (SELECT table_name, column_name FROM all_tab_cols where owner=v_owner and data_type = v_data_type) LOOP
    EXECUTE IMMEDIATE 
    'SELECT COUNT(*) FROM '||t.table_name||' WHERE LOWER('||t.column_name||') LIKE :1'
    INTO match_count
    USING LOWER('%'||v_search_string||'%');
    IF match_count > 0 THEN
      dbms_output.put_line( t.table_name ||' '||t.column_name||' '||match_count );
    END IF;
  END LOOP;
END;

0

--it çalıştırma tamamlandı - hata yok

    SET SERVEROUTPUT ON SIZE 100000

DECLARE
   v_match_count     INTEGER;
   v_counter         INTEGER;




v_owner           VARCHAR2 (255) := 'VASOA';
v_search_string   VARCHAR2 (4000) := '99999';
v_data_type       VARCHAR2 (255) := 'CHAR';
v_sql             CLOB := '';

BEGIN
   FOR cur_tables
      IN (  SELECT owner, table_name
              FROM all_tables
             WHERE     owner = v_owner
                   AND table_name IN (SELECT table_name
                                        FROM all_tab_columns
                                       WHERE     owner = all_tables.owner
                                             AND data_type LIKE
                                                       '%'
                                                    || UPPER (v_data_type)
                                                    || '%')
          ORDER BY table_name)
   LOOP
      v_counter := 0;
      v_sql := '';

      FOR cur_columns
         IN (SELECT column_name, table_name
               FROM all_tab_columns
              WHERE     owner = v_owner
                    AND table_name = cur_tables.table_name
                    AND data_type LIKE '%' || UPPER (v_data_type) || '%')
      LOOP
         IF v_counter > 0
         THEN
            v_sql := v_sql || ' or ';
         END IF;

         IF cur_columns.column_name is not null
         THEN
            v_sql :=
                  v_sql
               || 'upper('
               || cur_columns.column_name
               || ') ='''
               || UPPER (v_search_string)||'''';

            v_counter := v_counter + 1;
         END IF;

      END LOOP;

      IF v_sql is  null
      THEN
         v_sql :=
               'select count(*) from '
            || v_owner
            || '.'
            || cur_tables.table_name;

      END IF;

      IF v_sql is not null
      THEN
         v_sql :=
               'select count(*) from '
            || v_owner
            || '.'
            || cur_tables.table_name
            || ' where '
            || v_sql;
      END IF;

      --v_sql := 'select count(*) from ' ||v_owner||'.'|| cur_tables.table_name ||' where '||  v_sql;


      --dbms_output.put_line(v_sql);
      --DBMS_OUTPUT.put_line (v_sql);

      EXECUTE IMMEDIATE v_sql INTO v_match_count;

      IF v_match_count > 0
      THEN
        DBMS_OUTPUT.put_line (v_sql);
        dbms_output.put_line('Match in ' || cur_tables.owner || ': ' || cur_tables.table_name || ' - ' || v_match_count || ' records');
      END IF;

   END LOOP;
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line (
            'Error when executing the following: '
         || DBMS_LOB.SUBSTR (v_sql, 32600));
END;
/

0

Bu Blog gönderisinden ödünç almak, biraz geliştirmek ve basitleştirmek , aşağıdaki basit SQL ifadesi işi oldukça iyi yapıyor gibi görünüyor:

SELECT DISTINCT (:val) "Search Value", TABLE_NAME "Table", COLUMN_NAME "Column"
FROM cols,
     TABLE (XMLSEQUENCE (DBMS_XMLGEN.GETXMLTYPE(
       'SELECT "' || COLUMN_NAME || '" FROM "' || TABLE_NAME || '" WHERE UPPER("'
       || COLUMN_NAME || '") LIKE UPPER(''%' || :val || '%'')' ).EXTRACT ('ROWSET/ROW/*')))
ORDER BY "Table";

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.