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.