在Oracle 10G中搜索和替换字符串中的括号

时间:2010-03-18 14:30:04

标签: oracle oracle10g replace

我目前正在开发一个用于执行动态创建的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

非常感谢Rene,您的查询有效,但我还有一个问题,现在是

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是varchar2 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

并跳过列表中的第一个用户ID。 非常感谢您的预期帮助

2 个答案:

答案 0 :(得分:0)

如果我正确理解你的要求,

这样的事情应该做:

-- 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##', ',');

答案 1 :(得分:0)

您是否考虑过使用DBMS_SQL,它应该解析SQL并允许您绑定变量。

请参阅以下链接以进一步阅读

Oracle Docs

Ask Tom Example