我目前正在开发一个用于执行动态创建的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。 非常感谢您的预期帮助
答案 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)