2011-06-01 17 views
8

actualmente intento ejecutar la siguiente consulta en una base de datos Oracle¿Por qué Oracle está comiendo mi cadena?

select tzname || ' (UTC'|| tz_offset(tzname) || ')' from v$timezone_names 

No parece ser muy complicada. Solo el nombre de la timzone y el desplazamiento UTC entre llaves. Pero cuando ejecuto la consulta con PL/SQL Developer en Windows siempre se come el último corsé.

Así que fui a sqlplus y lo ejecuté allí y ahora obtengo mi último refuerzo pero también un espacio en blanco adicional antes del último refuerzo como un regalo extra.

Lo he intentado con anidados to_char() y trim() pero nada cambia. También lo intenté en diferentes DB pero siempre es lo mismo.

¿Alguien sabe si hay un problema con tz_offset y la concatenación de cadenas?

+0

Parece que la has estado muriendo de hambre. Aliméntelo regularmente y no comerá cosas para las que no está destinado. –

+1

Reproducido en Oracle 11g. –

Respuesta

7

emitiendo la siguiente consulta:

select dump(tz_offset(tzname)) from v$timezone_names; 

Se obtienen resultados como los siguientes:

Typ=1 Len=7: 43,48,49,58,48,48,0 
Typ=1 Len=7: 43,48,49,58,48,48,0 
Typ=1 Len=7: 43,48,49,58,48,48,0 
Typ=1 Len=7: 43,48,49,58,48,48,0 
Typ=1 Len=7: 43,48,49,58,48,48,0 
Typ=1 Len=7: 43,48,49,58,48,48,0 
... 

Esto demuestra que tz_offset() devuelve cadenas terminadas en cero (tal vez un error). Así que para su consulta, Oracle está volviendo

"Africa/Algiers (UTC+01:00\0)" // Note \0 -> null character 
"Africa/Cairo (UTC+03:00\0)" // Note \0 -> null character 
... 

Teniendo esto en mente, supongo que PL/SQL Developer interpreta \ 0 en el final de la cadena (tal vez otro error, cadenas SQL no son de terminación nula) y así que no se molesta en escribir el resto de la cuerda, por lo que pierde la abrazadera posterior. SQL * PLus elige en su lugar imprimir un espacio en blanco en lugar de ese nulo y luego continúa con el resto de la cadena, imprimiendo el corchete de cierre. Como solución alternativa, puede reemplazar tz_offset(...) con replace(tz_offset(...), chr(0)). Esto eliminará los nulos de lo que tz_offset(...) devuelve.

+0

¡Gracias, muy buena explicación! – Marcel

+0

Parece un error específico del Desarrollador PL/SQL. Oracle SQL Developer muestra el \ 0 como un pequeño cuadrado y muestra los caracteres añadidos a la cadena. –

+0

@Jeffrey Kemp sí, pero creo que 'tz_offset()' no debería devolver cadenas terminadas en nulo en ningún caso. – gpeche

1

Funciona con subcadena, pero que en realidad no contesta su pregunta por qué está sucediendo :-):

seleccione tzname || '(UTC' || substr (tz_offset (tzname), 1,6) || ')' de v $ timezone_names;

0

estaba creando un recurso JSON ajax que devuelve las marcas de tiempo que necesitan para incluir la zona horaria de compensación ... que se arrastra carácter de control era muy molesto conmigo, del ajuste si fuera la siguiente manera:

REGEXP_REPLACE (TZ_OFFSET ('Canadá/Mountain '),' [[: cntrl:]] ',' ')

Cuestiones relacionadas