Eso es porque --
es parte de -->
separador pero no es parte de ->
separador.
Incluso si su valor de datos tiene -->
esta consulta no debe dar error. Me gusta a continuación.
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
El separador de arriba es -->
, observe el espacio en blanco. Este espacio en blanco se considera parte del separador, es decir, chr(1)||chr(45)||chr(45)||chr(62)||chr(1)
. Esta cadena completa no es parte de sus datos o valor de columna.
Donde como a continuación sería un error
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.
El separador de arriba es -->
, observe que no hay espacios en blanco, es decir, chr(45)||chr(45)||chr(62)
. Esta cadena completa es, de hecho, parte de sus datos o valor de columna y, por lo tanto, el error.
Y aquí hay una solución (rendimiento no probado)
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
Explicación - Aquí (en la consulta anterior) ->
(con espacio) no es parte de los datos aquí, es decir, -->
. Una vez que la columna está conectada por la ruta regexp_replace
reemplaza todas las apariciones de ->
con -->
así que de esta manera todavía puedes tener -->
como su separador en lugar de ->
.