Oracle PL SQL过程需要修改以接受具有所有类型字符和拆分的数组
我有一个程序PUSH_DATA,它以以下格式获取输入数据:Oracle PL SQL过程需要修改以接受具有所有类型字符和拆分的数组,sql,regex,oracle,plsql,oracle11g,Sql,Regex,Oracle,Plsql,Oracle11g,我有一个程序PUSH_DATA,它以以下格式获取输入数据: ["value 1","value 2","value 3","value n"] 所有详细信息都可以在末尾的db fiddle链接中找到 然后,它将逗号分隔的值拆分为目标表的数据库列 现在的问题是,输入字符串是由最终用户传递的,他有时会在输入字符串之间引入多个双引号,主要的拆分标准是基于双引号的 这个过程在这里以fiddle的形式出现,最后传递了一个st
["value 1","value 2","value 3","value n"]
所有详细信息都可以在末尾的db fiddle链接中找到
然后,它将逗号分隔的值拆分为目标表的数据库列
现在的问题是,输入字符串是由最终用户传递的,他有时会在输入字符串之间引入多个双引号,主要的拆分标准是基于双引号的
这个过程在这里以fiddle的形式出现,最后传递了一个string示例来演示这个问题
因此,当程序被传递为:
BEGIN
PUSH_DATA(110,'["Project title afor BYU heads","The values are,\n "exactly" up to the requirement and analysis done by the team.
Also it is difficult to,\n prepare a scenario notwithstanding the fact it is difficult. This user story is going to be slightly complex however it is up to the team","Active","Disabled","25 tonnes of fuel","www.examplesites.com/html.asp&net;","Apprehension","","","","25","Stable"]');
END;
/
结果如预期:
当字符串以额外引号传递时,如下所示:
BEGIN
PUSH_DATA(110,'[""Project title afor BYU heads"","The values are,\n "exactly" up to the requirement and analysis done by the team.
Also it is difficult to,\n prepare a scenario notwithstanding the fact it is difficult. This user story is going to be slightly complex however it is up to the team","Active","Disabled","25 tonnes of fuel","www.examplesites.com/html.asp&net;","Apprehension","","","","25","Stable"]');
END;
/
由于额外的引号,结果意外:
要求是忽略引号内的任何特殊字符,忽略应显示且不计算的字符,如应忽略的额外双引号或a/或a\以及按原样传递的字符串
所以如果传递一个值,比如,Hi Theres,No
输出应为Hi theres,否
因此,我需要对解决方案进行修改,以便
使用现有的正则表达式条件和添加条件在双引号中包含双引号
或者,不要将参数作为varchar传递,而可以使用array或任何其他适合该场景的解决方案。
摆弄所有细节:
(select data_string from dual),
rcte (id, data, lvl, result)
AS (
SELECT p_id, data, 1,regexp_substr(data,
'(".*?")(,|\])', 1, 1, 'n', 1) result
FROM (select data_string data from input)
UNION ALL
SELECT id, data, lvl + 1,
regexp_substr(data, '(".*?")(,|\])', 1, lvl + 1, 'n', 1)
FROM rcte
WHERE lvl <= regexp_count(data, '(".*?")(,|\])',1,'n')
)
从first select查询中删除了regex_replace,而不是直接使用数据
当我们在正则表达式中使用点时,为了匹配新行字符,将regexp_substrdata,'.*?,'\]',1,1,'n',1 null替换为'n'。此正则表达式执行延迟匹配,直到找到或]字符。]是最后一个字符串
regexp_countdata,'.?,'.\]',1,'n'更改了regex,并将null替换为'n'以进行换行符匹配
这对你有用吗?当然,让我试试,我会让你知道的!总的来说,它工作得很好,但在实际数据中,它取代了双引号,即abcas/abc/。这可以被反驳吗?你正在用空字符串替换所有的。可能是因为这个原因吗?你能给我造成这个问题的dbfiddle链接或示例输入吗?还有一个问题:“*?,|]]”这里做什么?它是否也被提及被忽略,或者它是否替换了额外的引号?很抱歉,这是为了理解正在做什么,我还添加了regex以删除方括号[]。你是如何处理这些问题的?对正则表达式不是很好,所以我这么问。