Oracle PL / SQL - 使用空字符串的通配符替换

时间:2018-02-08 10:53:41

标签: oracle plsql dynamic-sql

给你一点抬头。我是PL / SQL世界的新手。 以下大部分内容仅仅是为了给您一些背景信息。 此外,我必须使用一个函数来动态生成文本。将文本写入数据库不是一种选择。

无论如何,我正在研究一组将生成字符串的函数。

function f_nlg_concat(p_id in number) return varchar2 as
  l_id     number;
  l_text_schaden  varchar2(4000);
begin
  l_id    := p_id;
  l_text := f_nlg(l_id);
  l_text := f_nlg_replace(l_text, l_id);
end;

上述函数是连接所有字符串的函数。对于此示例,我将只使用一个文本(l_text)。 l_text将由函数提供:

f_nlg(p_id)

现在它变得有趣的是第二个功能:

f_nlg_replace(p_text,p_id)

此函数基本上通过动态sql查询以查找通配符的正确替换。有很多通配符。 文字可能如下:

'I am a text with this <wildcard>.'

视图提供了正确的通配符替换。我可以通过使用这个动态sql遍历视图的所有列来识别正确的替换:

for cur in (SELECT atc.column_name
              FROM all_tab_cols atc
             WHERE lower(table_name) like 'v_nlg_wildcards'
               AND owner = 'ME') loop
  /*check if exist*/
  l_query1 := 'select count(' || cur.column_name ||
              ') from ME.v_nlg_wildcards nw where nw.id =' ||
              l_id;

  execute immediate l_query1
    into l_wildcard;

  if l_wildcard = 1 then
    l_query2 := 'select ' || cur.column_name ||
                ' from ME.v_nlg_wildcard nw where nw.id =' ||
                l_id;

    execute immediate l_query2
      into l_baustein;
    /*THIS IS WHERE I GOT A QUESTION*/
    l_text := replace(l_text,
                      '<' || lower(cur.column_name) || '>',
                      l_wildcard);
  else
    continue;
  end if;
end loop;

只要有通配符可以找到,它就完美无缺。我的情况是有一个NULL替换不会明显工作。

但是你有过任何熟悉的案例,你必须用空字符串替换通配符吗? 关于如何进行替换的任何想法? 这样文本中就不会留下任何通配符了。

整个文本看起来仍然看起来没有留下通配符。这些句子部分写成了一个空的替代品也适合。

提前感谢你们。

干杯, 斯文

0 个答案:

没有答案