给你一点抬头。我是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替换不会明显工作。
但是你有过任何熟悉的案例,你必须用空字符串替换通配符吗? 关于如何进行替换的任何想法? 这样文本中就不会留下任何通配符了。
整个文本看起来仍然看起来没有留下通配符。这些句子部分写成了一个空的替代品也适合。
提前感谢你们。
干杯, 斯文