ORA-30004
使用SYS_CONNECT_BY_PATH
函数时,不能将分隔符作为列的一部分
操作:使用另一个在任何列中都没有出现的分隔符 价值,然后重试。
错误:
select ...
Sys_Connect_By_Path(myVariable || ':' || mySecondVariable, ' --> ') "myNewVar",
...
使用:
select ...
Sys_Connect_By_Path(myVariable || ':' || mySecondVariable, ' -> ') "myNewVar",
...
在数据中,我们发现了一些像这样的文本
SomeText B--More Text
SomeText A--More Text
由于数据中没有'-->'
或者没有'-->
',为什么第一个错误?第二个在前面和后面都有一个空间。
答案 0 :(得分:9)
这是因为--
是-->
分隔符的一部分,但不是->
分隔符的一部分。
即使您的数据值为-->
,此查询也不应出错。如下所示。
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
会将->
的所有出现替换为-->
,这样您仍然可以使用-->
作为分隔符,而不是->
}。