我无法弄清楚为什么REPLACE()
无法正常工作。
我收到一个格式为:
的字符串RISHON_LEZION-CMTSDV4,Cable7/0/4/U1;RISHON_LEZION-CMTSDV4,Cable7/0/4/U2;RISHON_LEZION-CMTSDV4,Cable7/0/5/U0;.....
最多4000个字符。
;
的每个点代表一个新字符串(一个字符串中最多可以有15个字符串)。我使用REPLACE()
拆分它 - 每次出现;
替换为$
+沿着一条线+再次连接整个字符串(我有另一部分正在拆分字符串)
我认为字符串的长度是影响结果的一些因素,尽管我从未听说过对字符串的长度有任何限制。
SELECT REPLACE(HOT_ALERTKEY_PK, ';', '$' || CHR(13) || CHR(10) || HOT_ALERTKEY_PK || '$')
from (SELECT 'RISHON_LEZION-CMTSDV4,Cable7/0/3/U0;RISHON_LEZION-CMTSDV4,Cable7/0/3/U1;RISHON_LEZION-CMTSDV4,Cable7/0/3/U2;RISHON_LEZION-CMTSDV4,Cable7/0/4/U0;RISHON_LEZION-CMTSDV4,Cable7/0/4/U1;RISHON_LEZION-CMTSDV4,Cable7/0/4/U2;RISHON_LEZION-CMTSDV4,Cable7/0/5/U0;RISHON_LEZION-CMTSDV4,Cable7/0/5/U1;RISHON_LEZION-CMTSDV4,Cable7/0/5/U2;RISHON_LEZION-CMTSDV4,Cable7/0/7/U0;RISHON_LEZION-CMTSDV4,Cable7/0/7/U1;RISHON_LEZION-CMTSDV4,Cable7/0/7/U2;RISHON_LEZION-CMTSDV4,Cable7/0/9/U0;RISHON_LEZION-CMTSDV4,Cable7/0/9/U1;RISHON_LEZION-CMTSDV4,Cable7/0/9/U2' as hot_alertkey_pk
FROM dual)
由于某种原因,这导致正确分割字符串,最多为cable7/0/5/U0;
,然后停止。如果我从字符串的开头删除一个或多个部分(直到每个部分的分号),那么根据从开始移除的数量,我将它接收到下一个电缆。
为什么会这样?
提前致谢。
答案 0 :(得分:3)
如果在内部查询中将示例输入字符串包装在to_clob()
内,并将结果字符串包装在外部查询中的length()
内,则会发现结果为8127个字符。这回答了你的问题,但只是部分回答。
我不确定为什么replace
不会抛出错误,或者只是将结果截断为4000个字符。我得到了与在Oracle 11.2中完全相同的结果,结果在3503个字符后被删除。我只是快速查看了replace()
的Oracle文档,并没有说明如果输入是VARCHAR2但输出超过4000个字符应该是什么行为。它看起来好像执行了尽可能多的替换然后它停止了(下一个替换将超过4000个字符)。