Oracle
 sql >> база данни >  >> RDS >> Oracle

Търсене във всички полета във всички таблици за конкретна стойност (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%';

Но ако низът „DTN“ е само предположение от ваша страна, това вероятно няма да помогне.

Между другото, колко сте сигурни, че „1/22/2008P09RR8“ е стойност, избрана директно от една колона? Ако изобщо не знаете откъде идва, може да е конкатенация на няколко колони, или резултат от някаква функция, или стойност, намираща се във вложен обект на таблица. Така че може да сте в преследване на дива гъска, опитвайки се да проверите всяка колона за тази стойност. Не можете ли да започнете с каквото и клиентско приложение, което показва тази стойност, и да опитате да разберете каква заявка използва, за да я получи?

Както и да е, отговорът на diciu дава един метод за генериране на SQL заявки за проверка на всяка колона на всяка таблица за стойността. Можете също да правите подобни неща изцяло в една SQL сесия, като използвате PL/SQL блок и динамичен 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 Trigger ORA-04098:тригерът е невалиден и неуспешно повторно валидиране

  2. Застой в Oracle

  3. Оптимизиране на SELECT заявка, която работи бавно на Oracle, която се изпълнява бързо на SQL Server

  4. Свързване на Oracle към SQL Server от Windows

  5. Как да се свържете с Oracle с помощта на JRuby &JDBC