2012-08-08 2 views
5

ORA-30004 wenn SYS_CONNECT_BY_PATH Funktion kann nicht seperator als Teil der Spalte habenOracle ORA-30004, wenn SYS_CONNECT_BY_PATH Funktion,

Aktion: eine andere seperator Verwenden, die in jeder Spalte Wert nicht auftritt, dann wiederholen.

Fehler auf:

select ... 
Sys_Connect_By_Path(myVariable || ':' || mySecondVariable, ' --> ') "myNewVar", 
... 

Works:

select ... 
Sys_Connect_By_Path(myVariable || ':' || mySecondVariable, ' -> ') "myNewVar", 
... 

In den Daten fanden wir einen Text wie diese

  • SomeText B--More Text
  • SomeText A--More Text

Da es keine '-->' ist oder für diesen mater ohne ‚-->‘ in den Daten, warum funktioniert den ersten Fehler entdeckt? Der zweite hat einen Platz vorne und am Ende.

+0

Ist es das Leerzeichen vor und nach dem ->? – hol

+0

ja - der vorherige Programmierer, ich denke, versuchte ein Leerzeichen hinzuzufügen -> Leerzeichen –

+0

Gibt es einen Tippfehler und du meintest 'SomeText B -> Mehr Text' anstatt 'SomeText B - Mehr Text'? Denn dann ist klar: Blank vor und nach ist nicht gleich. – hol

Antwort

8

Das ist, weil -- ist ein Teil von --> Separator, aber kein Teil von -> Separator.

Auch wenn Ihr Datenwert --> hat, sollte diese Abfrage keinen Fehler enthalten. Wie unten.

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 

Der obige Separator ist -->, beachten Sie die Leerzeichen. Dieser Leerraum wird als Teil des Separators angesehen, d. H. chr(1)||chr(45)||chr(45)||chr(62)||chr(1). Diese gesamte Zeichenfolge ist kein Teil Ihres Daten- oder Spaltenwerts.

Wo, wie unten

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. 

Der Separator obige Fehler würde --> ist, feststellen, gibt es keine Leer d.h. chr(45)||chr(45)||chr(62) ist. Diese ganze Zeichenfolge ist in der Tat ein Teil Ihres Daten- oder Spaltenwerts und daher der Fehler.

Und hier ist eine Lösung (Leistung un-geprüft)

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 

Erklärung - Hier (in der Abfrage oben) -> (mit Leerzeichen) ist nicht Teil der Daten hier heißt -->. Sobald die Spalte durch den Pfad verbunden ist, ersetzt die regexp_replace alle Vorkommen von -> durch -->, so dass Sie immer noch --> als Ihr Trennzeichen anstelle von -> haben.

+0

Ich höre dich aber es macht Fehler wenn ich das habe - und wenn ich es ändere form -> zu -> es funktioniert. –

+0

Das ist, weil '-' ist ein Teil von '->' aber kein Teil von '->' – Annjawn

+0

Der Fehler sagt '' bei der Verwendung von SYS_CONNECT_BY_PATH Funktion, kann nicht separator als Teil der Spalte Wert 'Ihr Trennzeichen '-> 'hat' - 'darauf, was ein Teil des Spaltenwerts ist, wobei' -> 'kein Teil des Spaltenwerts ist. – Annjawn