Как найти значение в oracle

Quote:

I’ve tried using this statement below
to find an appropriate column based on
what I think it should be named but it
returned no results.*

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

A column isn’t an object. If you mean that you expect the column name to be like ‘%DTN%’, the query you want is:

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

But if the ‘DTN’ string is just a guess on your part, that probably won’t help.

By the way, how certain are you that ‘1/22/2008P09RR8’ is a value selected directly from a single column? If you don’t know at all where it is coming from, it could be a concatenation of several columns, or the result of some function, or a value sitting in a nested table object. So you might be on a wild goose chase trying to check every column for that value. Can you not start with whatever client application is displaying this value and try to figure out what query it is using to obtain it?

Anyway, diciu’s answer gives one method of generating SQL queries to check every column of every table for the value. You can also do similar stuff entirely in one SQL session using a PL/SQL block and dynamic SQL. Here’s some hastily-written code for that:

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

There are some ways you could make it more efficient too.

In this case, given the value you are looking for, you can clearly eliminate any column that is of NUMBER or DATE type, which would reduce the number of queries. Maybe even restrict it to columns where type is like ‘%CHAR%’.

Instead of one query per column, you could build one query per table like this:

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

I need to write some sql that will allow me to query all objects in our Oracle database. Unfortunately the tools we are allowed to use don’t have this built in.
Basically, I need to search all tables, procedures, triggers, views, everything.

I know how to search for object names. But I need to search for the contents of the object.
i.e. SELECT * FROM DBA_OBJECTS WHERE object_name = ‘%search string%’;

Thanks,
Glenn

asked May 12, 2009 at 16:01

Glenn Wark's user avatar

1

I’m not sure I quite understand the question but if you want to search objects on the database for a particular search string try:

SELECT owner, name, type, line, text 
FROM dba_source
WHERE instr(UPPER(text), UPPER(:srch_str)) > 0;

From there if you need any more info you can just look up the object / line number.

For views you can use:

SELECT *
FROM dba_views
WHERE instr(UPPER(text_vc), UPPER(:srch_str)) > 0

answered May 12, 2009 at 16:18

Chris Cameron-Mills's user avatar

2

i’m not sure if i understand you, but to query the source code of your triggers, procedures, package and functions you can try with the «user_source» table.

select * from user_source

answered May 12, 2009 at 16:17

Drevak's user avatar

DrevakDrevak

8673 gold badges12 silver badges26 bronze badges

0

I would use DBA_SOURCE (if you have access to it) because if the object you require is not owned by the schema under which you are logged in you will not see it.

If you need to know the functions and Procs inside the packages try something like this:

select * from all_source
 where type = 'PACKAGE'
   and (upper(text) like '%FUNCTION%' or upper(text) like '%PROCEDURE%')
   and owner != 'SYS';

The last line prevents all the sys stuff (DBMS_ et al) from being returned. This will work in user_source if you just want your own schema stuff.

Paulo Freitas's user avatar

answered Oct 24, 2013 at 8:08

Steve Ronaldson Ewing's user avatar

0

ALL_SOURCE describes the text source of the stored objects accessible to the current user.

Here is one of the solution

select * from ALL_SOURCE where text like '%some string%';

answered Mar 9, 2015 at 14:56

Sireesh Yarlagadda's user avatar

In Oracle 11g, if you want to search any text in whole database or procedure below mentioned query can be used:

select * from user_source WHERE UPPER(text) LIKE ‘%YOUR SAGE%’

answered Oct 9, 2020 at 6:45

Yoshita Mahajan's user avatar

Однажды передо мной встала задача определить, в какую таблицу БД попадают определённые данные с веб-формы. Вызвано это, например, может быть тем, что у нас есть доступ к БД, но нет исходников приложения. А таблицы кто-то называл в стиле TABLE_1, TABLE_2, OT_1 и так далее.
К счастью, БД была Oracle, поэтому можно использовать тёмные стороны PL/SQL.

Думаю, смысл действа понятен, поэтому сразу к коду:

create or replace procedure whereIsValue(valueParam varchar2)
AS
  TYPE VALCUR IS REF CURSOR;
  cursor tabl is select table_name from user_tables;
  cursor col (tablename varchar2) is select column_name from user_tab_columns where table_name like tableName;
  valueCursor VALCUR;
  tableName varchar2(50);
  columnName varchar2(50);
  columnValue varchar2(500);
  qq number(3);
