В настоящее время я разрабатываю функцию, предназначенную для выполнения динамически создаваемых операторов 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
и пропускает первый в списке идентификатор пользователя.
большое спасибо за ожидаемую помощь