C'est parce que --
fait partie de -->
séparateur mais pas une partie de ->
séparateur.
Même si la valeur de vos données a -->
cette requête ne doit pas générer d'erreur. Comme ci-dessous.
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
Le séparateur ci-dessus est -->
, notez l'espace blanc. Cet espace blanc est considéré comme faisant partie du séparateur, c'est-à-dire chr(1)||chr(45)||chr(45)||chr(62)||chr(1)
. Cette chaîne entière ne fait pas partie de vos données ou de la valeur de la colonne.
Où comme ci-dessous serait une erreur
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.
Le séparateur ci-dessus est -->
, notez qu'il n'y a pas d'espace blanc, c'est-à-dire chr(45)||chr(45)||chr(62)
. Cette chaîne entière fait en effet partie de vos données ou de la valeur de la colonne et donc de l'erreur.
Et voici une solution (performances non testées)
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
Explication - Ici (dans la requête ci-dessus) ->
(avec espace) ne fait pas partie des données ici, c'est-à-dire -->
. Une fois la colonne connectée par le chemin, le regexp_replace
remplace toutes les occurrences de ->
avec -->
donc de cette façon, vous obtenez toujours -->
comme séparateur au lieu de ->
.