2012-02-03 3 views
1

Мне нужно написать запрос, в котором регулярное выражение, основанное на java (на мой взгляд, стандарт POSIX), предназначено для отправки в хранимую процедуру. Которая будет использовать эту строку регулярных выражений для запроса базы данных для извлечения только тех записей, которые соответствуют регулярному выражению.Использование регулярного выражения на основе Java для запроса Oracle

Я читал о Regular Expressions и я увидел, что оракул регулярного выражения не являются таким же, как Java, т.е.

С версией 10g, Oracle Database предлагает функцию 4 регулярных выражений, которые вы можно использовать в SQL и PL/SQL заявления. Эти функции реализуют стандарт расширенных регулярных выражений (ERE) стандарта O. Oracle полностью поддерживает последовательности сортировки и классы эквивалентности в скобках выражения. Параметр NLS_SORT определяет используемый языковой стандарт POSIX, , который определяет доступные последовательности сортировки и эквивалентность классов .

Однако Oracle не реализует стандарт POSIX ERE. Он отклоняется в трех областях. Во-первых, Oracle поддерживает обратные ссылки \ 1 через \ 9 в регулярном выражении. Стандарт POSIX ERE не поддерживает , хотя POSIX BRE делает это. В полностью совместимом двигателе с \ от 1 до 9 будет незаконным. В стандарте POSIX указано, что является незаконным, чтобы избежать символа, который не является метасимволом с обратным слэшем . Oracle позволяет это и просто игнорирует обратную косую черту. Например. \ z идентичен z в Oracle. В результате все регулярные выражения POSIX ERE могут использоваться с Oracle, но некоторые регулярные выражения , которые работают в Oracle, могут привести к ошибке в полностью POSIX-совместимом движке. Очевидно, что если вы работаете только с Oracle, то эти отличия не имеют значения.

Третье отличие более тонкое. Это не вызовет никаких ошибок, но может привести к разным совпадениям. Как я объяснил в теме о стандарте POSIX, он требует, чтобы механизм регулярных выражений возвращал самый длинный матч в случае чередования. Двигатель Oracle не делает этого. Это традиционный движок NFA, как и все альтернативы, не относящиеся к POSIX, обсуждались на этом веб-сайте.

Если вы работали с регулярными выражениями в других языках программирования , имейте в виду, что POSIX не поддерживает непечатаемых характер ускользает как \ т для вкладок или \ п для новой строки. Вы можете использовать с движком POSIX на языке программирования, таком как C++, потому что компилятор C++ будет интерпретировать \ t и \ n в строковых константах. В операциях SQL вам нужно ввести фактическую вкладку или разрыв строки в строке с регулярным выражением, чтобы оно соответствовало табуляции или строке . Oracle regex engine интерпретирует строку '\ t' как значение regex t при передаче в качестве параметра regexp.

Просто интересно, есть ли какая-то помощь, которую я могу использовать для решения этой проблемы? Или мне нужно перенести Java-регулярное выражение в регулярное выражение PLSQL?

Регулярное выражение, которое мы собираемся использовать, будет широко использоваться в Java. Есть несколько случаев, когда одно и то же регулярное выражение применяется к хранимым процедурам оракула.Один из образцов регулярных выражений является .*__.*__^ABC

Я считаю, что было бы намного больше полезно, если я могу знать, что несовместимость в этих 2-х версиях :)

+0

Как объясняет ваша цитата, это зависит от регулярного выражения - некоторые регулярные выражения будут работать в обеих реализациях. Можете ли вы показать нам свое регулярное выражение? Что до сих пор пытались сделать? – DNA

+0

'необходимо отправить в хранимую процедуру' Зачем вам это нужно? Тривиально написать [совместимое с оракулом регулярное выражение] (http://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm). – beerbajay

+1

Если регулярное выражение выполняется с помощью хранимой процедуры PL/SQL, то это должно быть регулярное выражение Oracle, не так ли? С точки зрения Java регулярное выражение представляет собой просто строку, передаваемую Oracle. Не должно быть никаких оснований для преобразования любого регулярного выражения. – user272735

ответ

1

Во-первых, собрать всех используемых/ожидаемых регулярных выражений и бега несколько запросов в образце/тестовой таблице, чтобы увидеть, есть ли какие-либо регулярные выражения, которые работают на Java, но не в Oracle. Возможно, проблем вообще не будет, поскольку в документации Oracle говорится, что он поддерживает стандарты POSIX и Unicode для регулярных выражений, и это улучшает их.

Если вы обнаружили регулярные выражения, которые не работают в Oracle, вы можете рассмотреть возможность создания хранимой процедуры Java с помощью обертки PL/SQL и использовать ее в своих запросах. Тогда определенно проблем не будет.

+0

Регулярное выражение неизвестно atm .. это может быть что угодно. –

+0

В этом случае я бы начал с предположения, что проблем не возникнет и не будет разработан простой запрос, который использует регулярные выражения по мере их получения. Я думаю, у вас будет фаза QA в PDLC; вы обнаружите, что если будет какое-то сложное регулярное выражение, которое Oracle интерпретирует по-разному. Тем временем я буду играть с регулярными выражениями, чтобы увидеть, могу ли я найти различия. Кроме того, я хотел бы сказать менеджеру проекта или заинтересованным сторонам бизнеса о том, чтобы получить/подготовить документ о случаях использования, поскольку разработчик не может работать должным образом без надлежащих спецификаций требований ... –

Смежные вопросы