ПОИСК ПО СТРОКЕ ДЛЯ КОНКРЕТНОГО ЗНАЧЕНИЯ В ORACLE

Я хочу искать в строке таблицы с 32 столбцами, в каждом из которых для определенного значения и внешнего вида счета, можно ли запросить всю строку, не вводя имя каждого столбца в оракуле???

2 ответа

Решение

Да, это возможно, но решение не быстрое и требует базовых знаний о xquery.

подготовить тестовый стол

create table test_objects as select * from user_objects where rownum < 100;

select * from 
     xmltable('for $row in ora:view("test_objects")/ROW return count($row/*[contains(text(),$TO_SEARCH)])' passing 'N' as "TO_SEARCH" columns cnt number path '.');

Запрос подсчитывает столбцы, содержащие значение "N".

если вы немного измените запрос, мы увидим, какие столбцы содержат искомое значение

select * from 
     xmltable('for $row in ora:view("test_objects")/ROW return <ROW><CNT>{count($row/*[contains(text(),$TO_SEARCH)])}</CNT><COLUMNS>{string-join($row/*[contains(text(),$TO_SEARCH)]/name(),", " )}</COLUMNS></ROW>' passing 'N' as "TO_SEARCH"
     columns 
     cnt number path 'CNT'
     , list_of_column varchar2(4000) path 'COLUMNS'
     );
  1. Протестировано на таблице EMP, должно быть доступно при установке Oracle DB (я думаю).
  2. Создает текст SQL для поиска по всем полям.
  3. Предполагается, что у вас есть доступ к DBA_TAB_COLUMNSесли не попробовать USER_TAB_COLUMNS, если у вас есть стол
  4. %KING% является поисковым термином.
  5. Строка SQL имеет ограничение в 4000 символов.
  6. ВЛАДЕЛЕЦ этих таблиц может быть разным, поскольку у вас может быть таблица в другой схеме

Ниже можно запустить на SQL Plus или клиенте SQL по вашему выбору:)

VARIABLE cur REFCURSOR;

DECLARE
    v_chr VARCHAR2(4000);
    v_chr_tablename VARCHAR2(30) := 'EMP';
    v_chr_searchterm VARCHAR2(100) := 'KING';
BEGIN

    SELECT 'SELECT * FROM ' ||  v_chr_tablename || ' where '
        || RTRIM ( XMLAGG (XMLELEMENT (E, 'TO_CHAR('
        ||column_name
        || ')', ' || ').EXTRACT ( '//text()')
    ORDER BY column_name).getStringVal (), ' || ')
        ||' like ''%' || v_chr_searchterm || '%'''
    INTO v_chr
    FROM DBA_TAB_COLUMNS
    WHERE table_name = v_chr_tablename
    AND owner        = 'APPS';

    OPEN :cur FOR v_chr;

END;
/
print cur;
Другие вопросы по тегам