begin
  open tabl;
  LOOP
    fetch tabl into tableName;
    EXIT WHEN tabl%NOTFOUND;
    OPEN col(tableName);
    LOOP     
      fetch col into columnName;
      EXIT WHEN col%NOTFOUND;
        OPEN valueCursor for 'select ' || columnName || ' from ' || tableName;
        LOOP
          BEGIN
            fetch valueCursor into columnValue;        
            EXIT WHEN valueCursor%NOTFOUND;
            if (columnValue like valueParam) then
              dbms_output.put_line(tableName);
              exit;
            end if;
          EXCEPTION
            WHEN OTHERS then
              qq := 4;
          END;
        END LOOP;
        CLOSE valueCursor;
    END LOOP;
    CLOSE col;
  END LOOP;

end;

Вкратце о том, что же происходит:

  • проходим по всем таблицам схемы;
  • для каждой таблицы проходим по всем её колонкам;
  • для каждой колонки забираем список значений и сравниваем с тем, что передано в параметре процедуры;
  • если совпало, то печатаем имя таблицы в DBMS_OUTPUT;

Буду рад комментариям, как можно было сделать иначе, не изобретая велосипедов.

Главная
> oracle, SQL > Поиск значения по всем таблицам

Поиск значения по всем таблицам

Поиск значения по всем таблицам

Вариант1:

DECLARE
  match_count   INTEGER;
  query_str     VARCHAR2(400);
  l_owner       VARCHAR2(10)  := 'SCOTT';
  l_search_text VARCHAR2(100) := '10';
