2012-08-08 47 views
5
使用 SYS_CONNECT_BY_PATH功能時

ORA-30004,不能有分隔符作爲列的一部分甲骨文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

它是 - >之前和之後的空白嗎? – hol 2012-08-08 19:08:12

+0

yes - 之前的程序員,我想嘗試添加空格 - > space – 2012-08-08 19:12:22

+0

是否有拼寫錯誤,而您的意思是「SomeText B - > More Text」而不是「SomeText B - More Text」?因爲那很明顯:前後空白不相等。 – hol 2012-08-08 20:02:29

回答

8

那是因爲---->分隔符的一部分,但不是->分隔符的一部分。

即使您的數據值有-->此查詢不應該錯誤。如下所示。

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-->取代->的所有出現,所以這樣您仍然可以使用-->作爲分隔符而不是->

+0

我聽到你的聲音,但是當我有 - 並且當我改變它的形式 - >到 - >它工作時,它會報錯。 – 2012-08-08 19:13:08

+0

那是因爲'--'是' - >'的一部分,但不是''的一部分 - >' – Annjawn 2012-08-08 19:14:22

+0

錯誤提示'當使用SYS_CONNECT_BY_PATH函數時,不能將分隔符作爲列值的一部分''您的分隔符' - > '具有'--',它是列值的一部分,其中' - >'不是列值的一部分。 – Annjawn 2012-08-08 19:16:22