Поиск и замена скобок в строке в Oracle 10G - PullRequest
1 голос
/ 18 марта 2010

В настоящее время я разрабатываю функцию, предназначенную для выполнения динамически создаваемых операторов SQL. Это делается путем объединения столбцов и извлечения их с помощью курсоров. Проблема состоит в том, что когда есть функция с запятой между ее аргументами, concat объединяет содержимое функций включительно.

Можно ли пропустить содержимое каждой скобки, найденной в строке, используя REGEXP_SUBTR или REGEXP_REPLACE?

Большое спасибо заранее за ваши быстрые и добрые предложения.

-- strips out the select list 
src_str := REGEXP_SUBSTR(v_sql, 'SELECT ([[:graph:]]+\ ?){1,1000000}/?');    

-- Replace the commas in the select list with the concat symbol for concatenation 
rep_str := REGEXP_REPLACE(src_str, ', ', p_dot);    

-- Replace the select list with the replace string 
v_query := REPLACE(v_sql, src_str, rep_str); 

v_sql := select a, b, to_char(sysdate, 'dd/mm/yyyy') from demo; 

p_dot := '||'',''||';

в настоящее время возвращает:

select a || ',' || b || ',' || to_char(sysdate || ',' || 'dd/mm/yyyy') from demo

но должно возвращать что-то вроде:

select a || ',' || b || ',' || to_char(sysdate, 'dd/mm/yyyy') from demo

Большое спасибо, Рене, ваш запрос сработал, но у меня есть еще один вопрос, и вот он

for i in 1 .. p_arglist.count
loop

    -- Search for : in the query
    src_sym := REGEXP_SUBSTR(v_query, ':[[:graph:]]+\ ?', i,i);

    -- Replace the : with each value of p_arglist passed
    v_querymult := REGEXP_REPLACE(v_query, src_sym , p_arglist(i),i,i);

 end loop;
 return v_query;

где p_arglist - это vrayar2 varray p_arglist: = ('demo@demo.com', '2001')

v_query := 'SELECT A, B, C FROM DEMO WHERE USERID = :USERID AND YEAR = :YEAR';

В настоящее время возвращается

v_query := SELECT A, B, C FROM DEMO WHERE USERID = :USERID AND YEAR = 2001

и пропускает первый в списке идентификатор пользователя. большое спасибо за ожидаемую помощь

Ответы [ 2 ]

0 голосов
/ 19 марта 2010

Задумывались ли вы об использовании DBMS_SQL, который должен анализировать SQL и позволять связывать переменные.

Смотрите эти ссылки для дальнейшего чтения

Документы Oracle

Ask Tom Пример

0 голосов
/ 18 марта 2010

что-то вроде этого следует делать, если я правильно понял ваше требование:

-- multiple replacements to accomodate for functions with more
-- than two parameters (and accordingly more than one comma)
src_str := regexp_replace(src_str, '(\([^)]+),', '\1##comma-in-function##');
src_str := regexp_replace(src_str, '(\([^)]+),', '\1##comma-in-function##');
src_str := regexp_replace(src_str, '(\([^)]+),', '\1##comma-in-function##');

-- replace the left-over commas
src_str := replace(src_str, ', ', p_dot);

-- turn commas within function call back to commas:
src_str := replace(src_str, '##comma-in-function##', ',');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...