BEGIN
  FOR t IN (select table_name, column_name FROM all_tab_columns a
            where owner = l_owner
                  and a.data_type in ('NUMBER', 'VARCHAR2')
            )
  LOOP
    begin
      match_count := 0;
      query_str   := 'SELECT COUNT(*) FROM ' ||l_owner||'.'|| t.table_name ||
                     ' WHERE to_char(' || t.column_name || ') = :1';
      EXECUTE IMMEDIATE query_str
        INTO match_count
        USING l_search_text;
      IF match_count > 0 THEN
        dbms_output.put_line(l_owner||'.'||t.table_name || ' ' || t.column_name || ' ' || match_count);
        dbms_output.put_line('  SELECT t.'|| t.column_name || ', t.* from '||l_owner||'.'|| t.table_name||' t where to_char(' || t.column_name || ') = '''||l_search_text||'''');
        dbms_output.put_line('');
      END IF;
    exception
     when others then
       dbms_output.put_line(t.table_name||'.'||t.column_name||' : '||SQLERRM||' : '||SQLCODE);
       dbms_output.put_line(query_str);
       dbms_output.put_line('');
       /*raise*/
    end;
  END LOOP;
END;

Вариант2:

--SET SERVEROUTPUT ON SIZE 1000000
DECLARE
  TYPE tab_columns_rec_type IS RECORD (
    table_name   all_tab_columns.table_name%type
   ,column_name  all_tab_columns.column_name%type
   ,data_type    all_tab_columns.data_type%type
  );
  type tab_columns_tab_type is table of tab_columns_rec_type index by binary_integer;
  l_tab_columns_rec tab_columns_tab_type;
 
  match_count   INTEGER;
  query_str     VARCHAR2(400);
  l_owner       VARCHAR2(10)  := 'SCOTT';
  l_search_text VARCHAR2(100) := '10'; -- % добавляем здесь, если ищем не по точному вхождению
  l_number      NUMBER;
  is_number     NUMBER(1);
  l_str_length  NUMBER;
  /*
  l_mode:
  1 - NUMBER и VARCHAR2
  2 - only NUMBER
  3 - only VARCHAR2
  */
  l_mode NUMBER := 1;
  -- При каком количестве найденные совпадений
  -- прекращать поиск
  l_found_count  NUMBER := 1; 
  l_exists_count NUMBER;
BEGIN
 
  l_str_length := length(l_search_text);
 
  begin
    l_number := to_number(l_search_text);
    is_number := 1;
  exception
    when VALUE_ERROR then
      is_number := 0;
  end;
 
  if (l_mode = 1 and is_number = 1) then
    select table_name, column_name, data_type
      bulk collect into l_tab_columns_rec
    FROM all_tab_columns a
    where owner = l_owner
          and a.data_length >= l_str_length
          and ( a.data_type = 'VARCHAR2' or a.data_type = 'NUMBER' );
  elsif (l_mode = 2 and is_number = 1) then
    select table_name, column_name, data_type
      bulk collect into l_tab_columns_rec
    FROM all_tab_columns a
    where owner = l_owner
          and a.data_length >= l_str_length
          and a.data_type = 'NUMBER';
  else
    select table_name, column_name, data_type
      bulk collect into l_tab_columns_rec
    FROM all_tab_columns a
    where owner = l_owner
          and a.data_length >= l_str_length
          and a.data_type = 'VARCHAR2';
  end if;
  l_exists_count := 0;
  if NOT (l_tab_columns_rec is null or l_tab_columns_rec.count = 0) then
    for j in l_tab_columns_rec.first..l_tab_columns_rec.last
    LOOP
        begin
          match_count := 0;
          if (l_tab_columns_rec(j).data_type = 'VARCHAR2') then
            query_str   := 'SELECT count(*) FROM ' ||l_owner||'.'|| l_tab_columns_rec(j).table_name ||
                           ' WHERE rownum = 1 and to_char(' || l_tab_columns_rec(j).column_name || ') = :1';
            EXECUTE IMMEDIATE query_str
              INTO match_count
              USING l_search_text;
          elsif (l_tab_columns_rec(j).data_type = 'NUMBER') then
            query_str   := 'SELECT count(*) FROM ' ||l_owner||'.'|| l_tab_columns_rec(j).table_name ||
                           ' WHERE rownum = 1 and ' || l_tab_columns_rec(j).column_name || ' = :1';
            EXECUTE IMMEDIATE query_str
              INTO match_count
              USING l_number;
          end if;
 
          IF match_count > 0 THEN
            l_exists_count := l_exists_count + 1;
            dbms_output.put_line(l_tab_columns_rec(j).data_type||' '||l_owner||'.'||l_tab_columns_rec(j).table_name || ' ' || l_tab_columns_rec(j).column_name );
            dbms_output.put_line('  SELECT t.'|| l_tab_columns_rec(j).column_name || ', t.* from '||l_owner||'.'|| l_tab_columns_rec(j).table_name||' t where to_char(' || l_tab_columns_rec(j).column_name || ') like '''||l_search_text||'''');
            dbms_output.put_line('');
            if (l_exists_count = l_found_count) then
              exit;
            end if;
          END IF;
        exception
         when others then
           dbms_output.put_line(l_tab_columns_rec(j).table_name||'.'||l_tab_columns_rec(j).column_name||' : '||SQLERRM||' : '||SQLCODE);
           dbms_output.put_line(query_str);
           dbms_output.put_line('');
           /*raise*/
        end;
      END LOOP;
  end if;
 
END;

В этом учебном пособии вы узнаете, как использовать Oracle оператор LIKE (для выполнения сравнения с шаблоном) с синтаксисом, примерами и практическими упражнениями.

Описание

Oracle условие LIKE позволяет использовать подстановочные символы, которые будут использоваться в операторе WHERE в запросах SELECT, INSERT, UPDATE или DELETE. Это позволяет выполнять сопоставление с pattern (шаблоном).

Синтаксис

Синтаксис LIKE в Oracle/PLSQL:

expression LIKE pattern [ ESCAPE ‘escape_character’ ]

Параметры или аргументы

expression

Символьное выражение, такие как поле или столбец.

pattern

Символьное выражение, которое содержит сопоставление с pattern. pattern, которые вы можете выбрать:

подстановочный
символ
пояснение
% Соответствует любой строке любой длины (в том числе нулевой длины)
_ Соответствует одному символу

escape_character
Необязательный. Позволяет проверять наличие литералов подстановочных символов, таких как % или _.

Примечание

Смотрите также Oracle REGEXP_LIKE.

Пример использования % (символ процент)

Первый пример Oracle оператора LIKE, который мы рассмотрим, предполагает использование подстановочного символа %.

Рассмотрим, как % работает в Oracle операторе LIKE. Мы хотим найти всех customers, чьи last_name начинается с ‘Ар’.

SELECT last_name

  FROM customers

WHERE last_name LIKE ‘Ap%’;

Кроме того, можно использовать несколько символов % в пределах одной строки.

Например:

SELECT last_name

  FROM customers

WHERE last_name LIKE ‘%er%’;

В этом примере Oracle оператора LIKE, мы ищем для всех customers, чьи last_name содержит символы ‘er’.

Пример использования _ (символ подчеркивание)

Далее, давайте рассмотрим, как подстановочный символ _ (символ подчеркивания) работает в Oracle операторе LIKE. Помните, что _ ищет только один символ.

Например:

SELECT supplier_name

  FROM suppliers

WHERE supplier_name LIKE ‘Sm_th’;

В этом примере Oracle LIKE вернет всех suppliers, чье supplier_name имеет длину 5 символов, где первые два символа является ‘Sm’, а последние два символа это ‘th’. Например, он может вернуть suppliers, чьи supplier_name являются ‘Smith’, ‘Smyth’, ‘Smath’ или ‘Smeth’ и т.д.

Вот еще один пример:

SELECT *

  FROM suppliers

WHERE account_number LIKE ‘92314_’;

Ища номер счета, вы можете обнаружить, что у вас есть только 5 из 6 цифр. В приведенном выше примере, будет возвращено потенциально 10 последних записей (где отсутствующее значение может быть от 0 до 9). Например, запрос может вернуть suppliers, чьи account_number являются:

923140, 923141, 923142, 923143, 923144, 923145, 923146, 923147, 923148, 923149

Пример использования оператора NOT

Далее, давайте рассмотрим то, как вы будете использовать Oracle оператор NOT с подстановочными символами.

Давайте использовать % с оператором NOT. Кроме того, можно использовать Oracle оператор LIKE для поиска suppliers (поставщиков), имена которых не начинаются на ‘W’.

Например:

SELECT supplier_name

  FROM suppliers

WHERE supplier_name NOT LIKE ‘W%’;

Размещая оператор NOT перед LIKE, вы можете получить всех suppliers, чьи supplier_name не начинаются на ‘W’.

Пример использования ESCAPE

Важно понять, каким образом действует escape_character при совпадении с шаблоном. Эти примеры относятся конкретно к пропуску символов в Oracle.

Допустим, вы хотите найти % или _ (символ процента или подчеркивания) в операторе LIKE. Вы можете сделать это с помощью ESCAPE символов.

Обратите внимание, что вы можете определить escape_character (экранирующий символ), как один символ (длина 1).

Например:

SELECT *

  FROM suppliers

WHERE supplier_name LIKE ‘Water!%’ ESCAPE ‘!’;

Этот пример LIKE идентифицирует символ ! как экранирующий символ. Этот запрос вернет всех suppliers, чье supplier_name имеют значение ‘Water%’.

SELECT *

  FROM suppliers

WHERE supplier_name LIKE ‘H%!%’ ESCAPE ‘!’;

Этот пример Oracle оператора LIKE возвращает всех suppliers, имена которых начинаются с H и заканчиваются на %. Например, это может вернуть значение, такое как ‘Hello%’.

Вы также можете использовать escape символ с символом _ в условии LIKE.

Например:

SELECT *

  FROM suppliers

WHERE supplier_name LIKE ‘H%!_’ ESCAPE ‘!’;

Этот пример LIKE возвращает всех suppliers, имена которых начинаются с ‘H’ и заканчиваются на ‘_’. Например, это может вернуть значение, такое как ‘Hello_’.

Часто задаваемые вопросы

Вопрос: Как объединить Oracle функцию UPPER с Oracle оператором LIKE? Я пытаюсь запросить все записи текстового поля, которое содержат слово «test». Проблема заключается в том, что поле может иметь следующие значения: TEST, Test или test.

Ответ: Для того чтобы ответить на этот вопрос, давайте рассмотрим пример.

Давайте предположим, что у нас есть таблица suppliers с полем под названием supplier_name, которое содержит значения TEST, Test или test.

Если мы хотим найти все записи, содержащие слово «test», независимо от того в каком виде они сохранены как TEST, Test или test, то мы могли бы выполнить одно из следующих предложений SELECT:

SELECT *

  FROM suppliers

WHERE UPPER(supplier_name) LIKE (‘TEST%’);

ИЛИ

SELECT *

FROM suppliers

WHERE UPPER(supplier_name) LIKE UPPER(‘test%’);

Это предложение SELECT, использует комбинацию функции Oracle UPPER и оператора LIKE, чтобы вернуть все записи, где поле supplier_name содержит слово «test», независимо от того, в каком значении оно было сохранено как TEST, Test или test.

Практическое упражнение № 1:

На основании таблицы employees содержащей следующие данные, найти все записи, у которых employee_name заканчивается буквой ‘h’.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

CREATE TABLE employees

( employee_number number(10) not null,

  employee_name varchar2(50) not null,

  salary number(6),

  CONSTRAINT employees_pk PRIMARY KEY (employee_number)

);

INSERT INTO employees (employee_number, employee_name, salary)

VALUES (1001, ‘John Smith’, 62000);

INSERT INTO employees (employee_number, employee_name, salary)

VALUES (1002, ‘Jane Anderson’, 57500);

INSERT INTO employees (employee_number, employee_name, salary)

VALUES (1003, ‘Brad Everest’, 71000);

INSERT INTO employees (employee_number, employee_name, salary)

VALUES (1004, ‘Jack Horvath’, 42000);

Решение для практического упражнения № 1:

Следующий оператор SELECT использует Oracle оператор LIKE, чтобы возвратить записи, у которых employee_name заканчивается буквой ‘h’.

SELECT *

FROM employees

WHERE employee_name LIKE ‘%h’;

Этот запрос вернет следующий результирующий набор:

EMPLOYEE_NUMBER EMPLOYEE_NAME SALARY
1001 John Smith 62000
1004 Jack Horvath 42000

Практическое упражнение № 2:

На основании таблицы employees содержащей следующие данные, найти все записи, в которых employee_name содержит букву ‘s’.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

CREATE TABLE employees

( employee_number number(10) not null,

  employee_name varchar2(50) not null,

  salary number(6),

  CONSTRAINT employees_pk PRIMARY KEY (employee_number)

);

INSERT INTO employees (employee_number, employee_name, salary)

VALUES (1001, ‘John Smith’, 62000);

INSERT INTO employees (employee_number, employee_name, salary)

VALUES (1002, ‘Jane Anderson’, 57500);

INSERT INTO employees (employee_number, employee_name, salary)

VALUES (1003, ‘Brad Everest’, 71000);

INSERT INTO employees (employee_number, employee_name, salary)

VALUES (1004, ‘Jack Horvath’, 42000);

Решение для практического упражнения № 2:

Следующий оператор SELECT использует Oracle оператор LIKE, чтобы возвратить записи, у которых поле employee_name содержит букву ‘s’.

SELECT *

FROM employees

WHERE employee_name LIKE ‘%s%’;

Это вернет следующий результирующий набор:

EMPLOYEE_NUMBER EMPLOYEE_NAME SALARY
1002 Jane Anderson 57500
1003 Brad Everest 71000

Практическое упражнение № 3:

На основании таблицы employees содержащей следующие данные, найти все записи, в которых supplier_id состоит из 4 цифр и начинается с ‘500’.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

CREATE TABLE suppliers

( supplier_id varchar2(10) not null,

  supplier_name varchar2(50) not null,

  city varchar2(50),

  CONSTRAINT suppliers_pk PRIMARY KEY (supplier_id)

);

INSERT INTO suppliers(supplier_id, supplier_name, city)

VALUES (‘5008’, ‘Microsoft’, ‘New York’);

INSERT INTO suppliers (supplier_id, supplier_name, city)

VALUES (‘5009’, ‘IBM’, ‘Chicago’);

INSERT INTO suppliers (supplier_id, supplier_name, city)

VALUES (‘5010’, ‘Red Hat’, ‘Detroit’);

INSERT INTO suppliers (supplier_id, supplier_name, city)

VALUES (‘5011’, ‘NVIDIA’, ‘New York’);

Решение для практического упражнения № 3:

Следующий оператор SELECT использует Oracle оператор LIKE, чтобы возвратить записи, у которых supplier_id состоит из 4 цифр и начинается с ‘500’.

SELECT *

FROM suppliers

WHERE supplier_id LIKE ‘500_’;

Это вернет следующий результирующий набор:

SUPPLIER_ID SUPPLIER_NAME CITY
5008 Microsoft New York
5009 IBM Chicago

Понравилась статья? Поделить с друзьями:
  • Как составить отчет опекуна пример
  • Найти книгу как познакомится с девушкой
  • Как найти приближенные числа математика
  • Ошибка set user settings to driver failed windows 10 как исправить
  • Как составить свой распорядок дня взрослому работающему чтобы все успеть