Warum isst Oracle meine Saite?

8

ich versuche derzeit, die folgende Abfrage auf einer Oracle DB

auszuführen %Vor%

Es scheint nicht sehr kompliziert zu sein. Nur der Name der Timzone und der UTC-Offset in geschweiften Klammern. Aber wenn ich die Abfrage mit PL / SQL Developer auf Windows ausführe, frisst es immer die letzte geschweifte Klammer.

Also bin ich zu sqlplus gegangen und habe es dort ausgeführt und jetzt bekomme ich meine letzte Klammer, aber auch einen zusätzlichen Whitespace vor der letzten geschweiften Klammer als Extra-Goody.

Ich habe es mit verschachtelten to_char() und trim() versucht, aber nichts ändert sich. Ich habe es auch auf verschiedenen DBs versucht, aber es ist immer das Gleiche.

Weiß jemand, ob es ein Problem mit tz_offset und String-Verkettung gibt?

    
Marcel 01.06.2011, 12:58
quelle

3 Antworten

7

Ausstellen der folgenden Abfrage:

%Vor%

Sie erhalten Ergebnisse wie diese:

%Vor%

Dies zeigt, dass tz_offset() nullterminierte Strings zurückgibt (möglicherweise ein Bug). Für Ihre Anfrage gibt Oracle also

zurück %Vor%

In Anbetracht dessen denke ich, dass PL / SQL-Entwickler \ 0 als Ende der Zeichenkette interpretiert (vielleicht ein anderer Fehler, SQL-Zeichenketten sind nicht null-terminiert) und es macht also keine Mühe, den Rest der Zeichenkette zu schreiben, So verlieren Sie die nachlaufende Klammer. SQL * PLus wählt stattdessen anstelle des Nullwerts ein Leerzeichen und fährt dann mit dem Rest der Zeichenfolge fort, wobei die schließende Klammer gedruckt wird.

Als Workaround können Sie tz_offset(...) durch replace(tz_offset(...), chr(0)) ersetzen. Dies löscht Nullen von allem, was tz_offset(...) zurückgibt.

    
gpeche 01.06.2011, 13:34
quelle
1

Es funktioniert mit Substring, aber das beantwortet nicht wirklich Ihre Frage, warum es passiert: -):

wähle tzname || '(UTC' || substr (tz_offset (tzname), 1,6) || ')' aus v $ timezone_names;

    
Shepherdess 01.06.2011 13:18
quelle
0

Ich habe eine JSON-Ajax-Ressource erstellt, die Zeitstempel zurückgibt, die den Zeitzonen-Offset enthalten müssen ... dass das nachfolgende Steuerzeichen mich wirklich nervte, trim ich aus wie folgt:

regexp_replace (tz_offset ('Kanada / Berg'), '[[::]:') '')

    
Rick0Shea 04.05.2016 00:24
quelle