Записки жертвы высоких технологий

    Здравствуйте! Мой блог посвящен в большей своей части моей профессиональной деятельности на поприще использования технологий ORACLE для разработки баз данных OLTP и OLAP хранилищ данных. В заметках я периодически размещаю разнообразные SQL, PL/SQL и Java скрипты написанные мной и не только мной, ссылки на интересные источники в сети либо другую полезную информацию, которая каким либо образом касается моей работы с замечательными продуктами компании ORACLE.
    Вы можете связаться со мной по контактному емейлу, если у вас есть какие-либо вопросы, связанные с разработкой баз данных на основе продуктов ORACLE, буду рад помочь вам, если это будет в моих силах.

9 окт. 2013 г.

Сравнение строк по сигнатурам

Мне понадобилось сравнивать две строки по сигнатурам (вхождениям символов в строку), то есть строки <A><B><C> и <B><A><C> в моем случае должны быть равны. Я, например, использую это сравнение при анализе имеющихся у таблицы индексов, чтобы в коде понять, проиндексирован ли интересующий меня список столбцов, если на входе у меня есть только строки с перечислением имен этих столбцов, чтобы отбросить дублированные списки.

declare
    l_1 varchar2(1024) := '<a><b><c>';
    l_2 varchar2(1024) := '<b><c><a>';
    l_equal varchar2(32);
begin
   
    select
        decode(count(*),0,'EQUAL''NOT EQUAL') is_equal
    into
        l_equal
    from
        (select regexp_substr(l_1, '\<[^>]*\>',1,level,'i'chunk from dual t1 connect by regexp_substr(l_1, '\<[^>]*\>',1,level,'i'is not null) t1
        full outer join (select regexp_substr(l_2, '\<[^>]*\>',1,level,'i'chunk from dual t2 connect by regexp_substr(l_2, '\<[^>]*\>',1,level,'i'is not null) t2on t1.chunk = t2.chunk
    where t1.chunk is null or t2.chunk is null;
    dbms_output.put_line(l_equal);

end;

4 окт. 2013 г.

Случайно на GitHub'е наткнулся на неискомую, но давно желанную вещь - набор интерфейсных функций для использования Java-библиотек регулярных выражений непосредственно на уровне PL/SQL для того, чтобы обойти ограничения, налагаемые POSIX стандартом на реализацию регулярных выражений в ORACLE


С помощью этой библиотеки, например, становится возможным выполнять замены с опережающими и ретроспективными проверками:

select xt_regexp.replace_all('Please, make me happy!','(?<=Please)(,)','$1 Scott!!!!') from dual;
Result: Please, Scott!!!! make me happy!**