Đó là vì --
là một phần của -->
dấu phân tách nhưng không phải là một phần của -->
dấu phân cách.
Ngay cả khi giá trị dữ liệu của bạn có -->
truy vấn này sẽ không bị lỗi. Như bên dưới.
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
Dấu phân tách ở trên là -->
, chú ý khoảng trắng. Khoảng trắng này được coi là một phần của dấu phân cách, tức là chr(1)||chr(45)||chr(45)||chr(62)||chr(1)
. Toàn bộ chuỗi này không phải là một phần của dữ liệu hoặc giá trị cột của bạn.
Trường hợp như bên dưới sẽ xảy ra lỗi
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.
Dấu phân tách ở trên là -->
, lưu ý rằng không có khoảng trắng, tức là chr(45)||chr(45)||chr(62)
. Toàn bộ chuỗi này thực sự là một phần của dữ liệu hoặc giá trị cột của bạn và do đó có lỗi.
Và đây là một giải pháp (hiệu suất chưa được kiểm tra)
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
Giải thích - Đây (trong truy vấn ở trên) -->
(có khoảng trắng) không phải là một phần của dữ liệu ở đây, tức là -->
. Khi cột được hình nón bằng đường dẫn, regexp_replace
thay thế tất cả các lần xuất hiện của -->
với -->
vì vậy theo cách này, bạn vẫn có -->
làm dấu phân tách của bạn thay vì -->
.