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
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
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
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.
answered Oct 24, 2013 at 8:08
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
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
Однажды передо мной встала задача определить, в какую таблицу БД попадают определённые данные с веб-формы. Вызвано это, например, может быть тем, что у нас есть доступ к БД, но нет исходников приложения. А таблицы кто-то называл в стиле 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 |