To proto, že --
je součástí -->
oddělovač, ale ne část ->
oddělovač.
I když má vaše datová hodnota -->
tento dotaz by neměl být chybný. Jako níže.
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
Oddělovač výše je -->
, všimněte si mezer. Tento prázdný znak je považován za součást oddělovače, tj. chr(1)||chr(45)||chr(45)||chr(62)||chr(1)
. Celý tento řetězec není součástí vašich dat nebo hodnoty sloupce.
Kde jako níže by došlo k chybě
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.
Oddělovač výše je -->
, všimněte si, že zde nejsou žádné mezery, tj. chr(45)||chr(45)||chr(62)
. Celý tento řetězec je skutečně součástí vašich dat nebo hodnoty sloupce, a proto došlo k chybě.
A zde je řešení (výkon netestován)
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
Vysvětlení – Zde (v dotazu výše) ->
(s mezerou) zde není součástí dat, tj. -->
. Jakmile je sloupec propojen cestou regexp_replace
nahradí všechny výskyty ->
s -->
takže tímto způsobem stále budete mít -->
jako oddělovač namísto ->
.