Teradata 14, las funciones Oracle y los errores de juventud

Ya hemos hablado aquí de las nuevas funciones nativas de Teradata 14 (“Embedded Services System Functions”) y de cómo nos solucionan algunos problemas de forma sencilla e intuitiva. Muchas de ellas son simple y llanamente ‘clones’ de funciones Oracle, pero a veces ocurren cosas curiosas. Esto es lo que me pasó el otro día al intentar utilizar la archifamosa función TO_CHAR() en su versión Teradata.

Primero, los antecedentes: La función Oracle TO_CHAR() sirve para convertir números a cadenas y permite formatear la salida. Entre otras cosas, se puede indicar los caracteres a utilizar como separador de decimales y grupos para evitar los definidos por el sistema. Esto es muy común si el sistema tiene una configuración anglosajona -con el punto como separador decimal y la coma como separador de grupos- y queremos una representación ‘hispana’, que es justamente al revés. En situaciones como ésta podemos utilizar TO_CHAR() con el parámetro NLS_NUMERIC_CHARACTERS, donde le indicamos nuestras preferencias:

carlos@XE> SELECT * FROM V$VERSION;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
PL/SQL Release 11.2.0.2.0 - Production
CORE	11.2.0.2.0	Production
TNS for Linux: Version 11.2.0.2.0 - Production
NLSRTL Version 11.2.0.2.0 - Production

carlos@XE> SELECT TO_CHAR (1234.56, '999G990D00', 
   2 'NLS_NUMERIC_CHARACTERS='',.''') 
   3 FROM DUAL;

TO_CHAR(123
-----------
   1.234,56

carlos@XE>

OK.

Vamos ahora a Teradata. La documentación explica un uso exactamente igual que la original Oracle. Así que:

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT * FROM DBC.DBCINFO;

 *** Query completed. 3 rows found. 2 columns returned.
 *** Total elapsed time was 1 second.

InfoKey                        InfoData
------------------------------ ---------------------------------------------------------
LANGUAGE SUPPORT MODE          Standard
RELEASE                        14.00.02.05
VERSION                        14.00.02.05

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT TD_SYSFNLIB.TO_CHAR(1234.56,'9G999D99', 
       'NLS_NUMERIC_CHARACTERS='',.''');

 *** Failure 9134 Error in function TO_CHAR: parameter 3 is invalid.
                Statement# 1, Info =0
 *** Total elapsed time was 1 second.

¡Ahivá! ¿Un error? ¿Por qué? Pues resulta que no va a ser tan ‘exactamente igual’…

Después de probar y probar, me llevó un rato descubrir que Teradata espera un espacio en blanco adicional en la cadena del “NLS_PARAMS” a ambos lados del signo “igual” (=).

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT TD_SYSFNLIB.TO_CHAR(1234.56,'9G999D99', 
       'NLS_NUMERIC_CHARACTERS = '',.''');

 *** Query completed. One row found. One column returned.
 *** Total elapsed time was 1 second.

TO_CHAR(1234.56,'9G999D99','NLS_NUMERIC_CHARACTERS = '',.'''
------------------------------------------------------------
 1.234,56

Parece que esto es un ejempo más de lo que normalmente se llaman ‘errores de juventud’…

Saludos.

Carlos.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: