Това е защото --
е част от -->
разделител, но не е част от ->
разделител.
Дори ако стойността на вашите данни има -->
тази заявка не трябва да има грешка. Като по-долу.
SQL> select Sys_Connect_By_Path('SomeText B-->More Text' || ':' || 'SomeText A-->More Text', ' --> ') "myNewVar"
from dual
connect by rownum<=3;
myNewVar
----------------------------------------------------
--> SomeText B-->More Text:SomeText A-->More Text
--> SomeText B-->More Text:SomeText A-->More Text --> SomeText B-->More Text:SomeText A-->More Text
--> SomeText B-->More Text:SomeText A-->More Text --> SomeText B-->More Text:SomeText A-->More Text --> SomeText B-->More Text:SomeText A-->More Text
Разделителят по-горе е -->
, забележете празното пространство. Този празен интервал се счита за част от разделителя, т.е. chr(1)||chr(45)||chr(45)||chr(62)||chr(1)
. Целият този низ не е част от вашите данни или стойност на колона.
Къде, както е по-долу, ще има грешка
SQL> select Sys_Connect_By_Path('SomeText B-->More Text' || ':' || 'SomeText A-->More Text', '-->') "myNewVar"
from dual
connect by rownum<=3;
ORA-30004: when using SYS_CONNECT_BY_PATH function, cannot have seperator as part of column value
30004. 00000 - "when using SYS_CONNECT_BY_PATH function, cannot have seperator as part of column value"
*Cause:
*Action: Use another seperator which does not occur in any column value,
then retry.
Разделителят по-горе е -->
, забележете, че няма празно пространство, т.е. chr(45)||chr(45)||chr(62)
. Целият този низ наистина е част от вашите данни или стойност на колона и оттук идва грешката.
И ето решение (производителност не е тествана)
select regexp_replace(Sys_Connect_By_Path('SomeText B-->More Text' || ':' || 'SomeText A-->More Text', ' -> '),' -> ','-->') "myNewVar"
from dual
connect by rownum<=3;
myNewVar
--------------------------------------
-->SomeText B-->More Text:SomeText A-->More Text
-->SomeText B-->More Text:SomeText A-->More Text-->SomeText B-->More Text:SomeText A-->More Text
-->SomeText B-->More Text:SomeText A-->More Text-->SomeText B-->More Text:SomeText A-->More Text-->SomeText B-->More Text:SomeText A-->More Text
Обяснение - Тук (в заявката по-горе) ->
(с интервал) не е част от данните тук, т.е. -->
. След като колоната е свързана по път, regexp_replace
замества всички срещания на ->
с -->
така че по този начин все още ще имате -->
като ваш разделител вместо ->
.